1

我正在使用 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() 不会成功,因为我正在做天真的匹配。这两个图像非常相似。

4

0 回答 0