I\'m using OpenCV to iterate through an image and find the colour of each pixel, here\'s some of the code I\'m using:
IplImage* img = cvLoadImage(\"c:\\\\tes
I don't understand why you are accessing pixel data blindly (by 1D index) while you already know the image dimension (proved by the usage of IplImage::height
and IplImage::width
) and opencv does provide function to access pixel value (cvGet*D
).
You are getting odd values in the direct pointer access because you did not factor in the byte padding performed by OpenCV. You may find in 8 bit images, (width*nChannels <= widthStep) for this reason.
A quick revised code can be as follow:
IplImage* img = cvLoadImage("c:\\test.png");
for(int iRow=0; iRow<img->height; ++iRow)
{
for(int iCol=0; iCol<img->width; ++iCol)
{
CvScalar pixelVal = cvGet2D( img, iRow, iCol);
unsigned char red = pixelVal.val[2];
unsigned char green = pixelVal.val[1];
unsigned char blue = pixelVal.val[0];
outputRGBValues(red, green, blue);
if (red == REDCOLOUR && green == GREENCOLOUR && blue == BLUECOLOUR)
{
count++;
}
}
}
cvReleaseImage(&img);
Also, note that usually OpenCV arrange data in BGR format, which can verified at IplImage::channelSeq
. Do not confused by IplImage::colorModel
, which tells the color model.
I'll go with Paul R suggestion that you should find a reference and understand the library before attempting to use them.
I've never used OpenCV, but I would imagine that cvCreateImage
doesn't initialise the contents of the image, and certainly not to anything meaningful.
Try this:
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);
Quite some issues here: