使用 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

处理后的图片: StackOverflow 文档

请注意,我们不会只触摸蓝色通道。

有关更多信息,请访问: http//docs.opencv.org/2.4/opencv_tutorials.pdf 页面:145