【发布时间】:2010-12-28 23:53:43
【问题描述】:
由于某种原因,下面的代码不起作用。我有两张 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 存储的是当前图像。
【问题讨论】: