您好,欢迎光临本网站![请登录][注册会员]  
文件名称: Stitching模块中对特征提取的封装解析.pdf
  所属分类: 专业指导
  开发工具:
  文件大小: 312kb
  下载次数: 0
  上传时间: 2019-09-03
  提 供 者: qq_21******
 详细说明: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最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: