c++ - 使用opencv循环像素

标签 c++ loops opencv pixel

我如何能够使用 opencv 循环浏览图像,就好像它是一个二维数组来获取每个像素的 rgb 值一样?此外,对于此操作,mat 是否比 iplimage 更可取?

最佳答案

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 分别获取每个 channel 。有关示例链接,请参见 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;

更新:使用 split 获取 3 个 channel

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 示例复制和粘贴时引入的错误。

关于c++ - 使用opencv循环像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4504687/

相关文章:

Linux 上的 C++ 动态共享库

c++ - 为什么一元运算符返回的类型与其操作数不同?

C++ OpenMP : Writing to a matrix inside of for loop slows down the for loop significantly

SQL,如何使用每个日期列表作为过程的参数来循环?

python - 如何在视频上叠加

c++ - 使用列主要 Matlab 样式的数据布局将图像读入 C++?

c++ - 为什么找不到这些符号?

PostgreSQL 循环通知

Python - 同时遍历 2 个列表

java - 使用 JavaFX 访问网络摄像头