opencv全景图拼接

2024-03-04 13:48
文章标签 opencv 拼接 全景图

本文主要是介绍opencv全景图拼接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


出处 http://blog.csdn.net/Real_Myth

简介
基本的拼接方式参见: 《opencv实现图像的拼接功能》 
本博文基于取景模式讲解图像拼接。API全面基本的介绍介绍参见:

  OpenCV官网:http://docs.opencv.org/modules/stitching/doc/stitching.html
在opencv源代码中stitching.cpp 是简单版图像拼接实例,参见《opencv实现图像的拼接功能》。
stitching_detailed.cpp 复杂全面版图像拼接实例。


简单实例(stitching.cpp)

  首先看下,opencv实现图像拼接的最简单实例,这是将stitching.cpp裁剪到最简单的代码

具体精简代码如下:
#include <iostream>  
#include <fstream>  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/stitching/stitcher.hpp"  
   
using namespace std;  
using namespace cv;  
   
bool try_use_gpu = true; //false;  
vector<Mat> imgs;  
string result_name = "result.jpg";  
   
int parseCmdArgs(int argc, char** argv)
{  
    for (int i = 1; i < argc; ++i){  
        Mat img = imread(argv[i]);  
        if (img.empty()){  
            cout << "Can't read image '" << argv[i] << "'\n";  
            return -1;  
        }  
        imgs.push_back(img);  
        imshow(argv[i], img);  
    }  
    return 0;  
}  
   
int main(int argc, char* argv[])
{  
    int retval = parseCmdArgs(argc, argv);  
    if (retval) return -1;  
   
    Mat pano;  
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu);  
    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);  
    imshow("show", pano);  
    cv::waitKey(0);  
    return 0;  
}

效果演示

  


 基于不同模式的全景拼接(stitching_detailed.cpp精简版)

代码具体代码如下:

#include <iostream>  
#include <fstream>  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/stitching/stitcher.hpp"  
   
using namespace std;  
using namespace cv;  
   
bool try_use_gpu = false;  
vector<Mat> imgs;  
string result_name = "result.jpg";  
   
int parseCmdArgs(int argc, char** argv)
//输入的图片全部填充到容器imgs中,并将输入的图片显示出来。
    for (int i = 1; i < argc-1; ++i)
    {  
        Mat img = imread(argv[i]);  
        if (img.empty()){  
            cout << "Can't read image '" << argv[i] << "'\n";  
            return -1;  
        }  
        imgs.push_back(img);  
   
        imshow(argv[i], img);  
    }  
    return 0;  
}  
   
int main(int argc, char* argv[])
{  
    int retval = parseCmdArgs(argc, argv);  
    if (retval) return -1;  
   
    Mat pano;        
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu);  //创建一个stitcher对象。
   
    if(argv[4][0] == '1')
    {  //1:平面拼接
        PlaneWarper* cw = new PlaneWarper();  
        stitcher.setWarper(cw);  
    }
    else if(argv[4][0] == '2')
    {//2:柱面 拼接
        SphericalWarper* cw = new SphericalWarper();      
        stitcher.setWarper(cw);  
    }
    else if(argv[4][0] == '3')
    {//3:立体画面拼接
        StereographicWarper *cw = new cv::StereographicWarper();      
        stitcher.setWarper(cw);  
    }  
   
    //使用Surf算法来寻找特征点,支持Surf和Orb两种方式
    detail::SurfFeaturesFinder *featureFinder = new detail::SurfFeaturesFinder();  
    stitcher.setFeaturesFinder(featureFinder);  
   
    /*匹配给定的图像和估计相机的旋转*/  
    Stitcher::Status status = stitcher.estimateTransform(imgs);  //另一种方式来实现拼接
    if (status != Stitcher::OK)  
    {  
        cout << "Can't stitch images, error code = " << int(status) << endl;  
        return -1;  
    }  
   
    /*生成全景图像*/  
    status = stitcher.composePanorama(pano);  
    if (status != Stitcher::OK)  
    {  
        cout << "Can't stitch images, error code = " << int(status) << endl;  
        return -1;  
    }  
   
    imwrite(result_name, pano);  
    imshow("show", pano);  
    cv::waitKey(0);  
    return 0;  



代码中设置生成结果图为:1:平面, 2:柱面, 3:立体画面。在它提供的复杂版实例:stitching_detailed.cpp,
有如下种类可以选择:
plane|cylindrical|spherical|fisheye|stereographic|compressedPlaneA2B1|
compressedPlaneA1.5B1|compressedPlanePortraitA2B1|compressedPlanePortraitA1.5B1|paniniA2B1|
paniniA1.5B1|paniniPortraitA2B1|paniniPortraitA1.5B1|mercator|transverseMercator

本例中结果展示: 
1:平面

2:柱面

3:立体画面

这篇关于opencv全景图拼接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773365

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de