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

相关文章

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j