在某些情况下,我们需要用一个已知的物体,在一个场景内进行匹配,比如有一张身份证,然后想要在桌子上找到他的位置。比如以下两张图片:
身份证图片:
桌子图片:
(什么?没有桌子?哦,不要在意这些细节问题,嗯。)
如果想要从其中桌子图片找到身份证图片的话,我们可以使用 OpenCV 的 ORB特征检测器(SIFT和SURF已获得专利,如果要在实际应用中使用它,则需要支付许可费,而 ORB 速度和性能也不差)。
ORB 的意义
ORB代表“定向FAST”和“旋转简报”。让我们看看FAST和Brief的含义。
特征点检测器分为两部分
定位器:标识图像上在图像转换(例如平移(移位),缩放(大小增加/减小)和旋转)下稳定的点。定位器找到这些点的x,y坐标。ORB检测器使用的定位器称为FAST。
描述符:上一步中的定位器仅告诉我们有趣的地方在哪里。特征检测器的第二部分是描述符,该描述符对点的外观进行编码,以便我们可以区分一个特征点。在特征点评估的描述符只是一个数字数组。理想情况下,两个图像中的相同物理点应具有相同的描述符。ORB使用称为BRISK的功能描述符的修改版本。
1 | 节选自 https://www.learnopencv.com/image-alignment-feature-based-using-opencv-c-python/ |
寻找关键点
1 | // Variables to store keypoints and descriptors |
关键点匹配图:
寻找目标
通过匹配特征点寻找目标
1 | // Extract location of good matches |
目标查找图:
通过结果可以发现,已经能够桌子上找到身份证了。
从代码可以看到:perspectiveTransform(obj_corners, scene_corners, h);
可以为我们得到目标的四个顶点坐标,剩下的事情,你知道怎么做的了吧。
参考资料
以上内容基本上参考自文章:https://www.learnopencv.com/image-alignment-feature-based-using-opencv-c-python/ 作者是:萨蒂亚·马利克(SATYA MALLICK)