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

news2024/11/20 12:29:55

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

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

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

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

相关文章

即插即用篇 | YOLOv11 引入高效的直方图Transformer模块 | 突破天气障碍:Histoformer引领高效图像修复新路径

本改进已同步到YOLO-Magic框架! 摘要:摘要。基于Transformer的恶劣天气图像修复方法取得了显著进展。大多数方法通过沿通道维度或在空间上固定范围的块内使用自注意力,以减少计算负担。然而,这种折中方式在捕获长距离空间特征方面…

ITSS服务经理: 山西科技学院智能铸造现代产业学院揭牌

记者从山西科技学院传来喜讯,近日,在该院工程训练中心与智能铸造现代产业学院于山西省晋城市泽州县绿色智能铸造创新产业园隆重举行的揭牌启动仪式上,标志着学院迈入崭新篇章。应用型本科高校,作为孕育高素质应用人才的摇篮&#…

AI时代:弯道超车的新思维与实践路径

文章目录 一、AI时代的机遇与挑战二、重新认识AI三、弯道超车的新思维四、实践路径与案例分享五、AI技术的未来发展趋势六、个人与企业如何适应AI时代《AI时代:弯道超车新思维》内容简介作者简介目录 在科技日新月异的今天,人工智能(AI&#…

‘视’不可挡:OAK相机助力无人机智控飞行!

南京邮电大学通达学院的刘同学用我们的oak-d-lite实现精确打击无人机的避障和目标识别定位功能,取得了比赛冠军。我们盼望着更多的朋友们能够加入到我们OAK的队伍中来,参与到各式各样的比赛中去。我们相信,有了我们相机的助力,大家…

网页抓取API,让数据获取更简单

网页抓取的过程通常分为以下步骤,尤其是在面对静态网页时: 获取页面 HTML:使用 HTTP 客户端下载目标页面的 HTML 内容。解析 HTML:将下载的 HTML 输入解析器,准备提取内容。提取数据:利用解析器功能&#…

Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找

一,数组翻转 1.概述:数组对称索引位置上的元素互换,最大值数组序号是数组长度减一 创建跳板temp,进行min和max的互换,然后min自增,max自减,当min>max的时候停止互换,代表到中间值 用代码实…

Office-Tab-for-Mac Office 窗口标签化,Office 多文件标签化管理

Office Tab:让操作更高效,给微软 Office 添加多标签页功能 Office 可以说是大家装机必备的软件,无论学习还是工作都少不了。其中最强大、用的最多的,还是微软的 Microsoft Office。 遗憾的是,微软的 Office 不支持多…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西,主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数(或 alloca)分配的是栈内存,它的特点是: 生命周…

delphi fmx android 离线人脸识别

搜遍全网都没有找到delphi android 能用的 离线人脸识别,无需注册什么开发者 有这方面需求的可以用fsdk 这边用的luxand.FSDK8.0 android下的注册号要自己找下 1,用老猫的工具将android 下的sdk,FSDK.java 编译成FSDK.jar 老猫的工具 2,用上面的工具将FSDK.jar 生成de…

Java基础夯实——2.4 线程的生命周期

Java线程生命周期 Java线程的生命周期分为:新建(New)、就绪(Runnable)、阻塞(Blocked)、等待 (Waiting) 、计时等待(Timed_Waiting)、终止(Terminated&#…

实现简易计算器 网格布局 QT环境 纯代码C++实现

问题:通过代码完成一个10以内加减法计算器。不需要自适应,界面固定360*350。 ""按钮90*140,其它按钮90*70。 参考样式 #define DEFULT_BUTTON_STYLE "\ QPushButton{\color:#000000;\border:1px solid #AAAAAA;\border-radi…

RNN公式解释:实现记忆功能;RNN的状态向量

目录 RNN公式解释:实现记忆功能 一、词向量 二、RNN的状态向量 三、词向量变为状态向量的过程 四、总结 RNN公式解释:实现记忆功能 在RNN(递归神经网络)中,词向量变为状态向量的过程,实际上是RNN处理时序数据的一个核心环节。以下是对这一过程的详细解释: 一、词向…

【Linux】基础02

Linux编译和调试 VI编辑文件 vi : 进入文件编辑 是命令行模式 i :从光标处进入插入模式 dd : 删除光标所在行 n dd 删除指定行数 Esc : 退出插入模式 : 冒号进入末行模式 :wq : 保存退出 :q : 未修改文件可以退出 :q! …

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档: 3.加载游戏,保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂,中间没有运行程序进行阶段性成果的验…

未来已来:少儿编程竞赛聚焦物联网,激发创新潜力

随着人工智能与物联网技术(IoT)的快速发展,少儿编程教育正在迎来新的变革浪潮。近年来,各类少儿编程竞赛纷纷增加了物联网相关主题,要求学生结合编程知识和硬件设备设计智能家居、智慧城市等创新项目。这一趋势不仅丰富…

布局设计器

介绍 最近遇到一个设计器的需求,要求拖拽布局,图层管理,自定义组件预览,分辨率等等功能。说白了就是先用设计器布局然后在屏幕上播放你布局好的内容 所以不多说了直接上代码 代码地址 这里大概说下有哪些功能吧 图层与属性框的值关…

Java中日志采集框架-JUL、Slf4j、Log4j、Logstash

1. 日志采集 日志采集是指在软件系统、网络设备、服务器或其他IT基础设施中自动收集日志文件和事件信息的过程。这些日志通常包含了时间戳、事件类型、源和目标信息、错误代码、用户操作记录等关键数据。日志采集的目的是为了监控系统运行状态、分析系统性能、审计用户行为、故…

ansible从入门到精通(完整篇)

ansible从入门到精通(完整篇) 转自ansible从入门到精通(完整篇) 文章目录 01 Ansible介绍与安装 1. 介绍 Ansible 1.1 什么是 Ansible?1.2 Ansible 无需代理1.3 Ansible 方式 2. 安装 Ansible 2.1 控制节点2.2 受管主机2.3…

Python自学之Colormaps指南

目录 1.色彩映射表(Colormaps)是什么? 2.Matplotlib中的色彩映射表类型 2.1同色渐变(Sequential Colormaps) 2.2双色渐变(Divergence Colormaps) 2.3定性色彩(Qualitative Col…

CentOS 环境下通过 YUM 安装软件

操作场景 为提升用户在云服务器上的软件安装效率,减少下载和安装软件的成本,腾讯云提供了 YUM 下载源。在 CentOS 环境下,用户可通过 yum 命令快速安装软件。对于 YUM 下载源,用户不需要添加软件源,可以直接安装软件包…