1

我是计算机视觉的初学者。我目前正在开发一个项目,以在 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);`
4

1 回答 1

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 输出,尽管对结果进行归一化或阈值化几乎没有价值。

于 2015-05-14T04:52:49.450 回答