使用 Matiterator 替代像素访问
这不是迭代像素的最佳方式; 但是,它比 cv::Mat::at <T>更好。
假设你的文件夹中有一个彩色图像,你想迭代这个图像的每个像素并擦除绿色和红色通道(注意,这是一个例子,你可以用更优化的方式做到这一点);
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char **argv)
{
// Create a container
cv::Mat im;
//Create a vector
cv::Vec3b *vec;
// Create an mat iterator
cv::MatIterator_<cv::Vec3b> it;
// Read the image in color format
im = cv::imread("orig1.jpg", 1);
// iterate through each pixel
for(it = im.begin<cv::Vec3b>(); it != im.end<cv::Vec3b>(); ++it)
{
// Erase the green and red channels
(*it)[1] = 0;
(*it)[2] = 0;
}
// Create a new window
cv::namedWindow("Resulting Image");
// Show the image
cv::imshow("Resulting Image", im);
// Wait for a key
cv::waitKey(0);
return 0;
}
要用 Cmake 编译它:
cmake_minimum_required(VERSION 2.8)
project(Main)
find_package(OpenCV REQUIRED)
add_executable(Main main.cpp)
target_link_libraries(Main ${OpenCV_LIBS})
原始图片: http://i.stack.imgur.com/sIsMF.jpg
处理后的图片:
请注意,我们不会只触摸蓝色通道。
有关更多信息,请访问: http : //docs.opencv.org/2.4/opencv_tutorials.pdf 页面:145