opencv图像全景拼接

OpenCV总结6——stitcher 之前写过一次stitcher,但是写的不太好,这次准备一点一点的总结,可能有出错的地方,欢迎指正。 之前总结的时候忘了查看源码的版本,看的是旧版的源码,这次是新的。先从头文件开始。 在stitcer.cpp中包含的头文件是precomp.hpp,这个文件中包含了许多cuda并行计算用的类 #ifndef __OPENCV_STITCHING_PRECOMP_H__ #define __OPENCV_STITCHING_PRECOMP_H__ #include "opencv2/opencv_modules 阅读详情

网上搜的都是一行代码Stitcher::Status status = stitcher.stitch(imgs, pano);就出来的傻瓜拼接,连OpenCV基本的包都没用。

自己好歹用了下基本的包实现了下。

鲁棒性不太好,图片少的时候没事,图片一多就出现了内存错误和木有特征点的错误。

#include <iostream>
#include <fstream>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/stitching/stitcher.hpp"
#include "opencv2/stitching/warpers.hpp"

#define MaxPics 30
//F:\Program Files\opencv\modules\stitching\include\opencv2\stitching
using namespace std;
using namespace cv;
bool try_use_gpu = false;
int filenum;
vector<Mat> imgs;
string result_name = "result.jpg";
//void printUsage();
//int parseCmdArgs(int argc, char** argv);
int readDir(char *path,char fnames[MaxPics][100]);

