图像拼接操作

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/stitching.hpp>
#include <iostream>
#include <vector>  
using namespace std;
using namespace cv;
void stitch(std::vector<cv::Mat> imgs, cv::Mat& resultMat)
{
	bool Flag = true;
	// 定义Stitcher类
	Stitcher stitcher = Stitcher::createDefault(Flag);
	Stitcher::Status status = stitcher.stitch(imgs, resultMat);
	if (status != Stitcher::OK) {
		std::cout << "error" << std::endl;
	}
}
void stitch2(Mat& srcImage1, Mat& srcImage2, Mat& panorama)
{
	// SURF特征点描述
	Mat srcImage2Warped;
	// 初始化SURF检测描述子
	cv::Ptr<Feature2D> surf = xfeatures2d::SURF::create();

	// 关键点及特征描述矩阵声明
	vector<cv::KeyPoint> kPointMat, kPointMat2;;
	cv::Mat desMat1, desMat2;

	surf->detectAndCompute(srcImage1, Mat(), kPointMat, desMat1);
	surf->detectAndCompute(srcImage2, Mat(), kPointMat2, desMat2);

	// FLANN 关键点匹配
	// FLANN 初始化 RANSAC一致性 最近邻特征
	FlannBasedMatcher matcher;
	std::vector< DMatch > matches;
	matcher.match(desMat1, desMat2, matches);
	double max_dist = 0, min_dist = 100;
	// 特征点最大与最小距离查找
	for (int i = 0; i < desMat1.rows; i++)
	{
		double dist = matches[i].distance;
		if (dist < min_dist) min_dist = dist;
		if (dist > max_dist) max_dist = dist;
	}
	// 使用good 特征构建距离限定 
	std::vector< DMatch > good_matches;
	for (int i = 0; i < desMat1.rows; i++)
	{
		if (matches[i].distance < 3 * min_dist)
		{
			good_matches.push_back(matches[i]);
		}
	}
	// 图像的关键点匹配
	std::vector<Point2f> srcImage1_matchedKPs;
	std::vector<Point2f> srcImage2_matchedKPs;
	for (size_t i = 0; i < good_matches.size(); i++)
	{
		srcImage1_matchedKPs.push_back(
			kPointMat[good_matches[i].queryIdx].pt);		srcImage2_matchedKPs.push_back(
				kPointMat2[good_matches[i].trainIdx].pt);
	}
	// 计算图像1与图像2的映射
	Mat H = findHomography(Mat(srcImage2_matchedKPs),
		Mat(srcImage1_matchedKPs), CV_RANSAC);
	// 仿射变换
	warpPerspective(srcImage2, srcImage2Warped, H,
		Size(srcImage2.cols * 2, srcImage2.rows), INTER_CUBIC);
	panorama = srcImage2Warped.clone();
	// 结果输出
	Mat roi(panorama, Rect(0, 0,
		srcImage1.cols, srcImage1.rows));
	srcImage1.copyTo(roi);
}
int main(int argc, char* argv[])
{
	cv::Mat image1 = imread("..\\images\\img07.JPG");
	cv::Mat image2 = imread("..\\images\\img08.JPG");
	cv::Mat image3 = imread("..\\images\\img09.JPG");
	if (!image1.data || !image2.data || !image3.data)
		return -1;
	vector<Mat> imgs;
	imgs.push_back(image1);
	imgs.push_back(image2);
	imgs.push_back(image3);
	cv::Mat resultMat1, resultMat2;
	stitch(imgs, resultMat1);
	cv::imshow("resultMat1", resultMat1);
	stitch2(image1, image2, resultMat2);
	cv::imshow("resultMat2", resultMat2);
	cv::waitKey(0);
	return 0;
}




转载:http://blog.csdn.net/zhuwei1988

图像拼接是将多个图像拼接在一起,形成一个大的图像的过程。OpenCV提供了多种图像拼接的方法,其中最常用的是拼接两个图像的方法。以下是使用OpenCV进行图像拼接的步骤: 1. 读取要拼接的图像。 ```python import cv2 import numpy as np # 读取要拼接的图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') ``` 2. 将要拼接的图像转换为灰度图像。 ```python # 将图像转换为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) ``` 3. 利用SIFT算法提取图像的特征点。 ```python # 创建SIFT特征点对象 sift = cv2.xfeatures2d.SIFT_create() # 提取特征点和特征描述符 kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) ``` 4. 利用FLANN算法进行特征匹配。 ```python # 创建FLANN匹配器对象 flann = cv2.FlannBasedMatcher() # 对特征点进行匹配 matches = flann.knnMatch(des1, des2, k=2) ``` 5. 通过比率测试筛选匹配点。 ```python # 进行比率测试,筛选匹配点 good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: good_matches.append(m) # 将匹配点的坐标转换为数组 src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) ``` 6. 利用findHomography函数计算单应性矩阵。 ```python # 计算单应性矩阵 M, mask = cv2.findHomography(dst_pts, src_pts, cv2.RANSAC, 5.0) ``` 7. 利用warpPerspective函数进行图像的透视变换。 ```python # 进行图像的透视变换 result = cv2.warpPerspective(img2, M, (img1.shape[1] + img2.shape[1], img1.shape[0])) result[0:img1.shape[0], 0:img1.shape[1]] = img1 ``` 8. 显示并保存结果。 ```python # 显示拼接结果 cv2.imshow('result', result) cv2.waitKey(0) # 保存拼接结果 cv2.imwrite('result.jpg', result) ``` 以上就是使用OpenCV进行图像拼接的步骤,利用这些步骤可以实现两张图像的拼接。如果要拼接多张图像,可以采用多次拼接的方法,将多张图像逐一拼接起来。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值