我是计算机视觉的初学者。我目前正在开发一个项目,在iOS中使用matchTemplate找到两个图像之间的匹配。我面临的问题是找到一种方法来确定两个图像是否匹配或虽然matchTemplate工作得很好。我想考虑结果矩阵的百分比,但我不知道怎样也找不到方法。而且MinMaxLoc也不适用于我。 如果有人可以帮助我或给我一个想法,我真的很感激它,因为我现在处于绝望的境地。 这是代码: `
UIImage * image1 = [UIImage imageNamed:@" 1.png"]; UIImage * image2 = [UIImage imageNamed:@" Image002.png"];
// Convert UIImage* to cv::Mat
UIImageToMat(image1, MatImage1);
UIImageToMat(image2, MatImage2);
MatImage1.resize(100 , 180);
MatImage2.resize(100 , 180);
if (!MatImage1.empty())
{
// Convert the image to grayscale
//we can also use BGRA2GRAY : Blue , Green , Red and Alpha(Opacity)
cv::cvtColor(MatImage1, grayImage1, cv::COLOR_BGRA2GRAY );
cv::cvtColor(MatImage2, grayImage2, cv::COLOR_BGRA2GRAY);
}
/// Create the result matrix
int result_cols = grayImage1.cols ;
int result_rows = grayImage1.rows ;
result.create( result_cols, result_rows, CV_32FC1 );
/// Do the Matching and Normalize
matchTemplate( grayImage1 , grayImage2 , result , CV_TM_SQDIFF_NORMED);
//Normalize
normalize( result, result, 0, 100, cv::NORM_MINMAX, -1 );
//Threshold
cv::threshold(result , result , 30, 0, CV_THRESH_TOZERO);`
答案 0 :(得分:0)
matchTemplate(...)
的意图是模板通常小于图像。然后将模板作为滑动窗口和匹配分数在图像上移动。以某种方式计算,例如使用互相关或平方差。
因此,如果输入图像为10x10且模板为3x3,则模板的位置使左上角位于图像的左上角(模板中心位于像素(1,1)处,假设我们从0)索引。计算匹配分数,然后模板滑动到(1,2),我们再次匹配。当模板的中间像素位于(8,1)时,我们将其向下滑动到下一行(1,2)并重复。
此过程的输出结果是8x8矩阵,其中每个位置的值表示模板在该点时的匹配分数。输出图像的大小为W-w + 1 x H-h + 1,其中WxH是图像的大小,wxh是模板的大小。
然后您可以使用minMaxLoc计算出输出矩阵中的最高和最低分数,并且根据您使用的匹配分数,其中一个最有可能匹配图像中的模板。
现在您要将模板和图像的大小调整为相同的大小:
MatImage1.resize(100 , 180);
MatImage2.resize(100 , 180);
这意味着模板中只有一个位置可以位于图像中,输出矩阵应该是1x1网格。
您还在使用
CV_TM_SQDIFF_NORMED
这是归一化的平方差。对于此分数,较低的匹配分数更好。即,1x1输出矩阵中的值越接近0,模板与图像之间的匹配就越接近。
鉴于模板和图像的大小均为100x180,那么您可以轻松计算出此匹配分数可以具有的最大值100x180x255,如果整个图像为黑色且模板为白色,则可以获得最大值,反之亦然。这应该可以帮助您计算出一个合理的阈值,您可以说t =您的模板与图像匹配。
由于您只有1x1输出,但在归一化或阈值化结果方面没什么价值。