OpenCV4.4 中SIFT特征匹配调用演示


点击上方AI算法与图像处理”,选择加"星标"或“置顶”算法

重磅干货,第一时间送达微信

来源 OpenCV学堂app

你们好,据说OpenCV4.4 已经把SIFT跟SURF特征提取又从新get回来了,能够不须要编译OpenCV源码,直接下载官方预编译版本的就能够直接使用了。若是你还不知道SIFT特征是什么,就看这里的这篇文章就好啦。
函数

OpenCV SIFT特征算法详解与使用
flex

01ui

建立SIFT特征提取器spa

下面就来验证一下是否真的能够了,请看步骤与过程,首先建立SIFT特征提取器,实现特征点跟描述子的提取,代码实现以下:.net

// 建立SIFT特征提取
auto detector = SIFT::create();
vector<KeyPoint> keypoints_obj, keypoints_sence;
Mat descriptors_box, descriptors_sence;
detector->detectAndCompute(box, Mat(), keypoints_obj, descriptors_box);
detector->detectAndCompute(scene, Mat(), keypoints_sence, descriptors_sence);
std::cout << "box keypoints:" << keypoints_obj.size() << std::endl;
std::cout << "scene keypoints:" << keypoints_sence.size() << std::endl;

运行打印出来的关键点数目分别以下:
3d

02code

特征描述子匹配

从图像到特征,是特征提取关键操做,特征描述子本质上是一系列的向量数据,它能够惟一表示一张图像。对类似的特征进行区域匹配或者搜索,找到高度类似数据特征片断是特征匹配的主要工做。OpenCV中支持两种特征匹配方法,分别是暴力匹配与FLANN匹配,对浮点数的特征描述子,FLANN匹配比暴力会明显加快运算,建立FLANN实现匹配,并根据类似度排序,寻找最佳匹配得的代码以下:

// 初始化flann匹配
vector<DMatch> matches;
Ptr<FlannBasedMatcher> matcher = FlannBasedMatcher::create();
matcher->match(descriptors_box, descriptors_sence, matches);

// 发现高质量匹配
std::cout << "total matches:" << matches.size() <<std::endl;
int numOfGood = matches.size() * 0.15;
std::sort(matches.begin(), matches.end());
matches.erase(matches.begin() + numOfGood, matches.end());
std::cout << "good matches:" << matches.size() << std::endl;

Mat dst;
drawMatches(box, keypoints_obj, scene, keypoints_sence, matches, dst);
imshow("output", dst);
imwrite("D:/matches.png", dst);


运行结果以下:

03

单应性矩阵求解与透视变换

对获得的最佳匹配描述子对,取得对应的图像关键点坐标,完成单应性矩阵求解,实现透视变换,是重要的一步,关于单应性矩阵的求解与应用,建议看公众号以前的几篇相关文章便可:

OpenCV单应性矩阵发现参数估算方法详解

单应性矩阵应用-基于特征的图像拼接

利用单应性矩阵实现文档对齐显示


这里再也不赘述,这部分的代码实现以下:

// 抽取匹配描述子对应的关键点
std::vector<Point2f> obj_pts;
std::vector<Point2f> scene_pts;
for (size_t i = 0; i < matches.size(); i++)
{
    obj_pts.push_back(keypoints_obj[matches[i].queryIdx].pt);
    scene_pts.push_back(keypoints_sence[matches[i].trainIdx].pt);
}

// 对象对齐与单应性矩阵求解
Mat H = findHomography(obj_pts, scene_pts, RANSAC);
std::vector<Point2f> obj_corners(4);
obj_corners[0] = Point(00); obj_corners[1] = Point(box.cols, 0);
obj_corners[2] = Point(box.cols, box.rows); obj_corners[3] = Point(0, box.rows);
std::vector<Point2f> scene_corners(4);
perspectiveTransform(obj_corners, scene_corners, H);


04

BOX矩形框绘制

求得最终的位置信息,根据获得四个点坐标经过多边形绘制函数,完成绘制,这个其中有必要重点解释一下多边形绘制函数

void cv::polylines (  InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar & color, int thickness = 1, int lineType = LINE_8, int shift = 0)

参数解释以下

  • img表示输入图像

  • pts表示绘制的多边形顶点集合,必须是int类型CV_32SC

  • isClosed表示是否闭合

  • color表示多边形颜色

  • thickness表示线宽,注意:必须大于等于零,若是想要填充它,请用drawContours

  • lineType表示对线的渲染方式

  • shift表示迁移,默认为0。这个在ROI上绘制时候有用

实现代码以下:

// 绘制发现的对象
std::vector<Point> pts;
for (int i = 0; i < scene_corners.size(); i++) {
    pts.push_back(scene_corners[i]);
}
polylines(scene, pts, true, Scalar(00255), 280);

// 显示匹配对象
imshow("Good Matches & Object detection", scene);
imwrite("D:/findobject.png", scene);


运行结果以下:


此外我还注意到SURF貌似还不能直接使用,是否是仍是要编译扩展模块才能够这个我真的要认真探索一波!欢迎你们留言反馈


     
下载1
在「AI算法与图像处」公众号后台回复:yolov4 便可下载  YOLOv4 trick相关论文

下载2
AI算法与图像处公众号后台回复: DL三件套 便可下载包括经典好书

       
 
      
      
       
       
                
       
 
      
我的微信(若是没有备注不拉群!
请注明: 地区+学校/企业+研究方向+昵称

本文分享自微信公众号 - AI算法与图像处理(AI_study)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索