OpenCV 2.x 中的像素访问错误

Posted

技术标签:

【中文标题】OpenCV 2.x 中的像素访问错误【英文标题】:Bug with pixel access in OpenCV 2.x 【发布时间】:2012-09-17 16:42:03 【问题描述】:

我在尝试找出如何在 OpenCV 的新版本 (2.x) 中访问 rgb 像素时遇到了麻烦。我尝试混合使用新旧方法,但没有成功。

这是我的代码

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace cv;
using namespace std;

int main (int argc, char* argv[])

Mat img;


string winMain = "Main";

img = imread(argv[1]);

for (int j = 0; j < img.rows; j++)

    for (int i = 0; i < img.cols; i++)
    
        img.data[j * img.cols + i * 3 + 0] = (uchar)0; //B
        //img.data[j * img.cols + i + 1] = (uchar)0; //G
        //img.data[j * img.cols + i + 2] = (uchar)0; //R
    


namedWindow(winMain);

imshow(winMain, img);

waitKey();  

return 1;

您可以在以下示例中注意到,仅修改了图像的三分之一。

Link to example

感谢您的帮助

【问题讨论】:

【参考方案1】:

我测试了您的代码,发现了错误。您将 列索引 乘以 3 (i * 3),但还需要将 行索引 乘以 3 (j * img.cols * 3)。

我用j * img.cols * 3替换了j * img.cols

for (int j = 0; j < img.rows; j++)

    for (int i = 0; i < img.cols; i++)
    
        img.data[j * img.cols * 3 + i*3 + 0] = (uchar)0; //B
        //img.data[j * img.cols * 3 + i*3 + 1] = (uchar)0; //G
        //img.data[j * img.cols * 3 + i*3 + 2] = (uchar)0; //R
    

让我们尝试一个例子。

示例图片(来自MIT pedestrian dataset):

使用 OP 代码的结果:

使用修改后的代码的结果(带有j * img.cols * 3):

【讨论】:

你是对的,我错误地认为 OP 只是在寻找访问像素的任何方法。你的回答更合适。 很明显。我知道代码没有优化,但它可以工作。谢谢!【参考方案2】:

在你的循环中,你可以这样做:

img.at<Vec3b>(j,i)[0] = 0;    // Blue Channel
img.at<Vec3b>(j,i)[1] = 0;    // Green Channel
img.at<Vec3b>(j,i)[2] = 0;    // Red Channel

这是你想要的还是我理解错了?

【讨论】:

这行得通。 (我对其进行了测试并确认。)有人说at() 运算符比使用直接像素访问(例如img[index])要慢。我很想看到一项比较 img.at()img[] 开销的实证研究。

以上是关于OpenCV 2.x 中的像素访问错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 无法访问 Mat 中的所有像素

OpenCV 访问 MAT 对象中的 RGB 值

opencv 访问图像像素的三种方式

C++ OpenCV Mat 像素值和 OpenCV 错误

OpenCV2.1,地图功能?访问每个像素?

【OPENCV】cv::Mat像素遍历方法比较