由于某些原因,下面的代码无法正常工作。我有两个640*480的图像,它们非常相似但不完全相同(至少有几百/几千个像素应该是不同的)。
这是我如何比较它们并计算不同像素:
unsigned char* row;
unsigned char* row2;
int count = 0;
// this happens in a loop
// fIplImageHeader is current image
// lastFIplImageHeader is image from previous iteration
if ( NULL != lastFIplImageHeader->imageData ) {
for( int y = 0; y < fIplImageHeader->height; y++ )
{
row = &CV_IMAGE_ELEM( fIplImageHeader, unsigned char, y, 0 );
row2 = &CV_IMAGE_ELEM( lastFIplImageHeader, unsigned char, y, 0 );
for( int x = 0; x < fIplImageHeader->width*fIplImageHeader->nChannels; x += fIplImageHeader->nChannels )
{
if(row[x] != row2[x] || row[x+1] != row2[x+1] || row[x+2] != row2[x+2])
count++;
}
}
}
}
现在我得到的数字是3626,看起来好像没问题。
但是,我尝试在MS Paint中打开其中一张图片,并用粗红线划了一遍,这应该会显著增加不同像素的数量。然而,我又得到了相同的数字:3626。
很明显我在这里做错了些什么。
我正在一个循环中比较这些图片。
这行代码在循环之前:
IplImage* lastFIplImageHeader = cvCreateImageHeader(cvSize(640, 480), 8, 3);
然后在循环内部,我会像这样加载图片:
IplImage* fIplImageHeader = cvLoadImage( filePath.c_str() );
// here I compare the pixels (the first code snippet)
lastFIplImageHeader->imageData = fIplImageHeader->imageData;
所以,lastFIplImageHeader存储的是上一次迭代中的图像,而fIplImageHeader则存储当前图像。