opencv图片全景拼接详解

合并图片并利用百度API一次性OCR识别 1.批量提取图片 import requests import re from fontTools.ttLib import TTFont from lxml import etree from aip import AipOcr #pip install baidu-aip def readme(str,i): #记事本,读取内容 f=open(str,'r+') lines=f.readlines() lines[i]=lines[i].strip('\r\n') 阅读详情

简介
基本的拼接方式参见: 《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:立体画面


转:http://blog.youkuaiyun.com/real_myth/article/details/50961149

Opencv实战——图像拼接   图像拼接(Image Stitching)是一种利用实景图像组成全景空间的技术,它将多幅图像拼接成一幅大尺度图像或360度全景图,接可以看做是场景重建的一种特殊情况,其中图像仅通过平面单应性进行关联。图像拼接在运动检测和跟踪,增强现实,分辨率增强,视频压缩和图像稳定等机器视觉领域有很大的应用。   图像拼接的输出是两个输入图像的并集。通常用到四个步骤: 特征提取(Feature Extraction):检测输入图像中的特征点。图像配准(Image Registration):建立了图像之间的几何对应关系 阅读详情

相关推荐

opencv实战---调用stitcher类进行全景拼接和黑边处理

调用stitcher类进行全景拼接和黑边处理

m0_57224196的博客 5049

OpenCV学习记录——2.使用OpenCV的Stitcher类来实现Android平台上的全景图拼接

文章目录1.前言2.常见的坑3.代码实现4.效果展示 1.前言 现在回看起来,距离之前的那篇博客,竟然已经整整隔了一个月!在这一个月里,为了编写这个完全没有接触过的跨平台程序,作者踩了许多(超级多)的坑,这里就简单记录一下,希望能帮助到读者 2.常见的坑 安装OpenCV建议直接引入第三方.so,若想引入.a文件的话极其麻烦,集成的教程建议以下博客: https://www.jianshu.c...

赈川 2071

