【图像配准】使用OpenCV进行多图配准拼接

news2024/11/15 8:44:43

本篇主要利用OpenCV自带的配准拼接函数Stitcher_create来实现多幅图像的配准拼接
代码参考自:https://github.com/samggggflynn/image-stitching-opencv

图像拼接创建步骤

通常来说,根据多个图像创建全景图的步骤为以下几步:

  1. 检测两张图像的关键点特征(DoG、Harris等)
  2. 计算不变特征描述符(SIFT、SURF或ORB等)
  3. 根据关键点特征和描述符,对两张图像进行匹配,得到若干匹配点对,并移除错误匹配;
  4. 使用Ransac算法和匹配的特征来估计单应矩阵(homography matrix);
  5. 通过单应矩阵来对图像进行仿射变换;
  6. 两图像拼接,重叠部分融合;
  7. 裁剪以获得美观的最终图像。

OpenCV实践

OpenCV提供了cv2.createStitcher (OpenCV 3.x) 和 cv2.Stitcher_create(OpenCV 4) 这个拼接函数接口,对于其背后的算法,尚未可知(该函数接口是调用其它的C语言进行实现),查阅官方文档,并未找到完全对应上的内容。因此,下文主要偏向于实践。

官方文档链接:https://docs.opencv.org/4.5.3/d2/d8d/classcv_1_1Stitcher.html

下面是示例代码,采用的是OpenCV4.5.3版本,主要内容均已添加注释:

from imutils import paths
import numpy as np
import imutils
import cv2

images = 'images/myimg'  # 输入图片文件夹路径
output = 'myoutput2.png'  # 输出图片名称
crop = True
imagePaths = sorted(list(paths.list_images(images)))
images = []

# 读取文件夹图片
for imagePath in imagePaths:
    image = cv2.imread(imagePath)
    images.append(image)

# 创建缝合器
stitcher = cv2.Stitcher_create()
(status, stitched) = stitcher.stitch(images)

# status:状态,0代表成功
if status == 0:
    # 裁剪图像
    if crop:
        # 在拼图周围添加2像素
        stitched = cv2.copyMakeBorder(stitched, 2, 2, 2, cv2.BORDER_CONSTANT, (0, 0, 0))

        # 对图像进行灰度化和阈值化
        gray = cv2.cvtColor(stitched, cv2.COLOR_BGR2GRAY)
        thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)[1]

        # 查找阈值图像的轮廓
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
                                cv2.CHAIN_APPROX_SIMPLE)
        cnts = imutils.grab_contours(cnts)
        c = max(cnts, key=cv2.contourArea)

        # 在这个轮廓下绘制最大的矩形
        mask = np.zeros(thresh.shape, dtype="uint8")
        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(mask, (x, y), (x + w, y + h), 255, -1)

        # 创建两个遮罩
        # minRect作为不断腐蚀的矩形
        # sub作为阈值图像和minRect的插值来进行判断
        minRect = mask.copy()
        sub = mask.copy()

        while cv2.countNonZero(sub) > 0:
            minRect = cv2.erode(minRect, None)
            sub = cv2.subtract(minRect, thresh)

        # 得到最小的矩形,提取其范围坐标
        cnts = cv2.findContours(minRect.copy(), cv2.RETR_EXTERNAL,
                                cv2.CHAIN_APPROX_SIMPLE)
        cnts = imutils.grab_contours(cnts)
        c = max(cnts, key=cv2.contourArea)
        (x, y, w, h) = cv2.boundingRect(c)

        # 使用该范围坐标对原图进行裁剪
        stitched = stitched[y:y + h, x:x + w]

    # 保存图片
    cv2.imwrite(output, stitched)

else:
    print("拼接失败,错误码:{}".format(status))

从上述代码可知,核心拼接方式是stitcher = cv2.Stitcher_create()(status, stitched) = stitcher.stitch(images)两行内容,下面的方式是对拼接完的图像进行裁剪,以便找到其中的最大矩形。

