红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机

在之前的文章中红外相机和RGB相机标定:实现两种模态数据融合_红外相机标定-CSDN博客 ,介绍了如何利用标定板实现外参标定;但实测下来发现2个问题:

(1)红外标定板尺寸问题,由于标定板小,只能在离相机较近的位置采集图像,距离远就无法识别棋盘格,这就导致标定后,远处的物体存在标定误差

(2)换用大标定板有费用高,标定不灵活的问题。

针对上述问题,本方案不再使用标定板提取特征点,而是从实际部署场景中手动选取特征点。

2. 数据准备

2.1 数据保存格式要求

采集的IR和RGB图片放在同一个文件夹下,必须满足以下命名规范,比如红外数据是IR_{ir_idx}.png,可见光相机是RGB_{rgb_idx}.png,ir_idx和rgb_idx必须一一对应,否则数据无效。文件后缀统一为png,红外图像前缀IR_,RGB图像前缀RGB_

可参考的采集代码样例如下:

#!/usr/bin/env python3
import cv2 , time
import numpy as np
 
ir_dev = "/dev/video6"
rgb_dev = "/dev/video0"
# define a video capture object 
ir_vid = cv2.VideoCapture(ir_dev) 
rgb_vid = cv2.VideoCapture(rgb_dev) 
 
count = 0
while(True):     
    # Capture the video frame by frame 
    st_time = time.time()
    ret, ir_frame = ir_vid.read()
    ret, rgb_frame = rgb_vid.read()

    cv2.imshow('IR frame', ir_frame ) 
    cv2.imshow('RGB frame', rgb_frame ) 
 
    key = cv2.waitKey(1) & 0xFF 
    if key == ord('q'): 
        break
    if key == ord('s'): #按s键保存数据
        cv2.imwrite(f"IR_{count}.png", vis_ir_frame)
        cv2.imwrite(f"RGB_{count}.png", vis_rgb_frame)
        count += 1

ir_vid.release() 
rgb_vid.release() 
# Destroy all the windows 
cv2.destroyAllWindows() 

2.2 数据采集要求

保存图片时,相机必须静止,这主要是剔除两个相机时间不同步带来的干扰。选择角点信息明显的场景进行采集,比如下图中的标牌、盒子等有尖角的物体,就比较容易手工选择关键点

3. 手动选择关键点

(1)修改config.yml文件

如下所示,根据实际情况修改即可

config:
    #IR2RGB:将IR图像映射到RGB图像上,融合后的尺寸和RGB图保持一致;RGB2IR:将RGB图像映射到IR图像上,融合后的尺寸和IR图保持一致;
    calib_mode: "IR2RGB" 
    rgb_camera:
        #相机内参,如何相机没有畸变或者还没有标定,就用[1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
        camera_matrix: [3977.513242,0.000000,967.216738,0.000000,3978.987031,595.814879,0.0,0.0,1.0]
        #镜头畸变,如何相机没有畸变或者还没有标定,就用[0.0, 0.0, 0.0, 0.0, 0.0]
        distortion: [-0.355658,-0.008383,0.010103,0.000312,0.000000] 
    ir_camera:
        #相机内参,如何相机没有畸变或者还没有标定,就用[1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
        camera_matrix: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
        #镜头畸变,如何相机没有畸变或者还没有标定,就用[0.0, 0.0, 0.0, 0.0, 0.0]
        distortion: [0.0, 0.0, 0.0, 0.0, 0.0]

注意文件中的camera_matrix和distortion均是标准的opencv格式,可用以下代码进行检验

import cv2

camera_matrix= np.array([3977.513242,0.000000,967.216738,0.000000,3978.987031,595.814879,0.0,0.0,1.0]).reshape((3,3))
distortion= np.array([-0.355658,-0.008383,0.010103,0.000312,0.000000])

raw_rgb_img = cv2.imread("your_rgb.png")
rgb_img = cv2.undistort(raw_rgb_img, camera_matrix, distortion)

cv2.imshow("raw", raw_rgb_img)
cv2.imshow("calib", rgb_img)
cv2.waitKey()

