图像拼接操作
2016-11-18 22:10
197 查看
#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
#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
相关文章推荐
- 半闲居士视觉SLAM十四讲笔记(5)相机与图像 - part 2 图像及 OpenCV 操作、点云拼接
- 在java中对图像进行操作 格式转换 缩放
- 图像拼接原理
- C++builder 使用cximage对图像文件进行操作
- VC数字图像处理编程讲座之四--BMP图像显示的特效操作
- C# 操作 彩色图像
- (转)VC数字图像处理编程讲座之三 ---BMP图像的基本操作
- 最近被一个问题困扰着,如何实现类似Photoshop的多层图像操作,每层可单独操作,又可以组合显示出来。
- 跟我学MM,配图像,声音,操作与配置(入门级)
- ASP.NET中基本的图像操作
- 实现图像拼接,找半天也没找到好的解决方法
- 代码里使用字符串操作来拼接sql语句的坏处
- 本程序能够对灰度图像先进行二值化,再进行腐蚀操作
- sybase关于图像和大文本的操作
- 通用的图像模板操作函数
- 关于全景图像的无缝拼接
- 图像拼接首先需要考虑的是图像的配准(Image Registration,或是Image Alignment
- 玩转图像函数库―常见图形操作
- MATLAB 图像平移操作(转)
- php关于图像颜色的操作