在上次的笔记《OpenCV4学习笔记(40)》中,整理记录了关于ORB特征提取描述算法的一些使用方式,而今天正是要基于ORB算法来实现对图像中已知目标的检测。
实现步骤如下:
1、使用ORB特征提取描述算法来分别计算检测目标的模板图像和包含目标的待检测图像的特征描述子,要注意这一步骤非常重要,会影响到后续最佳匹配特征点对的获取;
2、通过暴力匹配算法来比对模板图像和待检测图像的特征描述子,并将两幅图像中的对应匹配的特征点对关联起来;
3、寻找对应特征点对中匹配程度比较高的那一部分点对,也就是我们所需要的最佳匹配特征点对;
4、利用最佳匹配特征点对中分别属于模板图像和待检测图像的两部分点集,来求取两部分点集之间的映射关系,也就是求取最佳匹配特征点坐标从模板图像变换到待检测图像时的变换矩阵;
5、将模板图像的四个边框点坐标,利用上面求得的变换矩阵,变换到待检测图像中的点坐标,这四个点连接起来所包围的区域就是目标存在于待检测图像中的区域。从而实现对已知目标的检测。
在第4步骤中,我们需要使用Mat H = findHomography()
来获取两个平面坐标之间的变换矩阵,这个API在图像透视变换中也曾经使用过,其参数含义如下:
(1)参数srcPoints:原平面的坐标矩阵;
(2)参数dstPoints:目标平面的坐标矩阵;
(3)参数method:计算变换矩阵的方式,有以下几种可选方式:
默认方式: 0 - 利用所有点的常规方法
RANSAC - 基于RANSAC的鲁棒算法(常用)
LMEDS - 最小中值鲁棒算法
RHO - 基于PROSAC的鲁棒算法(常用)
(4)后续几个参数都是RANSAC和RHO两种方式的计算参数,直接设置为默认值即可;
(5)参数confidence:置信度,默认值0.99即可。
在第5步骤中,进行两个平面、也就是从模板图像的矩形顶点坐标映射到待检测图像中的检测框顶点坐标时,需要使用perspectiveTransform()
这个API来实现,也就是进行透视变换,其参数含义为:
(1)参数src:输入的原平面坐标
(2)参数dst:输出的目标平面坐标
(3)参数m:两个平面坐标之间的变换矩阵,也就是上面得到的矩阵H。
下面看一下具体的代码演示:
//读取模板图像和待检测图像
Mat tem = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\tem.jpg");
resize(tem, tem, Size(160,120));
Mat test = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\miao.jpeg");
resize(test, test, Size(600, 800));
//分别对模板图像和待检测图像进行特征点提取和描述
auto orb = ORB::create(500, 1.01, 20, 31, 0, 2, ORB::HARRIS_SCORE, 31, 20);
vector<KeyPoint> keyPoints_tem, keyPoints_test;
Mat descriptors_tem