opencv3.4.12全景拼接

news2024/9/22 17:25:02

  最近camera项目需要用到全景拼接,故此查阅大量资料,终于将此功能应用在实际项目上,下面总结一下此过程中遇到的一些问题及解决方式,同时也会将源码附在结尾处,供大家参考。

  首先说一下此源码的大概执行流程,此项目进行全景拼接采用的图片数是10张,每张图片大小为320×180,而且图片是从左到右,或者从右到左进行拼接的,也就是此拼接是应用在云台摄像头上的,由于摄像头拍出来的图片有畸变,所以在获取到320×180的图片后,会进行裁剪成200*180的尺寸,舍弃双边各60的尺寸,保留中间没畸变的图片,这样会使得拼接更容易。
  此源码中图片拼接的原理就是利用相邻两张图片有重叠的部分进行拼接,其过程就是利用surf算法查找相邻两张图片的关键点和描述子,再根据关键点和描述子利用flann算法找出比较好的一些特征点,然后根据两图片的特征点进行矩阵的变换,由于变换后的矩阵数据并不是都是可以使用的,而且是使用在云台摄像头上的,所以只需关注矩阵数据中的x,y偏移的数据即可,也就是说需要对矩阵数据中的x,y偏移的数据进行判断,以保证计算出来的矩阵是正常的,若计算出来的矩阵数据异常,则需动态调整surf算法中的阈值,再次对这两张图片进行关键点和描述子的查找并匹配特征点,再一次计算矩阵,直到找到合适的矩阵数据再进行下个相邻两张图片的拼接。由于图片是自左向右或自右向左顺序拍出来的,所以上文中提到的对x,y偏移的数据进行判断的条件就是判断x偏移的数据是否都为正的(自左向右拍的图片)并且在图片的长度范围内,至于这个限制的条件需要根据实际摄像头转动的角度去进行判断,至于对y偏移数据的判断的话,因为是应用在云台摄像头上的,所以对于y方向的拼接,其图片拼接后在y方向上的偏移是很小的,这里设置y方向上的限制条件是正负10以内。上文中提到的动态调整surf算法的阈值直到找到合适的矩阵数据的方式,这里会有一个问题,那就是阈值调整到最小后(也就是0),还是找不到合适的矩阵数据那怎么办呢?这里的做法是参考前面计算出的正常矩阵去取一个平均值作为本次的矩阵数据,没错,就是硬拼接,使得图像能拼接成功。当然,如果是在第一张图片与第二张图片就找不到合适的矩阵数据,那么前面没有正常的矩阵数据作为参考的话,此拼接就失败了,这是唯一拼接失败的情况。
  在最开始拼接之前,还会申请一个总的Mat数据去存储拼接后的图片数据,那么这个Mat数据究竟多大呢,这里是先申请10张图片尺寸大小横向的空间,最后面拼接完十张图片后,肯定会留下一大片黑色区域,包含上下边框也会有黑色区域的存在,源码中采用两种去黑的方式完全图片的裁剪,建议使用默认的去黑方式即可,当然也可以尝试另一张方式。
  此源码并未使用opencv开源中的例程去修改,因为开源中的例程执行速度太慢了,不符合嵌入式设备的处理,同时此源码也支持图片自左向右图片的拼接,这是为了满足云台摄像头倒装的情况而增加的
  下面附上例程的10张图片及最后生成的效果图
在这里插入图片描述
在这里插入图片描述

  下面附上本次项目的源码,源码中的readme有opencv的编译方式(ubuntu、arm)及使用方法:opencv3.4.12全景拼接源码
  当然,也可以在github上面直接下载,可以的话顺便fork和star。链接:opencv_panoramic_stitching
​  代码要的下方留言邮箱我会第一时间发给你们的,有什么问题也可以下面评论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1381234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx服务配置文件

在Nginx服务器的主配置文件/usr/local/nginx/conf/nginx.conf 中,包括全局配置、I/O事件配置 和HTTP配置这三大块内容,配置语句的格式为“关键字 值:”(末尾以分号表示结束),以“#” 开始的部分表示注释。 …

FreeRTOS系统配置

一、前言 在实际使用FreeRTOS 的时候我们时常需要根据自己需求来配置FreeRTOS,而且不同架构 的MCU在使用的时候配置也不同。FreeRTOS的系统配置文件为FreeRTOSConfig.h,在此配置文件中可以完成FreeRTOS的裁剪和配置,这是非常重要的一个文件&a…

Qt/QML编程学习之心得:Grid、GridLayout、GridView、Repeater(33)

GRID网格用处非常大,不仅在excel中,在GUI中,也是非常重要的一种控件。 Grid 网格是一种以网格形式定位其子项的类型。网格创建一个足够大的单元格网格,以容纳其所有子项,并将这些项从左到右、从上到下放置在单元格中。每个项目都位于其单元格的左上角,位置为(0,0)。…

【自学笔记】01Java基础-08Java常用API:02Object类详解

>什么是API? 1 Object类 Object类是所有Java类的根父类,无论是否显式声明,所有的Java类都直接或间接地继承自java.lang.Object。 1.1 Object类的作用 统一规范:为所有Java对象提供了一组基本方法,使得任何Java对…

【图解面试】JS系列 - 如何回答数据类型相关问题(上)

1. JS中的数据类型有哪些,他们的区别是什么? 知识点大纲 语言组织(示例) 要点:数量 → 种类 → 区别 JS中的数据类型主要有 8 种,分为两大类 基础数据类型 和 引用数据类型 基础数据类型中主要有 Numbe…

