文件名称:
Stitching模块中对特征提取的封装解析.pdf
开发工具:
文件大小: 312kb
下载次数: 0
上传时间: 2019-09-03
详细说明:
Stitching 模块中对特征提取的封装解析
(以ORB 特性为例)
OpenCV 中Stitching 模块(图像拼接模块)的拼接过程可以用PipeLine 来进行描述,是一个比较复杂的过程。在这个过程中,特征提取是重要的一个部分。
由于OpenCV 发展到了3.X 以后,Stitching 模块的相关函数进行了重新封装,所以对于学习研究造成了一定困难。这里通过解析代码,研究Stitching 模块中的特征提取部分,并且和直接进行特征提取的相关函数进行比对。std: vector ob]
std: vector sccci
for( int i-0: i<(int)bestMatches. size(;i++
obj. push back( key -[ bestMatches [i. query Idx ].pt )i
scene.pus'1 tack( key Trl2[ best Ma Lche
/直接调用 ransac,!|算单应矩阵
Mat h= findHomcgraphy( cbi, scene, CV RANSA- )i
/绘制仿射结果
std: vec: Lor obj(:rners(4)i
std::: vector scene corners(4)
ob] corners[o]- Point (0,0)i
b] corners [1]
oint( ingl COls,C
obi corners [21= point( ingl cols, ingl rows i
oh j cor ners[3]= Point( 0, ing1r:: ws
perspective'lransform( ob] corners, scene corners, H)i
//- Draw lines between the corners (the mapped object in the scene image 2
Point2f o=fset((float)irg1 cols, 0)
line( resul-r scene corners[o cffse-, scene corners[1l+ o=fse-r Scalar(o, 255,3)4
)
line( resul-, scene corners[l]+ cffse-r scene corners
line( resultr scene corners [2+ cffse-r scene corners[3]+o=fse=r scalar( 0, 255, 0)
line( result, scene corners[3]+ ffse=, scene corners[0]+ o=fse-r Scalar(0, 255, 0
imshow(result
esul=
wa.ikey()
这段代码主要参考的是0 pencv自带的" matchmethod orb akaze brisk.cp"。需
要注意的是3.X版本中ORB函数的定义和之前也是不一样的。
二、使用 Stitching模块
代码:
#include"stdafx.h
#includeiostream
#include"opencv 2/ob detect/ob detect hpp
#include "opencv2/features2d/features2d hpp
#include"opcncv2/highgui/highgui hpp"
#include"opencv2/cal ihr/cal ibd hpp
#include opencv 2/imgproc/imgproc c h
#include"opencv2/imgproc/imgproc hpp
using name space sL
using name space cv
using name space cv:: detail
int main(int argc, charx argv[)
//读入测试用图
Mat imgl imread(parliament 2. bmp")
Mat img 2= imread(parliament.3. bmp")
两图拼成一个图
Mat result(img l rows, 2* img l cols CV 8UC3, Scalar:: all(0))
ge(0, ingl. col
ingl. copy To (MatSu)
Mat Sub =result. colRange(imgl. ccls, 2*imgl cols)
i mg2 copY To(MatSub
//创建恃征寻找指针
Ptrfcaturcs(2)
//直接对3通道图片进行特征提取操伫
(*finder)(iml, features[o])
(*finder)(img2 features[l])
finder-collectGarbageo
/配对
vector< Matches Info> pairwise matches
Ptr matcher- makcPtrcollectGarbage(
绘制仿射变挨情
sld::vec tor obj corners(4)
std:: vector scenc corners(4)
0= Point (0.0)
obj corners
Point( il
img l. ccls, 0)
obj_corners 21= Point( ingl ccls, imgI rows
3=PoinL(o, ingl rows
//获得逼合的H
at h-
for(ir
if(pairwise la Lches i.src ing_ idx==0&& pairwise matches Li]. dst- ing_ idx=-1)
hes[]. II
// Draw lines between the corners (the mapped object in the scene- image 2)
Point2f offset((float) ingl cols. 0)
line(result, scene corers LoJ +offseL, scene corners L1 +offset, Scalar(0, 255, 0), 4
linc( result, sccc corners [l] +offsct, scenc corners [2] +offsct, Scalar(0, 255, 0), 4)
line( result, scene corners [2] +offset., scene corners [3] +offset, Scalar(0, 255, 0), 4)
line (result, scene corners [3] +offset, scene corners [o] +offset, Scalar(, 255, 0), 4
imshow("result", result
imrie("resulL. jpg, result)
waitEr o
对后面这段代码重点解析。
1、首先为了能够最后方便显示,首先就是将两幅图片合成了一副图片,采用的
是 copy to+mask参数的方法。这和方法是我在Ask0 penCV二面学到的。
/读入测试用图
t img 1= imread("parliament. bmp");
Mat img2- imread ("parliaments. bmp")
/两图拼成一个图
Mat result (irgl rows, 2* ingl cols cv 8UC3, Scalar: all(0));
Mat Mat Sub= result. colRange(0, ingl cols)
ingl copyTo(Mat S:ub);
MatSub= result. col Range (ingl cols, 2*ingl cols)
ng2. copy To(Mat S: 1b)
2、创建特征提取函数
/创建特征寻找指针
Ptr finder makePtrKOrbFeaturesFinder>o
//创建休存特征的数据结构
vector< Inage Features)features (2):
//直按对3通道图片进行特征提取操作
(*finder)(ingl, fea. lures LOJ
(*finder)(img2, features[1])
finder->collectGarbageo)
直接创建0 rbFeaturesfinder的智能指针对象,调用指针函数,寻找到特征到
ImageFeatures的数据结构中去。
这里,如果进行代码跟踪,就会发现对于同一樞图方法二找到ORB特征和方法一
找到的是不一样的。
方法二在这里,将特征点的寻找,和特征向量的提取计算全部集成封装,需要注
struct Cv EXPORTS ImageFeatures
Size im
LMat descriptors
可以看到, ImageFeatures结构中不经包括了 keypoints的 vector,而且包括了
UMat的 descriptors,一步到位
3、特征匹配和提存
vector pairwise matches
Plr< ulresMatcier> rLc:her= makePl r< Best. 0f2Neares t Matcher>(false, 0.30)
(*matcher)(fcatures, pairwise matches
matcher->collect Garbage o
这里的封装应该说更多。在方法一种,在这里经过了 Bruteforce特征匹配,挂
序, Ransac
提纯3个步骤,那么在 Stitching模块中,只是用了一个方法。如果根据函数中
去,可以发
现其实实现步骤和方法一类似,但是也有自己不同地方
4、仿射变换、绘制结果
∥/绘制仿射变换情况
std:: vector obj corners(4)
std:: vector scenc corners(1)
bj corrers [o]= point(0. 0)
cbj corrers [1]=Point( ingl cols, 0)
(bjcorTers [3]=Point. (0, ingl rows )
/获得适合的H
Mat h
for(int
se mat ches. size ( i++)
(pairwise mat.c: hes [i]. sre ing idlx==0&& pairwise atc: hesLi]. cisL. img idx== 1)
atches [il.H
mers. hi
//--Draw lines between the corners (the mapped object in the scene-image 2)
Foint2f offset((float ingl cols, 0);
line( result, scene corners [o] +offset, scene corners[1] +offset, Scalar(0. 255, 0), 4)
lino( rcsult, scenc corners[l +offset, scenc corners[2] +offset, Scalar(0, 255, 0),1)
line( result. scene corners[2 loff set, scene corners[3 offset, Scalar(0, 255. 0).4)
line( result, scene corners[3] +offset, scene corners [o] +offset, Scalar(0, 255, 0), 4)
imshow("result", result
imwriL.e('result. jpg", resnlt
这里和方法一类似,需要注意的地方就是由于H等数据结构都已经集成
在 pairwise matches的数据结构中,所以通过一个循环找到自己需要的H
小结:这里初步对 Stitching模块中对特征提取的封装解析进行了分析,为下
步图像拼接的深入研究做技术准备。值得注意的是目前看二去, Stitching模
块中对特征提取的封装实现的结果不如原生的方法好,这里是由于我操作的
原因,还是因为本身设计的原因还要继续研究。
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.