我正在使用OpenCV迭代图像并找到每个像素的颜色,这里是我正在使用的一些代码:
IplImage* img = cvLoadImage("c:\\test.png");
int pixels = img->height * img->width;
int channels = img->nChannels;
for (int i = 0; i < pixels*channels; i+= channels)
{
unsigned char red = img->imageData[i + 2];
unsigned char green = img->imageData[i + 1];
unsigned char blue = img->imageData[i];
outputRGBValues(red, green, blue);
if (red == REDCOLOUR && green == GREENCOLOUR && blue == BLUECOLOUR)
{
count++;
}
}
cvReleaseImage(&img);
当我运行它时,outputRGBValues输出负值.最常见的是R,G,B = -1,但偶尔还有其他负数和少数正数.我听说过未初始化的内存内容,以及没有正确分配给内存的像素.但我真的不明白它,绝对不知道如何解决它.我做错了什么,我该如何解决?
UPDATE
在使用fschmitt的更改修复代码(如上所述)后,我更接近了. This是我正在使用的图像,如果有任何帮助的话.很难看,但它只是一个5 * 3’V’的黑色像素,底部有一个绿色像素.
运行代码,我得到这个输出:
0 0 0
255 255 255
255 255 255
255 255 255
0 0 0
255 255 186
0 0 255
255 255 0
And it continues
前5行很好,正是它们应该是什么.这是图像的第一行.下一行,第6行以后是错误的.它应该是:
255 255 255
255 255 255
0 0 0
我不确定是什么原因引起的.它如何适用于顶线而不是第二线?是否存在某种不匹配的问题,并且它的价值在左边的位置有一点?
解决方法:
试试这个:
IplImage* img = cvLoadImage("c:\\test.png");
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j += img->nChannels)
{
unsigned char red = img->imageData[i * img->widthStep + j + 2];
unsigned char green = img->imageData[i * img->widthStep + j + 1];
unsigned char blue = img->imageData[i * img->widthStep + j];
outputRGBValues(red, green, blue);
if (red == REDCOLOUR && green == GREENCOLOUR && blue == BLUECOLOUR)
{
count++;
}
}
}
cvReleaseImage(&img);