力扣热题100

排序 快速排序 #include <iostream> #include <vector> using namespace std;// 快速排序函数&#xff0c;传入引用&#xff0c;以便修改原始数组 void quick_sort(vector<int>& q, int l, int r) {// 边界条件&#xff1a;如果左边界大于等于右边界&am…

全链路追踪关键技术-TraceId、SpanId生成规则

链路追踪的traceid原理梳理 如何追踪微服务调用&#xff1f; ● traceId&#xff0c;用于标识某一次具体的请求ID。当用户的请求进入系统后&#xff0c;会在RPC调用网络的第一层生成一个全局唯一的traceId&#xff0c;并且会随着每一层的RPC调用&#xff0c;不断往后传递&…

【搜索引擎设计:信息搜索怎么避免大海捞针?

在前面我们提到了网页爬虫设计&#xff1a;如何下载千亿级网页&#xff1f;中&#xff0c;我们讨论了大型分布式网络爬虫的架构设计&#xff0c;但是网络爬虫只是从互联网获取信息&#xff0c;海量的互联网信息如何呈现给用户&#xff0c;还需要使用搜索引擎完成。因此&#xf…

AWS EC2的SSM配置(AWS云中的跳板机)

问题 开发人员需要访问AWS云中私有子网的数据库服务等&#xff0c;都需要通过EC2进行SSH隧道代理。这里假设本地已经有一款稳定优秀的SSH客户端工具&#xff0c;并且假设已经会熟练使用SSH的隧道代理。 1.创建EC2 搜索找到EC2服务&#xff0c;如下图&#xff1a; 点击“启动…

ssm基于Java的壁纸网站设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

OpenHarmony源码解析之编译构建

前言 OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;目标是面向全场景、全连接、全智能时代、基于开源的方式&#xff0c;搭建一个智能终端设备操作系统的框架和平台&#xff0c;促进万物互联产业的繁荣发展…

用通俗易懂的方式讲解:Stable Diffusion WebUI 从零基础到入门

本文主要介绍 Stable Diffusion WebUI 的实际操作方法&#xff0c;涵盖prompt推导、lora模型、vae模型和controlNet应用等内容&#xff0c;并给出了可操作的文生图、图生图实战示例。适合对Stable Diffusion感兴趣&#xff0c;但又对Stable Diffusion WebUI使用感到困惑的同学。…

Linux:信号

目录 1.信号 2.信号的过程 a.信号的产生 1:键盘产生, 异常产生 2:系统调用产生信号 3.软件条件产生信号 4.硬件异常产生信号 b.信号的发送 c.信号的处理 d.总结与思考 3.信号保存 1.信号及其它相关常见概念 2.在内核中的表示 3.sigset_t 4. 信号集操作函数 4.信…

C#基于ScottPlot进行可视化

前言 上一篇文章跟大家分享了用NumSharp实现简单的线性回归&#xff0c;但是没有进行可视化&#xff0c;可能对拟合的过程没有直观的感受&#xff0c;因此今天跟大家介绍一下使用C#基于Scottplot进行可视化&#xff0c;当然Python的代码&#xff0c;我也会同步进行可视化。 P…

【SQL注入】SQLMAP v1.7.11.1 汉化版

下载链接 【SQL注入】SQLMAP v1.7.11.1 汉化版 简介 SQLMAP是一款开源的自动化SQL注入工具&#xff0c;用于扫描和利用Web应用程序中的SQL注入漏洞。它在安全测试领域被广泛应用&#xff0c;可用于检测和利用SQL注入漏洞&#xff0c;以验证应用程序的安全性。 SQL注入是一种…

脱离于ASP.NET 和Visual Studio编辑Razor脚本

Razor Pad是一个编辑Razor脚本的工具&#xff0c;脱离于ASP.NET 和Visual Studio。 github地址&#xff1a;https://github.com/RazorPad/RazorPad 如果在编译源码时出现&#xff1a;签名时出错: 未能对 bin\Debug\app.publish\RazorPad.exe 签名。SignTool Error: No certifi…

myql进阶-一条查询sql在mysql的执行过程

目录 1. 流程图 2. 各个过程 2.1 连接器 2.2 分析器 2.3 优化器 2.4 执行器 2.5 注意点 1. 流程图 2. 各个过程 假设我们执行一条sql语句如下&#xff1a; select * from t_good where good_id 1 2.1 连接器 首先我们会和mysql建立连接&#xff0c;此时就会执行到连接…

Java+Mysql存储过程生成订单序列号

Mysql存储过程生成唯一订单号 直接上代码&#xff01;&#xff01; 1.创建存储过程 CREATE DEFINERrootlocalhost PROCEDURE getOrderSerialNo(# 前缀in orderPrefix varchar(64), # 返回结果out result int) BEGIN# 当前流水号declare curOrderNo int;# 默认值为0declare e…

【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究

目录 主要内容 模型研究 结果一览 下载链接 主要内容 该模型以环境保护成本和运行成本为双目标构建了微电网优化调度模型&#xff0c;模型目标函数和约束条件复现文献《基于改进粒子群算法的微电网多目标优化调度》&#xff0c;程序的特点是采用非支配排序的蜣螂…

学习selenium+python使用 XPath 表达式来实现找到目标元素时智能封装等待,执行测试代码启动Chrome浏览器后,地址栏只显示data;

背景 学习使用 XPath 表达式来实现找到目标元素时智能封装等待执行测试代码启动Chrome浏览器后&#xff0c;地址栏只显示data&#xff1b; 代码如下 import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from …