int readDir(char *path,char fnames[MaxPics][100]) 
{ 
struct _finddata_t c_file;
intptr_t hFile;
filenum=0;

char fullpath[100];

sprintf(fullpath,"%s\\*.jpg",path);
// Find first .c file in current directory 
if( (hFile = _findfirst( fullpath, &c_file )) == -1L )
printf( "No *.jpg files in current directory %s!\n",fullpath);
else
{
printf( "Listing of .jpg files in %s directory\n\n",path);
printf( "RDO HID SYS ARC FILE SIZE\n", ' ' );
printf( "--- --- --- --- ---- ----\n", ' ' );
do {
printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " );
//ctime_s( buffer, _countof(buffer), &c_file.time_write );
printf( " %-15s %9ld\n",c_file.name, c_file.size );
sprintf(fnames[filenum],"%s\\%s",path,c_file.name);
filenum++;
} while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
return filenum;
} 
int main(int argc, char* argv[])
{
clock_t start,finish;
double totaltime;
start=clock();


argv[1]="pic";
char fdir[MaxPics][100];
filenum = readDir(argv[1],fdir);
Mat img, pano;
for(int i=0 ; i<filenum ;i++){
img = imread(fdir[i]);
imgs.push_back(img);
}
Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
stitcher.setRegistrationResol(0.1);//为了加速,我选0.1,默认是0.6,最大值1最慢,此方法用于特征点检测阶段,如果找不到特征点,调高吧
//stitcher.setSeamEstimationResol(0.1);//默认是0.1
//stitcher.setCompositingResol(-1);//默认是-1,用于特征点检测阶段,找不到特征点的话,改-1
stitcher.setPanoConfidenceThresh(1);//默认是1,见过有设0.6和0.4的
stitcher.setWaveCorrection(false);//默认是true,为加速选false,表示跳过WaveCorrection步骤
//stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);//还可以选detail::WAVE_CORRECT_VERT ,波段修正(wave correction)功能(水平方向/垂直方向修正)。因为setWaveCorrection设的false,此语句没用

//找特征点surf算法,此算法计算量大,但对刚体运动、缩放、环境影响等情况下较为稳定
detail::SurfFeaturesFinder *featureFinder = new detail::SurfFeaturesFinder();
stitcher.setFeaturesFinder(featureFinder);

//找特征点ORB算法,但是发现草地这组图,这个算法不能完成拼接
//detail::OrbFeaturesFinder *featureFinder = new detail::OrbFeaturesFinder();
//stitcher.setFeaturesFinder(featureFinder);

//Features matcher which finds two best matches for each feature and leaves the best one only if the ratio between descriptor distances is greater than the threshold match_conf.
detail::BestOf2NearestMatcher *matcher = new detail::BestOf2NearestMatcher(false, 0.5f/*=match_conf默认是0.65,我选0.8,选太大了就没特征点啦,0.8都失败了*/);
stitcher.setFeaturesMatcher(matcher);

// Rotation Estimation,It takes features of all images, pairwise matches between all images and estimates rotations of all cameras.
//Implementation of the camera parameters refinement algorithm which minimizes sum of the distances between the rays passing through the camera center and a feature,这个耗时短
stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());
//Implementation of the camera parameters refinement algorithm which minimizes sum of the reprojection error squares.
//stitcher.setBundleAdjuster(new detail::BundleAdjusterReproj());

//Seam Estimation
//Minimum graph cut-based seam estimator
//stitcher.setSeamFinder(new detail::GraphCutSeamFinder(detail::GraphCutSeamFinderBase::COST_COLOR));//默认就是这个
//stitcher.setSeamFinder(new detail::GraphCutSeamFinder(detail::GraphCutSeamFinderBase::COST_COLOR_GRAD));//GraphCutSeamFinder的第二种形式
//啥SeamFinder也不用,Stub seam estimator which does nothing.
stitcher.setSeamFinder(new detail::NoSeamFinder);
//Voronoi diagram-based seam estimator.
//stitcher.setSeamFinder(new detail::VoronoiSeamFinder);

//exposure compensators曝光补偿
//stitcher.setExposureCompensator(new detail::BlocksGainCompensator());//默认的就是这个
//不要曝光补偿
stitcher.setExposureCompensator(new detail::NoExposureCompensator());
//Exposure compensator which tries to remove exposure related artifacts by adjusting image intensities
//stitcher.setExposureCompensator(new detail::detail::GainCompensator());
//Exposure compensator which tries to remove exposure related artifacts by adjusting image block intensities 
//stitcher.setExposureCompensator(new detail::detail::BlocksGainCompensator()); 

//Image Blenders
//Blender which uses multi-band blending algorithm 
//stitcher.setBlender(new detail::MultiBandBlender(try_use_gpu));//默认的是这个
//Simple blender which mixes images at its borders
stitcher.setBlender(new detail::FeatherBlender());//这个简单,耗时少

//柱面?球面OR平面?默认为球面
PlaneWarper* cw = new PlaneWarper();
//SphericalWarper* cw = new SphericalWarper();
//CylindricalWarper* cw = new CylindricalWarper();
stitcher.setWarper(cw);

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;
}
cout<<"程序开始";
imwrite(result_name, pano);
finish=clock();
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
cout<<"\n此程序的运行时间为"<<totaltime<<"秒!"<<endl;
return 0;
}

至于其他的拼接方式,http://academy.nearsoft.com/project-updates/makingapanoramapicture写的挺好。我引用之,并总结如下

1,Stitcher class from OpenCV library

  • Pros
    • Extremely simple. Build panorama in just one command.
    • It performs from finding features through blending in the selected projection by itself.
  • Cons
    • Uses SURF algorithm (patented, not allowed for commercial use).
    • Slow at searching for features, running on a smartphone

2,BoofCV 

  • Pros
    • Still easy to use.
    • Java native.
  • Cons
    • It blends without warping into the spherical projection.
    • Still uses SURF.

当然自己实现最好,我的上述代码就是第一种了


转:http://blog.youkuaiyun.com/manji_lee/article/details/9002228

