这里有很多问题可以检查两个图像是否“几乎”相似。
我的任务很简单。使用 OpenCV,我想确定两个图像是否 100% 相同。
它们的大小相同,但可以使用不同的文件名保存。
我尝试使用countNonZero()函数进行水平投影,如下所示.
Mat src = imread(INPUT_FILE, CV_LOAD_IMAGE_COLOR);
Mat binaryImage = src.clone();
cvtColor(src, src, CV_BGR2GRAY);
Mat horizontal = Mat::zeros(1,binaryImage.cols, CV_8UC1);
for (int i = 0; i<binaryImage.cols; i++)
{
Mat roi = binaryImage(Rect(0, 0, 1, binaryImage.rows));
horizontal.at<int>(0,i) = countNonZero(roi);
cout << "Col no:" << i << " >>" << horizontal.at<int>(0, i);
}
Run Code Online (Sandbox Code Playgroud)
但是在调用countonZero()函数时出现错误.错误如下.
OpenCV Error: Assertion failed (src.channels() == 1 && func != 0) in cv::countNo
nZero, file C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\st
at.cpp, line 549
Run Code Online (Sandbox Code Playgroud)
有人可以指出错误吗?
我有2个cv :: Mat数组(大小相同),当我想比较它们(如果相同)时,我使用了cv :: compare
cv::compare(mat1,mat2,dst,cv::CMP_EQ);
Run Code Online (Sandbox Code Playgroud)
有没有返回true/false的函数?
出于某种原因,下面的代码不起作用.我有两个非常相似但不相同的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] …
Run Code Online (Sandbox Code Playgroud)