2

我在尝试找出如何在 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;
}

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

链接到示例

感谢您的帮助

4

2 回答 2

4

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

我替换j * img.colsj * img.cols * 3

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 行人数据集):

原图

使用 OP 代码的结果:

OP的代码

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

新代码

于 2012-09-18T06:51:49.977 回答
1

在您的循环中,您可以执行以下操作:

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

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

于 2012-09-17T18:01:22.837 回答