資源簡(jiǎn)介
利用OpenCV-2.4.13和vs2017實(shí)現(xiàn)SURF/SIFT + RANSAC + 線性加權(quán)融合來(lái)實(shí)現(xiàn)圖像的左右拼接,上下也可以拼接,改一下adjustMat就可以(代碼中是x偏移量,你換成y的偏移量,把值換成rows就好,同時(shí)在計(jì)算透視變換的時(shí)候Size參數(shù)改為(image02.cols, image02.rows + image01.rows)),代碼均有注釋,同時(shí)將每一步結(jié)構(gòu)都顯示出來(lái)了,附有示例圖片,直接就可以運(yùn)行。

代碼片段和文件信息
//?ImageMosaic.cpp?:?此文件包含?“main“?函數(shù)。程序執(zhí)行將在此處開(kāi)始并結(jié)束。
//?source?code?:?https://blog.csdn.net/dcrmg/article/details/52629856
//?explanation?:?https://blog.csdn.net/u012384044/article/details/73162675#commentBox
//
#include?“pch.h“
#include?
#include?
#include?“opencv2/highgui/highgui.hpp“??
#include?“opencv2/nonfree/nonfree.hpp“??
#include?“opencv2/legacy/legacy.hpp“?
using?namespace?cv;
using?namespace?std;
//計(jì)算原始圖像點(diǎn)位在經(jīng)過(guò)矩陣變換后在目標(biāo)圖像上對(duì)應(yīng)位置
Point2f?getTransformPoint(const?Point2f?originalPoint?const?Mat?&transformMaxtri);
int?main(int?argc?char?*argv[])
{
string?filename1?=?“100-0038_img.jpg“;
string?filename2?=?“100-0039_img.jpg“;
Mat?image01?=?imread(filename1);
Mat?image02?=?imread(filename2);
imshow(“拼接圖像1“?image01);
imshow(“拼接圖像2“?image02);
//灰度圖轉(zhuǎn)換
Mat?image1?image2;
cvtColor(image01?image1?CV_RGB2GRAY);
cvtColor(image02?image2?CV_RGB2GRAY);
//提取特征點(diǎn)??
SurfFeatureDetector?detector(800);????//?surf.?hessianThreshold
//SiftFeatureDetector?detector(800);??//?sift.?nfeatures
vector?keyPoint1?keyPoint2;
detector.detect(image1?keyPoint1);
detector.detect(image2?keyPoint2);
//?顯示特征點(diǎn)
Mat?image1KeyPoint?image2KeyPoint;
drawKeypoints(image01?keyPoint1?image1KeyPoint
Scalar::all(-1)?DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(image02?keyPoint2?image2KeyPoint
Scalar::all(-1)?DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow(“image1Keypoint“?image1KeyPoint);
imshow(“image2Keypoint“?image2KeyPoint);
//waitKey(0);
//特征點(diǎn)描述,為下邊的特征點(diǎn)匹配做準(zhǔn)備??
SurfDescriptorExtractor?descriptor;????//surf
//SiftDescriptorExtractor?descriptor;??//sift
Mat?imageDesc1?imageDesc2;
descriptor.compute(image1?keyPoint1?imageDesc1);
descriptor.compute(image2?keyPoint2?imageDesc2);
//獲得匹配特征點(diǎn),并提取最優(yōu)配對(duì)??
FlannbasedMatcher?matcher;
vector?matchePoints;
matcher.match(imageDesc1?imageDesc2?matchePoints?Mat());
//?粗匹配圖像
Mat?outImg;
drawMatches(image01?keyPoint1?image02?keyPoint2?matchePoints?outImg
Scalar::all(-1)?Scalar::all(-1)?vector()?DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow(“粗匹配結(jié)果“?outImg);
//waitKey(0);
sort(matchePoints.begin()?matchePoints.end());?//特征點(diǎn)排序
//獲取排在前N個(gè)的最優(yōu)匹配特征點(diǎn)
vector?imagePoints1?imagePoints2;
for?(int?i?=?0;?i?10;?i++)
{
imagePoints1.push_back(keyPoint1[matchePoints[i].queryIdx].pt);
imagePoints2.push_back(keyPoint2[matchePoints[i].trainIdx].pt);
}
//獲取圖像1到圖像2的投影映射矩陣,尺寸為3*3
vector?inliersMask(imagePoints1.size());
Mat?homo?=?findHomography(imagePoints1?imagePoints2?CV_RANSAC?3.0?inliersMask);
vectormatches_ransac;
//?手動(dòng)的保留RANSAC過(guò)濾后的匹配點(diǎn)對(duì)?
//?這一步做的沒(méi)必要,因?yàn)樽詈蟠_定匹配區(qū)域的時(shí)候只用到了第一個(gè)點(diǎn)。
for?(int?i?=?0;?i? {
cout?< if?(inliersMask[i])
{
matches_ransac.push_back(matchePoints[i]);
}
}
drawMatches(image01?keyPoint1?image02?keyPoint
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-10-15?17:30??ImageMosaic\
?????目錄???????????0??2018-10-16?15:06??ImageMosaic\ImageMosaic\
?????目錄???????????0??2018-10-15?17:30??ImageMosaic\ImageMosaic\.vs\
?????目錄???????????0??2018-10-15?17:30??ImageMosaic\ImageMosaic\.vs\ImageMosaic\
?????目錄???????????0??2018-10-16?15:06??ImageMosaic\ImageMosaic\.vs\ImageMosaic\v15\
?????文件???????51712??2018-10-16?15:06??ImageMosaic\ImageMosaic\.vs\ImageMosaic\v15\.suo
?????文件????19685376??2018-10-16?15:06??ImageMosaic\ImageMosaic\.vs\ImageMosaic\v15\Browse.VC.db
?????目錄???????????0??2018-10-16?09:19??ImageMosaic\ImageMosaic\.vs\ImageMosaic\v15\ipch\
?????目錄???????????0??2018-10-16?15:06??ImageMosaic\ImageMosaic\.vs\ImageMosaic\v15\ipch\AutoPCH\
?????文件??????327680??2018-10-16?09:19??ImageMosaic\ImageMosaic\.vs\ImageMosaic\v15\ipch\beec6b604aac47a8.ipch
?????文件??????327680??2018-10-16?15:04??ImageMosaic\ImageMosaic\.vs\ImageMosaic\v15\ipch\e7d55abe53aad59d.ipch
?????目錄???????????0??2018-10-16?15:05??ImageMosaic\ImageMosaic\ImageMosaic\
?????文件??????109215??2004-10-22?08:25??ImageMosaic\ImageMosaic\ImageMosaic\100-0023_img.jpg
?????文件??????118280??2004-10-22?08:25??ImageMosaic\ImageMosaic\ImageMosaic\100-0024_img.jpg
?????文件??????133387??2004-10-22?08:25??ImageMosaic\ImageMosaic\ImageMosaic\100-0025_img.jpg
?????文件???????61019??2004-10-22?08:25??ImageMosaic\ImageMosaic\ImageMosaic\100-0038_img.jpg
?????文件???????87303??2004-10-22?08:25??ImageMosaic\ImageMosaic\ImageMosaic\100-0039_img.jpg
?????文件???????60433??2004-10-22?08:25??ImageMosaic\ImageMosaic\ImageMosaic\100-0040_img.jpg
?????文件??????126555??2004-10-22?08:25??ImageMosaic\ImageMosaic\ImageMosaic\101-0104_img.jpg
?????文件???????13412??2018-10-16?15:04??ImageMosaic\ImageMosaic\ImageMosaic\ImageMosaic.cpp
?????文件????????9531??2018-10-16?09:19??ImageMosaic\ImageMosaic\ImageMosaic\ImageMosaic.vcxproj
?????文件????????1159??2018-10-15?17:30??ImageMosaic\ImageMosaic\ImageMosaic\ImageMosaic.vcxproj.filters
?????文件?????????165??2018-10-15?17:30??ImageMosaic\ImageMosaic\ImageMosaic\ImageMosaic.vcxproj.user
?????文件?????????188??2018-10-15?17:30??ImageMosaic\ImageMosaic\ImageMosaic\pch.cpp
?????文件?????????614??2018-10-15?17:30??ImageMosaic\ImageMosaic\ImageMosaic\pch.h
?????文件??????215891??2018-10-16?15:04??ImageMosaic\ImageMosaic\ImageMosaic\拼接結(jié)果.jpg
?????文件????????1447??2018-10-15?17:30??ImageMosaic\ImageMosaic\ImageMosaic.sln
評(píng)論
共有 條評(píng)論