其中,status表示是否拼接成功,主要由四个值:

  • OK=0 :图像拼接成功。
  • ERR_NEED_MORE_IMGS=1 :这表明构建全景图像需要输入更多的输入图像。没有检测到足够关键点时,会发生该错误。
  • ERR_HOMOGRAPHY_SET_FAIL=2:使用RANSAC算法估计单应性矩阵失败。同样地,这表明需要更多的图像或者图像地辨识度不足,不能够提取到独特地关键点以精确匹配。
  • ERR_CAMERA_PARAMS_ADJUST_FAIL = 3: 很少遇见,与相机有关。

crop = True则进行后续裁剪,若crop = False则保留拼接完成的原图。

原仓库给出了三张测试小图如下:

在这里插入图片描述

不进行裁剪之后的结果:

在这里插入图片描述

裁剪后的结果为下图红框所示部分:

在这里插入图片描述

参考

[1]https://github.com/samggggflynn/image-stitching-opencv
[2]你相机里的全景图是如何实现的 https://zhuanlan.zhihu.com/p/83225676
[3]PyImageSearch学习笔记三(使用Opencv拼接全景地图二)https://zhuanlan.zhihu.com/p/504145711

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

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

相关文章

【pytest】三、pytest之setup和teardown,及封装

一、引言: 1)setup的作用:用来实现执行前的一些初始化操作(如:数据准备、连接设备、打开APP/浏览器、创建日志对象、创建数据库连接、创建接口的请求对象等操作); 2)teardown的作用:用来实现执…

C++学习/温习笔记:新型源码学编程(二)

写在前面 面向初学者撰写专栏,个人原创的学习C/C笔记(干货)编程练习所作源代码输出内容为中文,便于理解如有错误之处请各位读者指正请读者评论回复、参与投票,反馈给作者,我会获得持续更新笔记干货的动力。…

放弃内卷,创造新市场

在疫情,突然爆发的俄乌冲突,还有全球的物价上涨情况等社会问题逐渐变得尖锐的动荡中,让原本就不好的经济形势进入了寒冬期,各个行业也陆续进入了寒冬期,纷纷进入了内卷模式,尤其是对于跨境电商行业来说&…

linux 部署jmeter报错处理

一、linux 安装jdk Java Downloads | Oracle 二、 linux上传jmeter 2.1 上传jmeter jmeter 下载地址: Apache JMeter - Download Apache JMeter 注意: 我先在我本地调试脚本(mac环境),调试完成后,再在…

java基于ssm的饰品商城的设计与实现

管理员;管理员使用本系统涉到的功能主要有个人中心、用户管理、商品分类管理、商品信息管理、活动商品管理、知识普及管理、饰品圈、系统管理、订单管理等功能。 用户进入前台可以查看首页、商品信息、活动商品、知识普及、饰品圈、公告信息、个人中心、后台管理、购…

全国产!全志A40i+Logos FPGA核心板(4核ARM Cortex-A7)硬件说明

硬件资源 SOM-TLA40iF核心板板载ARM、FPGA、ROM、RAM、晶振、电源、LED等硬件资源,并通过B2B连接方式引出IO。核心板所有器件(包括B2B连接器)均采用国产工业级方案,国产化率100%。 图 1 核心板硬件框图

哪有什么互联网寒冬?献给java程序员的面试全攻略,修炼内功,强大自己才是王道!

最近很多人在讨论,学Java还有前途吗?转行Java有希望吗?Java还值得学吗?诸如此类的问题太多了,见怪不怪,不用担心太多,我们来仔细分析一下为什么会出现这种情况。 首先,互联网行业近几年确实很…

scrapy构造并发送请求

scrapy数据建模与请求 学习目标: 应用 在scrapy项目中进行建模应用 构造Request对象,并发送请求应用 利用meta参数在不同的解析函数中传递数据 1. 数据建模 通常在做项目的过程中,在items.py中进行数据建模 1.1 为什么建模 定义item即提前…

【Linux】操作系统(Operator System)

