我正在使用 OpenCV/EmguCV 来执行一个简单的匹配过程。我有两个图像,img1 和 img2,我列举了 img1 的平移和旋转,并与 img2 匹配以找到最佳匹配差异。
这是代码
for (int dx = -img2.Width / 2; dx <= img1.Width - img2.Width / 2; dx++)
for (int dy = -img2.Height / 2; dy <= img1.Height - img2.Height / 2; dy++)
for (float r = 0; r < 2 * Math.PI; r += 0.1f)
{
var img2r = img2.Rotate(r, new Gray(0));
img1.ROI = new Rectangle(Math.Max(0, dx), Math.Max(0, dy),
(Math.Min(dx + img2r.Width, img1.Width) - Math.Max(dx, 0)),
(Math.Min(dy + img2r.Height, img2.Height) - Math.Max(dy, 0))
);
img2.ROI = new Rectangle(Math.Max(0, -dx), Math.Max(0, -dy),
(Math.Min(dx + img2r.Width, img1.Width) - Math.Max(dx, 0)),
(Math.Min(dy + img2r.Height, img2.Height) - Math.Max(dy, 0))
);
var diff = img1.AbsDiff(img2);
var avg = diff.GetAverage();
img1.ROI = new Rectangle();
img2.ROI = new Rectangle();
}
所以我的问题是
1)出于效率考虑,我们是否有内置函数来执行此操作?
2)如何执行这种匹配的“亚像素”级别?
3) 我们可以利用 fft 通过转换到频域来加速匹配到 O(nlogn) 吗?
笔记
cvMatchShape() 不会成功,因为我正在做天真的匹配。这两个图像非常相似。