【Opencv】Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图)

Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图)全景图拼接思路具体步骤代码与结果代码效果测试1效果测试2 全景图拼接 思路 这个就是简单对左右两张图进行拼接,希望实现下面效果: 左图全景图右图 这里不是指严丝合缝的可以直接拼接的图,比如 如下面两个图:(以中间那个仙人掌(貌似)为指标,可见第一张图应该位于全景图的左边,第二张图位于全景图右边) 想要实现效果(简单拼接成全景...

EchoooZhang的博客 1万+

OpenCV实现两幅图片全景拼接

课程作业的一个题目,找了代码加了注释。 import numpy as np import cv2 class Stitcher: def stitch(self, images, ratio=0.75, reprojThresh=4.0, showMatches=False): # 检测出关键点,局部不变描述符 (imageB, imageA) = images (kpsA, featuresA) = self.detec

你就是根号四的博客 1434

opencv多张图片实现全景拼接

利用opencv3.4.12源码的surf、flann算法找出关键点和描述子,匹配特征点,计算出变换矩阵,进行全景拼接,裁剪大小,去黑框。

weixin_44069765的博客 2779

Python-OpenCV:图像的全景拼接融合以及图片对齐处理

Opencv对图片切割和对图片对齐处理 以下原文转自:(作者: Wimb) Python-OpenCV基础:图像的全景拼接 import numpy as np import cv2 as cv from matplotlib import pyplot as plt if __name__ == '__main__': top, bot, left, right = 100, 100...

weixin_43431189的博客 1万+

OpenCV实战:轻松实现图片拼接,打造全景图像!

本文将带你深入了解如何使用OpenCV库实现图片拼接技术,打造令人惊叹的全景图像。通过清晰的步骤讲解和代码示例,你将学会如何利用特征点检测、匹配算法以及图像变换技术完成高质量的图片拼接。无论你是计算机视觉的初学者还是有一定经验的开发者,这篇文章都将为你提供实用的知识和技巧。

平时不搬砖的博客 1760

opencv 基于sift的多张图片全景图拼接

这里是基于sift来寻找特征点经行图像的匹配的原理来进行图像拼接的,具体步骤如下: 1、利用sift特征探测器来检测出两幅图片的sift特征点 2、根据上一步提取到的特征点来提取特征向量,使用SiftDescriptorExtractor对完成特征向量提取的工作,通过他对关键点周围邻域内的像素分块进行梯度运算,得到128维的特征向量 3、进行特征向量临近匹配,

Eric 3万+

Python Opencv实践 - 全景图片拼接stitcher

由于手里没有切割好的全景图片资源,因此首先写了一个切片的程序spliter。如果有现成的切割好的待拼接的切片文件,则不需要使用spliter。对于全景图片的拼接,需要注意一点,各个切片图片之间要有重复的内容以便opencv能够提取到关键点并能匹配上。如果简单地将全景图均分几乎是不可能成功的,stitcher一般会返回错误1(ERR_NEED_MORE_IMGS)。我下载的原始全景图片为:经过spliter切片后。

vivo01的专栏 1847

360全景拼接 opencv_如何制作VR全景图片

摘要:鱼眼镜头、怎么拍摄高质量全景图片、用普通相机怎么拍摄、带着我们的好奇,和我们的疑问开启我们如何获取360度图片的旅程吧。鱼眼镜头什么是鱼眼镜头呢,让我们来看一看下面这张照片,是不是和平常的图片不一样呢。什么是鱼眼相机呢:想要制作360全景照片,鱼眼镜头是全景摄影师必不可少的摄影设备。我们常见的鱼眼镜头的焦距通常为8mm至15mm。进行360全景拍摄之所以选择鱼眼镜头,主要是因为鱼眼镜头拍摄单...

weixin_36104309的博客 1323

Opencv项目实战:04 全景图片拼接

《Opencv项目实战:04 全景图片拼接》,今天Opencv的实战项目为全景图片拼接,将不同角度的图片拼接在一起,注意:图片尺寸大小需近乎相同。

m0_62919535的博客 3151

OpenCV-Python 实现两张图片自动拼接成全景图

基本原理 要实现两张图片的简单拼接,必须计算homography矩阵(单应性矩阵),矩阵的计算至少需要在图中找到四个相似的点,用这个矩阵把那张图片变换后放到另一张图片相应的位置 ( 就是相当于把两张图片中定好的四个相似的点給重合在一起)。如此,就可以实现简单的全景拼接。当然,因为拼合之后图片会重叠在一起,所以需要重新计算图片重叠部分的像素值,否则结果会很难看。所以总结起来其实就两个步骤: 找两张图片中相似的点,计算变换矩阵(确定融合位置,通过SIFT 算法计算相似点) 变换一张图片放到另一张图片合适的位置

qq_43697752的博客 5038

OpenCV完美实现两张图片的全景拼接(详细教程)

根据图片相对位置的不同,左边的图片和右边的图片有可能会在某些列出现重叠部分,为了消除这种不自然的效果,需要实现像素级的混合。首先找到左右图片开始重叠的位置和结束的位置,然后对两张图片进行加权处理,最后将加权后的图片输出。然后,在两张图片上分别使用这个检测器进行关键点检测和特征提取,获得关键点集合和描述符集合。调用 cv2.FlannBasedMatcher(),如果大于,则进行视角变换矩阵的计算,将右边的图片。同时,将左边的图片覆盖在变换后的图片上,得到。处理两张图片的特征描述符,得到最佳匹配。

qq_53545309的博客 4841

【opencv-python 使用stitcher.stitch进行全景的拼接】将多张图片拼接成全景,采用了stitcher.stitch

【opencv-python 使用stitcher.stitch进行全景的拼接】将多张图片拼接成全景,采用了stitcher.stitch

weixin_43857838的博客 2220

【opencv】左右两张图片实现全景拼接

代码1 import numpy as np import cv2 class Stitcher: #拼接函数 def stitch(self, images, ratio=0.75, reprojThresh=4.0,showMatches=False): #获取输入图片 (imageB, imageA) = images #检测A、B图片的SIFT关键特征点,并计算特征描述子 (kpsA, featuresA) = self.detectAndDescribe(imageA

慕云 1331

OpenCV开发笔记(七十九):基于Stitcher类实现全景图片拼接

一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野。拼接的方法分为两条路,第一条路是stitcher类,第二条思路是特征点匹配。本篇使用stitcher匹配,进行两张图来视野合并拼接。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 1万+
上一篇: UIImage 绘制 裁剪 基本功能
下一篇: opencv图像全景拼接
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值