红外相机和RGB相机标定:实现两种模态数据融合

这篇具有很好参考价值的文章主要介绍了红外相机和RGB相机标定:实现两种模态数据融合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 前期准备

  1. RGB相机:森云智能SG2-IMX390,1个
  2. 红外相机:艾睿光电IR-Pilot 640X-32G,1个
  3. 红外标定板:https://item.taobao.com/item.htm?_u=jp3fdd12b99&id=644506141871&spm=a1z09.2.0.0.5f822e8dKrxxYI

2.操作步骤

2.1 采集标定数据

两种模态相机均未进行内参标定,如果发现原始图片畸变较大,可以先进行内参标定。数据采集代码如下,加热红外标定板后断电,移动标定板到合适的位置,按下s键,同时保存IR图和RG图

#!/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()
    # print(f"{time.time() - st_time}") 
    ret, rgb_frame = rgb_vid.read()
    print(f"{time.time() - st_time}") 
    
    # Display the resulting frame 
    height, width = ir_frame.shape[:2]
    #(512,1280)
    index = [2*i+1 for i in range(width//2)]
    vis_ir_frame = ir_frame[:,index,:]

    vis_rgb_frame = cv2.resize(rgb_frame, (640,512))
    cv2.imshow('IR frame', vis_ir_frame) 
    cv2.imshow('RGB frame', vis_rgb_frame) 

    key = cv2.waitKey(1) & 0xFF 
    if key == ord('q'): 
        break
    if key == ord('s'):
        cv2.imwrite(f"IR_{count}.png", vis_ir_frame)
        cv2.imwrite(f"RGB_{count}.png", vis_rgb_frame)
        count += 1
  
# After the loop release the cap object 
ir_vid.release() 
rgb_vid.release() 
# Destroy all the windows 
cv2.destroyAllWindows() 

2.2 进行标定

核心操作是调用opencv函数cv2.findHomography计算两个相机之间的单应性矩阵,代码如下

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cv2
import numpy as np

def find_chessboard(filename, pattern=(9,8), wind_name="rgb"):
    # read input image
    img = cv2.imread(filename)
    # cv2.imshow("raw", img)
    # img = cv2.undistort(img, camera_matrix, distortion_coefficients)

    # convert the input image to a grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # Find the chess board corners
    ret, corners = cv2.findChessboardCorners(gray, pattern, None)
    
    # if chessboard corners are detected
    if ret == True:
        # Draw and display the corners
        img = cv2.drawChessboardCorners(img, pattern, corners, ret)
        
        #Draw number,打印角点编号,便于确定对应点
        corners = np.ceil(corners[:,0,:])
        for i, pt in enumerate(corners): 
            cv2.putText(img, str(i), (int(pt[0]),int(pt[1])), cv2.FONT_HERSHEY_COMPLEX, 0.3, (0,255,0), 1)
        cv2.imshow(wind_name,img)

        return corners
    
    return None
        

if __name__ == '__main__' :
    idx = 2 #0~71
    rgb_img = cv2.imread(f"RGB_{idx}.png")
    t_img = cv2.imread(f"IR_{idx}.png")

    #chessboard grid nums in rgb ,注意观察,同一块标定板在RGB相机和红外相机中的格子说可能不一样
    rgb_width, rgb_height = 9, 8
    rgb_corners = find_chessboard(f"RGB_{idx}.png", (rgb_width, rgb_height), "rgb")

    #chessboard grid nums in thermal 
    thermal_width, thermal_height = 11, 8
    t_corners = find_chessboard(f"IR_{idx}.png", (thermal_width, thermal_height), "thermal")
    
    if rgb_corners is not None and t_corners is not None:
        # test the id correspondence between rgb and thermal corners
        rgb_idx = 27 #可视化一个点,确认取对应点的过程是否正确
        row, col = rgb_idx//rgb_width, rgb_idx%rgb_width
        t_idx = row*thermal_width + col + 1

        pt = rgb_corners[rgb_idx]
        cv2.putText(rgb_img, str(rgb_idx), (int(pt[0]),int(pt[1])), cv2.FONT_HERSHEY_COMPLEX, 0.3, (0,255,0), 1)
        pt = t_corners[t_idx]
        cv2.putText(t_img, str(t_idx), (int(pt[0]),int(pt[1])), cv2.FONT_HERSHEY_COMPLEX, 0.3, (0,255,0), 1)
        cv2.imshow(f"Point {rgb_idx} on rgb", rgb_img)
        cv2.imshow(f"Point {t_idx} on thermal", t_img)


        # Calculate Homography
        src_pts = []
        for rgb_idx in range(len(rgb_corners)):
            row, col = rgb_idx//9, rgb_idx%9
            t_idx = row*11+col+1
            src_pts.append(t_corners[t_idx])
        h, status = cv2.findHomography(np.array(src_pts)[:,None,:], rgb_corners[:,None,:])
        
        np.savetxt("calib.param", h)
    
        # Warp source image to destination based on homography
        t_warp = cv2.warpPerspective(t_img, h, (640,512), borderValue=(255,255,255))

        #colorize
        t_warp = cv2.applyColorMap(t_warp, cv2.COLORMAP_JET)

        #mix rgb and thermal
        alpha = 0.5
        merge = cv2.addWeighted(rgb_img, alpha, t_warp, 1-alpha, gamma=0)

        cv2.imshow("warp", merge)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果如下,观察红外和RGB图中角点的对应关系,编号已经可视化出来了

红外相机 标定,红外相机标定

同时,也单独画出了1个对应后的点,如下图,可检查映射关系是否找对

红外相机 标定,红外相机标定

最后,融合结果如下图所示:

红外相机 标定,红外相机标定文章来源地址https://www.toymoban.com/news/detail-853965.html

到了这里,关于红外相机和RGB相机标定:实现两种模态数据融合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【红外与可见光图像融合】离散平稳小波变换域中基于离散余弦变换和局部空间频率的红外与视觉图像融合方法(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码及文献 基于

    2024年02月07日
    浏览(44)
  • 张正友相机标定法原理与实现

    张正友相机标定法是张正友教授1998年提出的单平面棋盘格的相机标定方法。传统标定法的标定板是需要三维的,需要非常精确,这很难制作,而张正友教授提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来

    2024年02月04日
    浏览(44)
  • python opencv实现相机内参标定

    使用python opencv 标定相机内参。 (1)从网络上下载一张棋盘格图片,粘贴到word文档上,设定尺寸大小为合适值,作为标定板。 (2)在不同距离,不同角度下用手机相机拍摄棋盘图片。 (3)调用 opencv findChessboardCorners 和 cornerSubPix 函数提取棋盘的角点。 (4)调用 opencv cal

    2024年02月13日
    浏览(50)
  • 利用红外-可见光图像数据集OTCBVS打通图像融合、目标检测和目标跟踪

    本文记录在云服务器autodl上选择安装cuda、cudnn开始,部署相同视角、相同时间、相同地点拍摄的红外和可见光图像数据集OTCBVS在Github目前开源的图像融合PIAFusion、目标检测Yolo-v4、目标跟踪DeepSort算法上实现单数据集贯通。 本文只做到以下几点: 1、列举常见红外-可见光图像数

    2024年02月04日
    浏览(45)
  • 一步一步学OAK之三:实现RGB相机场景切换

    创建新建3-rgb-scene文件夹 用vscode打开该文件夹 新建一个main.py 文件 安装依赖前需要先创建和激活虚拟环境,我这里已经创建了虚拟环境OAKenv,在终端中输入cd…退回到OAKenv的根目录,输入 OAKenvScriptsactivate 激活虚拟环境 安装pip依赖项: 在main.py中导入项目需要的包

    2024年02月11日
    浏览(50)
  • Autoware实现相机和激光雷达联合标定

    1-编译 2-修改代码 打开CMakeLIsts.txt 将三处该行 if (\\\"${ROS_VERSION}\\\" MATCHES \\\"(indigo|jade|kinetic)\\\") 改为 if (\\\"${ROS_VERSION}\\\" MATCHES \\\"(indigo|jade|kinetic|melodic)\\\") 重新编译: 3-测试启动 输入命令,显示如下,则证明正常: 启动激光雷达: /velodyne_points /rslidar_points 启动相机: /camera/color/image_raw 设

    2024年01月19日
    浏览(42)
  • Astra深度相机在Ubuntu18.04系统下实现相机标定

    问题: 当使用Astra相机的启动的指令启动相机后,使用rviz查看相机所发布的rgb数据时,在终端会出现如下的提示信息: Camera calibration file /home/car/.ros/camera_info/rgb_Astra_Orbbec.yaml not found. Camera calibration file /home/car/.ros/camera_info/depth_Astra_Orbbec.yaml not found. 可以看到提示的信息为相机

    2024年04月09日
    浏览(49)
  • 使用opencv实现单目标定相机标定(摘抄)

    使用opencv实现单目标定 相机标定的目的 :获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。 相机标定的输入 :标定图像上所有内角点的图像坐标,标定板图

    2024年02月11日
    浏览(51)
  • 【OpenCv】相机标定介绍及python/c++实现

    之前有一个项目需要公司标内参,之前对这方面没有接触过,网上找了很多资料,记录下相机标定的基础知识。文章是个人浅显理解。如有错误还请指正,非常感谢! 参考链接: 坐标系转换:相机参数标定(camera calibration)及标定结果如何使用_Aoulun的博客-CSDN博客 标定ope

    2024年02月15日
    浏览(37)
  • 【QT/OpenCV】QT实现张正友相机标定

    01、相机标定 机器视觉是采用相机成像来实现对三维场景的测量、定位、重建等过程。也是一个利用二维图像进行三维反推的过程,我们所处的世界是三维的,而图像或者照片是二维的。我们可以把相机认为是一个函数,输入量是一个三维场景,输出量是一幅二维图像。 正常

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包