我在查找如何在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;
}
正如您在下面的示例中所注意到的,只有三分之一的图像被修改。
感谢您的帮助
答案 0 :(得分:4)
我测试了你的代码,我发现了这个bug。您将列索引乘以3(i * 3
),但还需要将行索引乘以3(j * img.cols * 3
)。
我将j * img.cols
替换为j * 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 pedestrian dataset):
使用OP代码的结果:
结果使用修订后的代码(j * img.cols * 3
):
答案 1 :(得分: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
这是你想要的还是我理解不正确的?