全景拼接代码

/// 全景拼接.cpp : 定义控制台应用程序的入口点。
//*下面注释掉网上的库函数例程代码*/
//bool try_use_gpu = false;
//vector<Mat> imgs;
//using namespace std; 
//using namespace cv;
//string IMAGE_PATH_PREFIX = "data1/";
//Mat img = imread(IMAGE_PATH_PREFIX+"1.jpg");
// imgs.push_back(img);
// img = imread(IMAGE_PATH_PREFIX + "2.jpg");
// imgs.push_back(img);
// img = imread(IMAGE_PATH_PREFIX + "3.jpg");
// imgs.push_back(img);
// img = imread(IMAGE_PATH_PREFIX + "4.jpg");
// imgs.push_back(img);
// img = imread(IMAGE_PATH_PREFIX + "5.jpg");
// imgs.push_back(img);
// img = imread(IMAGE_PATH_PREFIX + "6.jpg");
// imgs.push_back(img);
// cout << "finish "<<imgs.size()<<endl;
// Mat pano;//拼接结果图片
// //Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
// Stitcher stitcher = Stitcher::createDefault(true);
// Stitcher::Status status = stitcher.stitch(imgs, pano);
// if (status != Stitcher::OK)
// {
//  cout << "Can't stitch images, error code = " << int(status) << endl;
//  return -1;
// }
// imwrite(result_name, pano);
// imwrite(result_name, pano);
// waitKey(0);
// return 0;
//void CalcCorners(const Mat& H, const Mat& src)
//{
// double v2[] = { 0, 0, 1 };//左上角
// double v1[3];//变换后的坐标值
// Mat V2 = Mat(3, 1, CV_64FC1, v2);  //列向量
// Mat V1 = Mat(3, 1, CV_64FC1, v1);  //列向量
//
// V1 = H * V2;
// //左上角(0,0,1)
// corners.left_top.x = v1[0] / v1[2];
// corners.left_top.y = v1[1] / v1[2];
//
// //左下角(0,src.rows,1)
// v2[0] = 0;
// v2[1] = src.rows;
// v2[2] = 1;
// V2 = Mat(3, 1, CV_64FC1, v2);  //列向量
// V1 = Mat(3, 1, CV_64FC1, v1);  //列向量
// V1 = H * V2;
// corners.left_bottom.x = v1[0] / v1[2];
// corners.left_bottom.y = v1[1] / v1[2];
//
// //右上角(src.cols,0,1)
// v2[0] = src.cols;
// v2[1] = 0;
// v2[2] = 1;
// V2 = Mat(3, 1, CV_64FC1, v2);  //列向量
// V1 = Mat(3, 1, CV_64FC1, v1);  //列向量
// V1 = H * V2;
// corners.right_top.x = v1[0] / v1[2];
// corners.right_top.y = v1[1] / v1[2];
//
// //右下角(src.cols,src.rows,1)
// v2[0] = src.cols;
// v2[1] = src.rows;
// v2[2] = 1;
// V2 = Mat(3, 1, CV_64FC1, v2);  //列向量
// V1 = Mat(3, 1, CV_64FC1, v1);  //列向量
// V1 = H * V2;
// corners.right_bottom.x = v1[0] / v1[2];
// corners.right_bottom.y = v1[1] / v1[2];
//
//}
//typedef struct
//{
// Point2f left_top;
// Point2f left_bottom;
// Point2f right_top;
// Point2f right_bottom;
//}four_corners_t;
//four_corners_t corners;
#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2/features2d/features2d.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<iostream>
#include <opencv2/stitching/stitcher.hpp>
using namespace cv;
using namespace std;
string IMAGE_PATH_PREFIX = "data1/";
cv::Mat Stitcher2pic(const cv::Mat &srcimage1, const cv::Mat &srcimage2);
cv::Mat Stitcher3pic(cv::Mat &srcimage1, cv::Mat &srcimage2, cv::Mat& image1_2);
std::vector<cv::Mat> imgs;
cv::Mat imagedisplacement(cv::Mat &src, int x, int y);
cv::Mat Stitcher4pic(cv::Mat &srcimage1, cv::Mat &srcimage2, cv::Mat& image123);
cv::Mat Stitcher6pic(cv::Mat &srcimage1, cv::Mat &srcimage2);
int main()
 {
 Mat img = imread(IMAGE_PATH_PREFIX + "1.jpg");
 resize(img, img, cv::Size(), 0.5, 0.5
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
压缩包中包含的具体内容: 对给定数据中的6个不同场景图像,进行全景拼接操作,具体要求如下: (1) 寻找关键点,获取关键点的位置和尺度信息(DoG检测子已由KeypointDetect文件夹中的detect_features_DoG.m文件实现;请参照该算子,自行编写程序实现Harris-Laplacian检测子)。 (2) 在每一幅图像中,对每个关键点提取待拼接图像的SIFT描述子(编辑SIFTDescriptor.m文件实现该操作,运行EvaluateSIFTDescriptor.m文件检查实现结果)。 (3) 比较来自两幅不同图像的SIFT描述子,寻找匹配关键点(编辑SIFTSimpleMatcher.m文件计算两幅图像SIFT描述子间的Euclidean距离,实现该操作,运行EvaluateSIFTMatcher.m文件检查实现结果)。 (4) 基于图像中的匹配关键点,对两幅图像进行配准。请分别采用最小二乘方法(编辑ComputeAffineMatrix.m文件实现该操作,运行EvaluateAffineMatrix.m文件检查实现结果)和RANSAC方法估计两幅图像间的变换矩阵(编辑RANSACFit.m 文件中的ComputeError()函数实现该操作,运行TransformationTester.m文件检查实现结果)。 (5) 基于变换矩阵,对其中一幅图像进行变换处理,将其与另一幅图像进行拼接。 (6) 对同一场景的多幅图像进行上述操作,实现场景的全景拼接(编辑MultipleStitch.m文件中的makeTransformToReferenceFrame函数实现该操作)。可以运行StitchTester.m查看拼接结果。 (7) 请比较DoG检测子和Harris-Laplacian检测子的实验结果。图像拼接的效果对实验数据中的几个场景效果不同,请分析原因。 已经实现这些功能,并且编译运行均不报错!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值