目录 一、操作系统是什么 1、操作系统概念 2、操作系统的定位 3、设计OS的目的 4、操作系统的重要性 二、 理解操作系统 三、系统调用 系统调用和库函数的关系 一、操作系统是什么 1、操作系统概念 任何计算机系统都包含一个基本的程序集合,称为操作系统…

【网络设备排障怎么破?这五个命令申请出战!】

1.网络排错常用诊断工具介绍 主流网络设备产品提供了一套完整的命令集,可以用于监控网络互联环境的工作状况和解决基本的网络故障。主要包括以下命令: Ping命令 Traceroute命令 Show命令 Clear命令 Debug命令 1.1 Ping命令 1.原理: “ping”…

vue+element-ui项目搭建记录

一. 安装vue(省略) 二. 新建vue项目并启动 1. 命令行执行新建项目命令: vue init webpack TestElemntUI3 //TestElemntUI3为项目名称执行结果发现有问题: 2. 需要安装一个全局加载项,执行命令: npm i…

ARM+DSP!全志T113-i+玄铁HiFi4开发板硬件说明书(1)

前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板。由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感谢关注。 T113-i处理器的IO电平标准一般为1.8V和3.3V,上拉电源一般不超过…

DSTL与PA咨询公司助力英国国防部发展“量子+军事”领域

DSTL的量子实验室(图片来源:网络)如何充分利用国防和安全领域的资源并确保人员安全?快速准确的决策至关重要。人类虽然是决策过程的重要参与者,但是快节奏的决策过程对人类来说变得越来越复杂。国防科学技术实验室&…

18种可以提高接口性能的方案

之前工作中,遇到一个504超时问题。原因是因为接口耗时过长,超过nginx配置的10秒。然后 真枪实弹搞了一次接口性能优化,最后接口从11.3s降为170ms。本文将跟小伙伴们分享接口优化的一些通用方案。 1. 批量思想:批量操作数据库 优化…

分布式系统架构解决方案—Dubbo

文章目录什么是分布式系统?系统架构Dubbo简介RPC的概念dubbo节点角色dubbo节点调用关系Dubbo 安装管理端Dubbo-监控统计中心什么是分布式系统? “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”分布式系统&…

第一次创业,注册什么类型的公司更好?

前言 几乎每一个打工者都有一颗当老板的心,大喊一声:"大丈夫生居天地间,岂能郁郁久居人下",于是一拍桌子就辞职创业,现实往往都是潦草收场,看下面一段统计数据: 中国小微企业平均存活周期4.13年&…

2023牛客寒假算法基础集训营4(10/13)

清楚姐姐学信息论数学&#xff0c;只需要求x的y次方和y的x次方那个大选哪个&#xff0c;除了2和3时是3多&#xff0c;其他情况都是数越小能代表的数越多AC代码&#xff1a;#include <bits/stdc.h> using namespace std; using LL long long; int main() {ios::sync_with…

7年老码农,平凡的2022

前言 嗨&#xff0c;大家好&#xff0c;我是希留。一个被迫致力于成为一名全栈开发的菜鸟。 2022年对于大多数人而言是难忘的一年&#xff0c;受疫情影响、经历行业寒冬。裁员、失业等情况总是笼罩着本就焦虑不安的生活。 而我的2022&#xff0c;用一个关键词就可以概括&…

超大功率远程应急广播系统(大功率扬声器的应用)

系统概述 1、接收控制系统框图 超大功率远程应急广播系统是针对应急广播研发的一套通信系统&#xff0c;其接收控制系统框图如图&#xff08;1&#xff09;所示&#xff1a; 2、发射系统框图 发射系统框图如图&#xff08;2&#xff09;所示。 3、接收控制系统功能 接收控制…

【Spring源码】自动注入·名称:autowireByName()详解

进入方法autowireByName()首先调用了unsatisfiedNonSimpleProperties()方法进行属性过滤unsatisfiedNonSimpleProperties()其中PropertyDescriptor是JavaBean通过存储器导出一个的一个属性&#xff0c;用于获取bw的所有属性描述对象&#xff0c;遍历获取到的属性描述对象&#…