(2)运行程序,设置待标定图片路径,如下图所示,点击红色区域按钮

图片路径不要有中文,否则程序会推出。

(3)设置完成后,会自动加载第一帧数据,如下图所示,整个界面分为“红外区域”、“RGB区域”、“列表区域”

各个区域的操作如下表所示

区域

操作

功能

红外区域/RGB区域

鼠标滚轮

放大/缩小图片

鼠标左键

在图像上加点

鼠标右键

弹出菜单,保存数据或删除上一个点

鼠标中键+移动鼠标

移动图像

数据列表区

鼠标左键

切换图片

(4)通过鼠标左键在RGB区域和红外区域选对应点

如下图所示,两个区域点的位置和标号必须完全对应,否则标定会失败。注意,至少选择4对点才能完成标注。

每次新加入点或者删除点后,可以直接右键保存;也可以在“列表区域”切换一下图像,弹出对话框提醒保存数据。

关键技巧:

(1)选的点对要在图像上分布均匀,且尽可能多选点;比如如果仅在图像的左半部分选点,而右半部分不选点,则会出现标定后,左半部分是准的,右边部分不准。

(2)不要选择移动物体上的点!!!,因为可能存在两个相机时间不同步,如果选择了移动物体的点,会导致标定误差大。

5. 执行标定

点击“执行calib”按钮,就可进行标定,结束后会弹出消息框提示。

6. 检测标定后的融合结果

点击“测试标定效果”,会展示“列表区域”中所有图像对的融合效果图,如下图第三列所示,按q键关闭窗口,按其他按键播放下一帧

对于融合方式,软件提供rgb融合到红外(RGB2IR)和红外融合到RGB(IR2RGB),共2种模式。切换方式为:

(a)修改config.yml文件中的calib_mode为"RGB2IR"或者"IR2RGB"

(b)重启软件,点击“设置文件路径”->点击“执行calib”->点击“测试标定效果”

7. 软件试用链接:

目前仅支持Windows系统,试用链接:
链接: https://pan.baidu.com/s/1GbMgwPH15uagAEMMVVuD5A?pwd=gk4y 提取码: gk4y

exe路径和config.yaml

提供了默认的测试数据,可直接测试软件的效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

柔性仿人手指全覆盖磁皮肤,具备接触觉和运动觉的双模态感知能力

人体精细触觉和本体运动觉依赖于相同类型的感受器,这些感受器位于肌肉、肌腱、关节和皮肤中,负责感知轻触、挠痒、细微压力、形状变化、肌肉张力、肌腱拉伸和关节位置变化等信息。因此方斌教授团队着手于具有高精度、小尺寸、可定制等优势的磁触觉传感器…

【摘要】正点原子--Makefile--学习笔记

目录 一、Makefile 基础1、Makefile引入2、Makefile初次编写 二、Makefile语法1、Makefile规则格式2、Makefile第一次升级 一、Makefile 基础 1、Makefile引入 2、Makefile初次编写 二、Makefile语法 1、Makefile规则格式 2、Makefile第一次升级

【WPF】Prism学习(八)

Prism Dependency Injection 1.处理解析错误 1.1. 处理解析错误: 这个特性是在Prism 8中引入的,如果你的应用目标是早期版本,则不适用。 1.2. 异常发生的原因: 开发者可能会遇到多种原因导致的异常,常见的错误包括…

第8章硬件维护-8.2 可维护性和可靠性验收

8.2 可维护性和可靠性验收 可维护性和可靠性验收非常重要,硬件维护工程师在后端发现问题后,总结成可维护性和可靠性需求,在产品立项的时候与新特性一起进行需求分析,然后经过设计、开发和测试环节,在产品中落地。这些需…

Java 岗面试八股文及答案整理(2024最新版)

春招,秋招,社招,我们 Java 程序员的面试之路,是挺难的,过了 HR,还得被技术面,小刀在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能…

sglang 部署Qwen2VL7B,大模型部署,速度测试,深度学习

