本文实例为大家分享了OpenCV实现拼接图像的具体方法,供大家参考,具体内容如下
用iphone拍摄的两幅图像:
拼接后的图像:
相关代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/ / 读取图像
Mat leftImg = imread( "left.jpg" );
Mat rightImg = imread( "right.jpg" );
if (leftImg.data = = NULL||rightImg.data = = NULL)
return ;
/ / 转化成灰度图
Mat leftGray;
Mat rightGray;
cvtColor(leftImg,leftGray,CV_BGR2GRAY);
cvtColor(rightImg,rightGray,CV_BGR2GRAY);
/ / 获取两幅图像的共同特征点
int minHessian = 400 ;
SurfFeatureDetector detector(minHessian);
vector<KeyPoint> leftKeyPoints,rightKeyPoints;
detector.detect(leftGray,leftKeyPoints);
detector.detect(rightGray,rightKeyPoints);
SurfDescriptorExtractor extractor;
Mat leftDescriptor,rightDescriptor;
extractor.compute(leftGray,leftKeyPoints,leftDescriptor);
extractor.compute(rightGray,rightKeyPoints,rightDescriptor);
FlannBasedMatcher matcher;
vector<DMatch> matches;
matcher.match(leftDescriptor,rightDescriptor,matches);
int matchCount = leftDescriptor.rows;
if (matchCount> 15 )
{
matchCount = 15 ;
sort(matches.begin(),matches.begin() + leftDescriptor.rows,DistanceLessThan);
}
vector<Point2f> leftPoints;
vector<Point2f> rightPoints;
for ( int i = 0 ; i<matchCount; i + + )
{
leftPoints.push_back(leftKeyPoints[matches[i].queryIdx].pt);
rightPoints.push_back(rightKeyPoints[matches[i].trainIdx].pt);
}
/ / 获取左边图像到右边图像的投影映射关系
Mat homo = findHomography(leftPoints,rightPoints);
Mat shftMat = (Mat_<double>( 3 , 3 )<< 1.0 , 0 ,leftImg.cols, 0 , 1.0 , 0 , 0 , 0 , 1.0 );
/ / 拼接图像
Mat tiledImg;
warpPerspective(leftImg,tiledImg,shftMat * homo,Size(leftImg.cols + rightImg.cols,rightImg.rows));
rightImg.copyTo(Mat(tiledImg,Rect(leftImg.cols, 0 ,rightImg.cols,rightImg.rows)));
/ / 保存图像
imwrite( "tiled.jpg" ,tiledImg);
/ / 显示拼接的图像
imshow( "tiled image" ,tiledImg);
waitKey( 0 );
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/iteye_18380/article/details/82554544