本文实例为大家分享了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