sglang 项目github仓库: https://github.com/sgl-project/sglang 项目说明书: https://sgl-project.github.io/start/install.html 资讯: https://github.com/sgl-project/sgl-learning-materials?tabreadme-ov-file#the-first-sglang…

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…

Java项目实战II基于微信小程序的科创微应用平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着科技的…

C++ Primer习题集----题目+答案版

具体源码请见:Cprimer习题上半部分资源-CSDN文库 目录 第一章 开始 练习1.1 编写程序,在标准输出上打印Hello.world 练习1.2 我们的程序使用加法运算符来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。 练习1.4 编译一个包…

Zookeeper的简单使用Centos环境下

目录 前言 一、ZOokeeper是什么? 二、安装Zookeeper 1.进入官网下载 2.解压到服务器 3.配置文件 三.使用Zookeeper 3.1启动相关指令 3.2其他指令 3.3ACL权限 总结 前言 记录下安装zookeeper的一次经历 一、ZOokeeper是什么? ZooKeeper是一…

【Linux】————多线程(概念及控制)

作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年11月19日 再谈地址空间: OS对内存进行管理不是根据字节为单位,以字节为单位效率过低,是以内存块为单位的,一个内存块的大小一般为4…

蓝桥杯每日真题 - 第17天

题目:(最大数字) 题目描述(13届 C&C B组D题) 题目分析: 操作规则: 1号操作:将数字加1(如果该数字为9,变为0)。 2号操作:将数字…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展,室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息,还能通过实时视频监控实现全方位数据的可视化。 与此同时,数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

SIMCom芯讯通A7680C在线升级:FTP升级成功;http升级腾讯云对象储存的文件失败;http升级私有服务器的文件成功

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

前端访问后端实现跨域

背景&#xff1a;前端在抖音里做了一个插件然后访问我们的后端。显然在抖音访问其他域名肯定会跨域。 解决办法&#xff1a; 1、使用比较简单的jsonp JSONP 优点&#xff1a;JSONP 是通过动态创建 <script> 标签的方式加载外部数据&#xff0c;属于跨域数据请求的一种…

网络安全-web架构-nginx配置

1. nginx访问&#xff1a; 访问的是index.html&#xff0c; 访问ip访问的资源就是在/usr/share/nginx/html中&#xff1b; 当nginx不认识&#xff0c;浏览器认识的话&#xff0c;浏览器会自动渲染。 当nginx认识&#xff0c;浏览器不认识的话&#xff0c;浏览器会把它加载成…

内网穿透(组网)成功率高、部署简单

【背景】 公司有服务器&#xff0c;或者公司的电脑配置比自己家里的笔记本高&#xff0c;如果要配置外网穿透&#xff0c;就太麻烦&#xff0c;而且也不安全&#xff0c;局域网组网就相对来说既简单&#xff0c;又安全好多。 ​【介绍】 节点小宝是拥有一套完整的自主研发 P2…

【设计模式】行为型模式(四):备忘录模式、中介者模式

《设计模式之行为型模式》系列&#xff0c;共包含以下文章&#xff1a; 行为型模式&#xff08;一&#xff09;&#xff1a;模板方法模式、观察者模式行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式行为型模式&#xff08;三&#xff09;&#xff1a;责…

Java从入门到精通笔记篇(十三)

与流处理 ambda表达式 定义 lambda表达式不能被独立执行&#xff0c;因此必须实现函数式接口&#xff0c;并且会返回一个函数式接口的对象。 可将其语法用下列的方式理解 误区警示 “->”符号是由英文状态下的“-”和“>”组成的&#xff0c;符号之间没有空格。 lambd…

阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势

目录 文献基本信息 序言 1 发展概况 2 重点技术发展 2.1 人工智能技术 2.1.1 应用深化 2.1.2 作战效能提升 2.2 航空技术 2.2.1螺旋桨设计创新 2.2.2 发射回收技术进步 2.3 其他相关技术 2.3.1 远程控制技术探 2.3.2 云地控制平台应用 3 装备系统进展 3.1 无人作…