单击上面的3358www.Sina.com/,然后选择lmdds学视觉或3358www.Sina.com/
重磅的干货,第一时间送到正文,然后从深度学习这件小事上转了过来
星标
前面写了一篇关于单应性矩阵的文章,最后论述了基于特征的图像拼接和目标检测单应性矩阵的应用场景。 从很多人那里得到了信息的反馈,让我继续写。 那里有这篇文章。 这里有两张照片。 背景是我老家的平房,周围是开阔的地带,都是麦子。 有图为证:
置顶
前言
图一:
这里是两幅图像的拼接,多幅图像与此类似。 主要是应用特征提取模块的AKAZE图像特征点和描述符提取,当然也可以选择ORB、SIFT、SURF等特征提取方法。 匹配方法主要基于暴力匹配/FLANN KNN完成,图像定位和定位通过RANSAC和透视变换实现,最后通过简单的权重图像叠加实现融合,得到拼接的全景图像。 其中发现单应性矩阵是重要的一步。 如果你不知道这是什么,请看这里:
OpenCV单应性矩阵发现参数估计方法细节
图二:
1 .加载输入映像
建立AKAZE特征提取机
3 .提取关键点和描述符的特征
4 .描述子匹配,提取匹配良好的关键点
5 .同型矩阵图像定位
6 .制作融合口罩层,准备开始融合
7 .图像透视转换与融合操作
8 .输出拼接后的全景图像
思路
在具体的代码实现步骤之前,谈谈软件版本
-VS2015-OpenCV4.2-Windows 10 64位基本流程
1//提取特征点和描述符2vectorKeyPointkeypoints_right,keypoints_left; 3Matdescriptors_right,descriptors_left; 4自动检测器=a kaze : create (; 5检测器-检测器计算(left,Mat )、keypoints_left、descriptors_left ); 6检测器-检测器计算(right,Mat )、keypoints_right、descriptors_right );关键代码
1//暴力匹配2vectorDMatchmatches; 3 auto matcher=descriptor matcher :3360 create (descriptor matcher 33603360 brute force ); 4//6STD :3360 vectors TD :3360 vectordmatchknn _ matches; 7 matcher-KNN match (descriptors _ left,descriptors_right,knn_matches,2 ); 8constfloatratio_thresh=0.7f; 9 STD :3360 vectordmatchgood _ matches; 10for(size_ti=0; iknn_matches.size (; I ) 11(12if ) KNN _ matches [ I ] [0].distance ratio _ thresh * KNN _ matches [ I ] [1].distance ] 13 ) 14good_ 18 STD :3360 cout STD 33603360 endl; 1920Matdst; 21drawMatches(left,keypoints_left,right,keypoints_right,good_matches,dst );代码实现:提取特征与描述子
1//createmask 2intwin_size=800; 3inth1=left.rows; 4intw1=left.cols; 5inth2=right.rows; 6intw2=right.cols; 7英寸=最大(h1,h2 ); 8intw=w1 w2; 9Matmask1
= Mat::ones(Size(w, h), CV_32FC1);10Mat mask2 = Mat::ones(Size(w, h), CV_32FC1);11Rect roi;12roi.height = h;13roi.width = win_size;14roi.y = 0;15roi.x = w1 - win_size;1617// left mask18Mat temp = mask1(roi);19linspace(temp, 1, 0, win_size);2021// right mask22temp = mask2(roi);23linspace(temp, 0, 1, win_size);对齐生成全景图像
1// generate panorama 2Mat panorama_01 = Mat::zeros(Size(w, h), CV_8UC3); 3roi.x = 0; 4roi.y = 0; 5roi.width = w1; 6roi.height = h1; 7left.copyTo(panorama_01(roi)); 8Mat m1; 9vector<Mat> mv;10mv.push_back(mask1);11mv.push_back(mask1);12mv.push_back(mask1);13merge(mv, m1);14panorama_01.convertTo(panorama_01, CV_32F);15multiply(panorama_01, m1, panorama_01);161718Mat panorama_02;19warpPerspective(right, panorama_02, H, Size(w, h));20mv.clear();21mv.push_back(mask2);22mv.push_back(mask2);23mv.push_back(mask2);24Mat m2;25merge(mv, m2);26panorama_02.convertTo(panorama_02, CV_32F);27multiply(panorama_02, m2, panorama_02);上述代码中panorama_01实现对第一张图像内容提取与mask权重生成混合,panorama_02完成对第二张图的内容透视变换与mask权重生成混合。特别注意的是顺序很重要。单应性矩阵发现代码可以看之前文章即可,这里不再赘述。
合并全景图像
1// 合并全景图2Mat panorama;3add(panorama_01, panorama_02, panorama);4panorama.convertTo(panorama, CV_8U);5imwrite("D:/panorama.png", panorama);程序运行->特征点匹配如下:
最终拼接的全景图如下:
想知道如何改进这个输出结果,让输出结果融合的根据自然与真实,请听下回再说吧!过年了终于有点时间写点干货回报一下大家!请大家多多支持!多多反馈!
下载1:OpenCV-Contrib扩展模块中文版教程
在「lmdds学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「lmdds学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「lmdds学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”粗暴的世界 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~