使用opencv循环显示像素

我如何能够使用opencv循环访问一个图像,就好像它是一个二维数组,以获得每个像素的rgb值? 另外,对于这个操作,在iplimage上最好使用垫子吗?


如果您使用C ++,请使用opencv的C ++接口,然后您可以通过http://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#the-efficient-way访问成员或使用例如,cv :: Mat :: at()。


cv::Mat优于IplImage因为它简化了你的代码

cv::Mat img = cv::imread("lenna.png");
for(int i=0; i<img.rows; i++)
    for(int j=0; j<img.cols; j++) 
        // You can now access the pixel value with cv::Vec3b
        std::cout << img.at<cv::Vec3b>(i,j)[0] << " " << img.at<cv::Vec3b>(i,j)[1] << " " << img.at<cv::Vec3b>(i,j)[2] << std::endl;

这假定您需要一起使用RGB值。 如果你不这样做,你可以使用cv :: split来分别获取每个通道。 请参阅etarion与示例链接的答案。

另外,在我的情况下,你只需要灰度图像。 然后,您可以以灰度加载图像并以uchar数组的形式访问它。

cv::Mat img = cv::imread("lenna.png",0);
for(int i=0; i<img.rows; i++)
    for(int j=0; j<img.cols; j++)
        std::cout << img.at<uchar>(i,j) << std::endl;

更新 :使用拆分获得3个频道

cv::Mat img = cv::imread("lenna.png");
std::vector<cv::Mat> three_channels = cv::split(img);

// Now I can access each channel separately
for(int i=0; i<img.rows; i++)
    for(int j=0; j<img.cols; j++)
        std::cout << three_channels[0].at<uchar>(i,j) << " " << three_channels[1].at<uchar>(i,j) << " " << three_channels[2].at<uchar>(i,j) << std::endl;

// Similarly for the other two channels

更新:感谢entarion发现从cv :: Vec3b示例复制和粘贴时引入的错误。


自OpenCV 3.0以来,在cv :: Mat中的像素上运行函数的方法有官方和最快的方法。

void cv :: Mat :: forEach(const Functor&operation)

如果使用此功能,操作将自动在多核上运行。

披露:我是这个功能的贡献者。

链接地址: http://www.djcxy.com/p/89809.html

上一篇: Cycle through pixels with opencv

下一篇: Compare intensity pixel value Vec3b in OpenCV