Opencv2.4.9源码分析——Stitching(九) 9、Stitcher类 图像拼接方法用到的算法较多,内容较复杂,可能对于一些人来说用起来过于繁琐,因此Opencv把拼接算法封装到了Stitcher类中,这样就不必理会拼接算法中的具体实现过程。 下面我们就简单介绍一下Stitcher类中的一些常用的函数:   用系统缺省值创建图像拼接器stitcher: Stitcher Stitcher::createDefault(bool try 阅读详情

相关推荐

Opencv2.4.9源码分析——Stitching(六)

6、寻找接缝线 6.1 原理 拼接图像的另一个重要的步骤是找到图像重叠部分内的一条接缝线,该接缝是重叠部分最相似的像素的连线。当确定了接缝线后,在重叠部分,线的一侧只选择该侧的图像部分,线的另一侧只选择这一侧的图像部分,而不是把重叠部分的两幅图像简单融合起来。这么做的目的可以避免图像的模糊及伪像。 目前,常用的寻找接缝线的方法有三种:逐点法、动态规划法和图割法。 逐点法比较简单,它的原理就

赵春江的专栏 1万+

用opencv开源包实现了下图像拼接

网上搜的都是一行代码Stitcher::Status status = stitcher.stitch(imgs, pano);就出来的傻瓜拼接,连opencv基本的包都没用。 自己好歹用了下基本的包实现了下。 鲁棒性不太好,图片少的时候没事,图片一多就出现了内存错误和木有特征点的错误。 #include <iostream>#include <fstream>#in...

weixin_30305735的博客 534

基于OpenCv的图像全景拼接

图像拼接的主要目的是为了解决相机视野限制,生成更宽的图像场景。简单来说图像拼接技术就是把若干幅有重叠部分的图像合成一幅大视角宽幅面的图像。图像拼接技术已普遍出现在海洋和矿产勘测、卫星遥感探索、医学成像、计算机特效生成以及近期热门的虚拟现实等领域。 本次实验是基于特征点匹配的全景图像拼接算法,首先提取各图像中的SIFT特征,通过特征点匹配完成两幅图像的配准;再根据图像配准结果计算出图像间的变换矩阵;最后通过视角变换矩阵变换图像进行拼接。

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 2103

OpenCV探索之路(二十四)图像拼接和图像融合技术

图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。再举一个身边的例子吧,你用你的手机对某一场景拍照,但是你没有办法一次将所有你要拍的景物全部拍下来,所以你对该场景从左往右依次拍了好几张图,来把你要拍的所有景物记录下来。那么我们能不能把这些图像拼接成一个大图呢?我们利用opencv就可以做到图像拼接的效果!比如我们有对这两张图进行拼接。

cy413026的博客 2万+

360全景拼接 opencv_使用OpenCV进行图像全景拼接

点击上方“AI小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达图像拼接是计算机视觉中最成功的应用之一。如今,很难找到不包含此功能的手机或图像处理API。在本文中,我们将讨论如何使用Python和OpenCV进行图像拼接。也就是,给定两张共享某些公共区域的图像,目标是“缝合”它们并创建一个全景图像场景。当然也可以是给定多张图像,但是总会转换成两张共享某些公共区域图像拼接的问题,...

weixin_39553805的博客 870

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的全景图像拼接

对于平面场景和只通过相机旋转拍摄的场景来说,可以使用求每两幅图像之间的一个Homography变换来映射到一张图像的方法,还可以使用恢复相机的旋转的方式得到最终的全景图。其中(x′,y′)(x′,y′)为柱面上的坐标,(x,y)(x,y)为平面图像坐标,其坐标原点都已移至图像中心,rr 为柱面半径,ff为焦距。对每两幅相邻的柱面图像进行特征提取和匹配(特征可以选用SIFT、ORB等,可以使用OpenCV的函数实现),寻找两幅相邻图像的对应关系。

weixin_43802726的博客 1239

OpenCV C++案例实战十二《图像全景拼接》

OpenCV C++案例实战十二《图像全景拼接》前言一、OpenCV Stitcher1.功能源码2.效果二、图像全景拼接1.特征检测2.计算单应性矩阵3.透视变换4.图像拼接5.功能源码6.效果三、源码总结 前言 本文将使用OpenCV C++ 进行图像全景拼接。目前使用OpenCV对两幅图像进行拼接大致可以分为两类。 一、使用OpenCV内置API Stitcher 进行拼接。 二、使用特征检测算法匹配两幅图中相似的点、计算变换矩阵、最后对其进行透视变换就可以了。 一、OpenCV Stitcher

Zero___Chen的博客 1万+

【OpenCV】 全景拼接——两张图像拼接

上回文章写道opencv_contrib安装,为什么安装呢?为了使用SIFT函数。为什么使用SIFT函数?为了进行特征点检测。为什么进行特征点检测?为了图像拼接。所以呢,这段时间我在学习全景拼接。 全景拼接可以分为两张图像拼接和多张图像拼接(大于两张)。因为每幅图像是相机在不同角度下拍摄得到的,它们并不在同一个投影平面上,如果对重叠部分直接进行拼接,则会破坏实际场景的视觉一致性。所以对于多张图像...

GIS_feifei的博客 2821

Opencv学习笔记 图像拼接一全景拼接

全景拼接算法通常包括四个步骤: 步骤1:从两个输入图像中检测并提取关键点(DoG,Harris等) 步骤2:匹配关键点 步骤3:使用RANSAC算法通过匹配的特征向量来估计变换矩阵 步骤4:使用从步骤3获得的矩阵应用变换

学以致用 知行合一 3332

CV实战 | 使用OpenCV进行图像全景拼接

图像拼接是计算机视觉中最成功的应用之一。如今,很难找到不包含此功能的手机或图像处理API。在本文中,我们将讨论如何使用Python和OpenCV进行图像拼接。也就是,给定两张共享某些公共区域的图像,目标是“缝合”它们并创建一个全景图像场景。当然也可以是给定多张图像,但是总会转换成两张共享某些公共区域图像拼接的问题,因此本文以最简单的形式进行介绍。 本文主要的知识点包含一下内容: 关键点检测 局部不变描述符(SIFT,SURF等) 特征匹配 使用RANSA...

迈微AI研习社 · 号主 5362

Opencv 使用Stitcher类图像拼接生成全景图像

Opencv中自带的Stitcher类可以实现全景图像,效果挺不错。 下边的例子是Opencv Samples中的stitching.cpp的简化,源文件可以在这个路径里找到:\opencv\sources\samples\cpp\stitching.cpp #include #include "opencv2/highgui/highgui.hpp" #include "openc

牧野的博客 2万+

OpenCV全景图像拼接技术详解

全景图像拼接是一种通过将多张重叠的图像无缝结合成一张宽幅或球形图像的技术。这项技术广泛应用于虚拟现实、地图制作和摄影领域,为用户提供了一个全方位的视觉体验。随着数字成像技术的进步和计算能力的增强,全景图像拼接技术变得越来越成熟,它不仅提高了图像质量,还扩展了应用场景。全景图像拼接涉及一系列复杂的图像处理步骤,包括图像的获取、预处理、特征检测、特征匹配、几何变换、图像融合以及后处理等。每一阶段都要求高度精确和优化,以实现最佳的拼接效果。

weixin_35751412的博客 1380

Opencv总结7——全景图像拼接

全景图像拼接是将多张重叠的局部图像,通过特征匹配、变换对齐和融合拼接,生成一张宽视角、无明显拼接痕迹的完整图像技术。其核心逻辑是找到图像间的重叠特征点,通过数学变换实现图像对齐,最终完成无缝融合。该技术广泛应用于手机全景摄影、无人机航拍测绘、虚拟现实(VR)场景构建等领域,核心依赖特征提取(如 SIFT)、特征匹配、单应性矩阵求解和图像融合四大关键步骤,是计算机视觉中 “图像配准 + 图像融合” 的典型应用。

weixin_41072743的博客 1233

Python实现OpenCV全景图像拼接系统实战教程

本文还有配套的精品资源,点击获取 简介:本项目展示了如何利用Python和OpenCV库构建全景图像拼接系统。该系统通过合并多个图像来创建宽视场图像,广泛应用于旅游、摄影等领域。Python因其丰富的图像处理库而成为主要开发语言,而OpenCV提供的算法支持了图像的预处理、特征匹配、变换和融合等关键步骤。通过本项目,开发者可以深入学习图像处理和计算机视觉的基础知识,并有机会...

weixin_42128315的博客 1874

从GEFCom到UCI:手把手教你构建电力负荷时空预测模型(Python版)

本文详细介绍了如何从GEFCom到UCI数据集构建电力负荷时空预测模型(Python版),涵盖数据集解析、时空特征工程、模型架构设计及工业部署优化。通过多任务图神经网络(MTGNN)实现高精度预测,并结合边缘计算和在线学习机制提升实际应用效果,为能源管理系统提供可靠解决方案。

lambda的博客 812

【OpenCV】 全景拼接——多张图像拼接

本文参考:https://blog.youkuaiyun.com/zhaocj/article/details/78798687 多张图像拼接:参考OpenCV4.1.1帮助文档中Examples—<samples/cpp/stitching_detailed.cpp> stitching_detailed 图像拼接流程 【stitching_detailed程序运行流程】 1.命令行调...

GIS_feifei的博客 1万+

从零到一:桌面宠物的硬件架构设计与工程实践

本文详细介绍了基于STM32F103C8T6主控平台的桌面宠物机器人硬件架构设计与工程实践。内容涵盖电源管理、舵机控制、PCB布局及系统调试等核心环节,为硬件爱好者提供从零到一的完整开发指南,助力打造稳定可靠的智能桌面伴侣。

alice7model的博客 1112

openCV 图像拼接-全景图像

图像拼接,就是将多张图片拼接成一个大图,类似手机里的全景照片。按照某大神的思路,可以自己按照如下步骤实现: 对每幅图进行特征点提取 对对特征点进行匹配 进行图像配准 把图像拷贝到另一幅图像的特定位置 对重叠边界进行特殊处理 不过openCV已经提供了现成的函数(stitch)类实现此功能,此函数的特点就是慢,有多慢呢,我用手机拍了四张图片,中午睡一觉后,还没有拼接完成。于是换成了两张较小...

qthello 2460

基于STM32设计的4G远程视频侦查小车(图传+远程控制+EMQX+MQTT)(204)

当前设计了一款基于STM32F103ZET6主控芯片和废旧Android手机改造的4G侦查小车。该设计充分利用已有的智能手机硬件资源,实现摄像头画面的实时采集与上传,以及远程控制功能。这样的设计不仅降低了成本,而且充分利用了废旧手机中高性能的硬件资源,如摄像头、4G通信模块和电池等,实现了资源的有效循环利用。

2527

QCC305x-QCC304x系列开发教程之应用程序子系统详解 嵌入式

本文对QCC305x-QCC304x系列芯片的应用程序子系统进行了详细解析,并给出了一个LED闪烁的示例代码。嵌入式系统的开发既需要理论知识的支持,也需要实践经验的积累,希望本文能够为读者在QCC305x-QCC304x系列芯片的开发中提供一些有益的指导。QCC305x-QCC304x系列芯片提供了丰富的外设接口,包括UART、SPI、I2C等,开发者可以根据需求选择适合的接口进行数据传输和控制。QCC305x-QCC304x系列芯片的应用程序子系统是整个嵌入式系统的核心部分,负责管理和执行各种应用程序。

CodeMaven的博客 224

opencv-python实战项目六:全景图像拼接

opencv 图像拼接技术

HanWenKing的博客 4682

AI 大模型接口太零散?自建私有模型管理平台统一整合,管理使用超方便!(支持飞牛nas、群晖nas等服务器快速部署)

面对多种 AI 大模型接口难统一、管理繁琐的问题🤯,本文分享一款超实用开源网关工具⚡,可聚合各大模型、自动转接口、支持可视化管理,Docker 一键部署,大幅降低开发与维护成本🚀

XiaoqiangClub的博客 266
上一篇: opencv图片全景拼接详解
下一篇: 关于iOS 后台执行任务
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值