红外相机和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_

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

python 复制代码
#!/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文件

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

python 复制代码
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格式,可用以下代码进行检验

python 复制代码
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区域 | 鼠标滚轮 | 放大/缩小图片 |
| 红外区域/RGB区域 | 鼠标左键 | 在图像上加点 |
| 红外区域/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

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

相关推荐
小俊俊的博客6 天前
使用Opencv对监控相机进行内参标定记录
opencv·相机标定
亦枫Leonlew1 个月前
三维测量与建模笔记 - 3 Python Opencv实现相机标定
笔记·python·opencv·相机标定
亦枫Leonlew1 个月前
三维测量与建模笔记 - 3.3 张正友标定法
笔记·相机标定·三维重建·张正友标定法
路明呦呦2 个月前
【双目视觉标定】——3面结构光相机标定实践(获取相机内参)~未完待续
计算机视觉·相机标定
路明呦呦2 个月前
【双目视觉标定】——1原理与实践
计算机视觉·相机标定
1037号森林里一段干木头2 个月前
相机外参与相机位姿深度理解
数学·计算机视觉·slam·相机标定
charlee443 个月前
一次实践:给自己的手机摄像头进行相机标定
opencv·相机标定·张正友标定法
404detective4 个月前
Matlab R2022b使用Camera Calibrator工具箱张正友标定法进行相机标定附带标定前后对比代码
matlab·相机标定·camera·深度相机·张正友标定法·calibrator·棋盘法
长沙红胖子Qt4 个月前
项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视频文件和网络地址,支持标定过程查看、删除和动态评价误差率,支持追加标定等等)
qt·opencv·相机标定·畸变矫正·动态标定过程