Java中圆形图像的OpenCV模板匹配

时间:2014-11-06 16:14:47

标签: java image opencv image-processing template-matching

我不总是有方形/矩形图像,有时我也应该匹配圆形图像。以下是2张图片。 Ball是模板图像,第二个是应该搜索模板的Source。我可以使模板的背景透明,但这会产生错误,使得白色会降低匹配分数,因为正如您在源图像上看到的那样,球周围没有白色。这些只是2个例子。你有建议/解决方案吗?

Template image to be searched

Source image

3 个答案:

答案 0 :(得分:2)

我认为您也可以使用直方图反投影。在那里你也可以使用任意形状的面具。使用反投影图像卷积蒙版,您将在图像中检测到对象出现的区域中的峰值,如下图中的图像(颜色映射和缩放)所示。

背投影:

enter image description here

卷积:

enter image description here

编辑:

这是基于此paper。我正在试验它,并希望在博客上发帖。 这是用C ++编写的。

// model histogram: this is the football template
calcHist(&model32fc3, 1, (const int*)channels, modelMask, histModel, 3, (const int*)histSize, (const float**)ranges, true, false);
// image histogram
calcHist(&image32fc3, 1, (const int*)channels, Mat(), histImage, 3, (const int*)histSize, (const float**)ranges, true, false);
// ratio histogram
divide(histModel, histImage, histRatio);
cv::min(histRatio, 1.0, histRatio);
// backproject ratio histogram
calcBackProject(&image32fc3, 1, (const int*)channels, histRatio, backprj, (const float**)ranges);
// convolve the kernel with the backprojected image
filter2D(backprj, conv, CV_32F, modelMask);

答案 1 :(得分:1)

没关系,您仍然可以使用matchTemplate()并获得出色的效果:

enter image description here

You can find a decent tutorial on OpenCV's documentation。顺便说一句,这是在那里共享的演示的输出。

答案 2 :(得分:0)

如果您知道属于模板的像素,则可以编写匹配器

绝对差异总和试验(伪代码)

Mat I, T // image and template
vector<Point> template_pixels
Rect sliding_window
vector<double> match_rates

for all rows in image
update sliding_window
    for all cols in image
    update sliding_window
    Mat W = I(sliding_window)
    sum = 0
         for all rows in template
              for all cols in template
              if(template_pixels contains pixel i)
                   sum += abs(W(i) - T(i))
              end for
         end for
    match_rates.pushback(sum)
    end for
end for

minMaxLoc(match_rates)

并使用图像行上的多线程优化它