红外相机和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 npir_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'): breakif key == ord('s'): #按s键保存数据cv2.imwrite(f"IR_{count}.png", vis_ir_frame)cv2.imwrite(f"RGB_{count}.png", vis_rgb_frame)count += 1ir_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 cv2camera_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.mzph.cn/web/60108.shtml

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

相关文章

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中,任务栈(Task)是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

Ubuntu常见命令

关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home:挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…

时间类的实现

在现实生活中,我们常常需要计算某一天的前/后xx天是哪一天,算起来十分麻烦,为此我们不妨写一个程序,来减少我们的思考时间。 1.基本实现过程 为了实现时间类,我们需要将代码写在3个文件中,以增强可读性&a…

php交友源码交友系统源码相亲交友系统源码php社交系统php婚恋源码php社区交友源码vue 仿交友社交语聊技术栈

关于PHP交友、相亲、婚恋、社区交友系统的源码以及Vue仿交友社交语聊技术栈,以下是一些详细信息和建议: 一、PHP交友系统源码 系统架构设计 前端展示层:负责向用户提供直观友好的界面,包括注册登录页面、个人资料页面、匹配页面、…

Java小技艺

使用bat文件启动jar包 平时在工作中运行jar包一般是导出后命令行窗口运行 jar -jar xxx.jar 这个其实是很不方便的。可以在win上编写bat脚本去运行jar包的。 1 编写bat脚本 start jre8/bin/javaw -jar xxxx.jar2 将jre和待执行的jar包存放到一个目录下(和bat文件在同一目录…

蓝桥杯第22场小白入门赛2~5题

这场比赛开打第二题就理解错意思了,还以为只能用3个消除和5个消除其中一种呢,结果就是死活a不过去,第三题根本读不懂题意,这蓝桥杯的题面我只能说出的是一言难尽啊。。第四题写出来一点但是后来知道是错了,不会正解&am…

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

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

最小生成树——Kruskal、Prim算法

图的存储: 高阶数据结构——图 文章目录 目录 文章目录 一、kruskal算法 二、Prim算法 前言 连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树 就不在连通;反之&#xf…

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…

华为再掀技术革新!超薄膜天线设计路由器首发!

随着Wi-Fi技术的不断进步,新一代的Wi-Fi 7路由器凭借其高速率、低延迟、更稳定的性能受到了广泛关注。它能够更好地满足现代家庭对网络性能的高要求,带来更加流畅、高效的网络体验。9月24日,华为在其秋季全场景新品发布会上推出了全新Wi-Fi 7…

【阅读记录-章节2】Build a Large Language Model (From Scratch)

目录 2.Working with text data2.1 Understanding word embeddings2.2 Tokenizing text通过一个简单的实验来理解文本的词元化概念关键概念 2.3 Converting tokens into token IDs实现分词器类(Tokenizer Class)应用分词器测试文本的编码与解码通过分词器…

SDF,一个从1978年运行至今的公共Unix Shell

关于SDF 最近发现了一个很古老的公共Unix Shell服务器,这个项目从1978年运行至今,如果对操作系统,对Unix感兴趣,可以进去玩一玩体验一下 SDF Public Access UNIX System - Free Shell Account and Shell Access 注册方式 我一…

关于Qt C++中connect的几种写法

目录 1. 传统的槽函数写法 2. 使用函数指针的connect写法(5.0) 3. Lambda表达式作为槽函数(C11) 4.使用QOverload选择重载信号的写法 这connect函数就像是编程世界里的“茴”字,千变万化,各有千秋。咱们…

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…

用jquery做一个websocket客户端

先看效果图&#xff1a; 功能很简单&#xff0c;就是作为客户端连接websocket&#xff0c;并实现接受和发送消息。具体代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"…

抽象java入门1.5.3.2——类的进阶(中)

前期回顾&#xff1a;抽象java入门1.5.3.1——类的进阶https://blog.csdn.net/c_yanxin_ru/article/details/140858898?spm1001.2014.3001.5501 总结&#xff1a; 在代码溯源中&#xff0c;我发现了一个奇怪的东西&#xff0c;就是OUT不是类中类&#xff08;不是常规类的写法…

蓝桥杯每日真题 - 第17天

题目&#xff1a;&#xff08;最大数字&#xff09; 题目描述&#xff08;13届 C&C B组D题&#xff09; 题目分析&#xff1a; 操作规则&#xff1a; 1号操作&#xff1a;将数字加1&#xff08;如果该数字为9&#xff0c;变为0&#xff09;。 2号操作&#xff1a;将数字…

Ease Monitor 会把基础层,中间件层的监控数据和服务的监控数据打通,从总体的视角提供监控分析

1. 产品定位 Ease Monitor 有如下的产品定位&#xff1a; 关注于整体应用的SLA。 主要从为用户服务的 API 来监控整个系统。 关联指标聚合。 把有关联的系统及其指示聚合展示。主要是三层系统数据&#xff1a;基础层、平台中间件层和应用层。 快速故障定位。 对于现有的系统…

3D Gaussian Splatting 代码层理解之Part2

现在让我们来谈谈高斯分布。我们已经在Part1介绍了如何根据相机的位置获取 3D 点并将其转换为 2D。在本文中,我们将继续处理高斯泼溅的高斯部分,这里用到的是代码库 GitHub 中part2。 我们在这里要做的一个小改动是,我们将使用透视投影,它利用与上一篇文章中所示的内参矩阵…