我不总是有方形/矩形图像,有时我也应该匹配圆形图像。以下是2张图片。 Ball是模板图像,第二个是应该搜索模板的Source。我可以使模板的背景透明,但这会产生错误,使得白色会降低匹配分数,因为正如您在源图像上看到的那样,球周围没有白色。这些只是2个例子。你有建议/解决方案吗?
答案 0 :(得分:2)
我认为您也可以使用直方图反投影。在那里你也可以使用任意形状的面具。使用反投影图像卷积蒙版,您将在图像中检测到对象出现的区域中的峰值,如下图中的图像(颜色映射和缩放)所示。
背投影:
卷积:
编辑:
这是基于此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()
并获得出色的效果:
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)
并使用图像行上的多线程优化它