oak相机使用oak官网方式标定

news2025/5/31 19:00:23

目录

一、depthai ROS驱动


一、depthai ROS驱动

(1)驱动下载地址:2. C++ 开发快速上手 — DepthAI Docs 0.3.0.0 documentation

sudo apt install ./depthai_2.17.1_arm64.deb
//运行
Python3 utilities/cam_test.py -mres 400 -cams rgb,m left,m right,m camd,m

(2)或者运行python脚本打开相机

      
import depthai as dai
import cv2

cam_list = ["CAM_B", "CAM_C", "CAM_D","CAM_A"]
cam_socket_opts = {
    "CAM_A": dai.CameraBoardSocket.RGB,
    "CAM_B": dai.CameraBoardSocket.LEFT,
    "CAM_C": dai.CameraBoardSocket.RIGHT,
    "CAM_D": dai.CameraBoardSocket.CAM_D,
}

pipeline = dai.Pipeline()
cam = {}
xout = {}
for c in cam_list:
    cam[c] = pipeline.create(dai.node.MonoCamera)
    cam[c].setResolution(dai.MonoCameraProperties.SensorResolution.THE_800_P)

    if c == "CAM_A":
        cam[c].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.OUTPUT)
    else:
        cam[c].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.INPUT)
    # cam[c].initialControl.setExternalTrigger(4, 3)
    cam[c].setBoardSocket(cam_socket_opts[c])
    cam[c].setFps(20)
    xout[c] = pipeline.create(dai.node.XLinkOut)
    xout[c].setStreamName(c)
    cam[c].out.link(xout[c].input)

config = dai.Device.Config()
config.board.gpio[6] = dai.BoardConfig.GPIO(
    dai.BoardConfig.GPIO.OUTPUT, dai.BoardConfig.GPIO.Level.HIGH
)
# config.version = dai.OpenVINO.VERSION_UNIVERSAL

with dai.Device(config) as device:
    device.startPipeline(pipeline)
    
    print('Connected cameras:')

    for p in device.getConnectedCameraFeatures():
        print(f' -socket {p.socket.name:6}: {p.sensorName:6} {p.width:4} x {p.height:4} focus:', end='')
        print('auto ' if p.hasAutofocus else 'fixed', '- ', end='')
        print(*[type.name for type in p.supportedTypes])
        
    q = {}
    for c in cam_list:
        q[c] = device.getOutputQueue(name=c, maxSize=1, blocking=False)
        cv2.namedWindow(c, cv2.WINDOW_NORMAL)
        cv2.resizeWindow(c, (640, 480))

    while not device.isClosed():git clone https://github.com/ethz-asl/kalibr.git

        frame_list = []
        for c in cam_list:
            pkt = q[c].tryGet()
            if pkt is not None:
                print(c + ":", pkt.getTimestampDevice())
                frame_list.append((c, pkt.getCvFrame()))
                # cv2.imshow(c, frame)
        if frame_list:
            print("-------------------------------")
            for c,frame in frame_list:
                cv2.imshow(c, frame)
            
        #print("-------------------------------")

        key = cv2.waitKey(1)
        if key == ord("q"):
            break
    

(3)使用python脚本

'''
    func:驱动DepthAi套件的相机
    by:2024.7.5
'''
import depthai as dai
import cv2
import queue
class CamerDrive():
    cam_list = ['rgb', 'left', 'right', 'camd']
    cam_socket_opts = {}
    pipeline = dai.Pipeline()
    # 初始化两个字典,用于存储摄像头节点和XLinkOut节点
    cam = {}
    xout = {}
    #
    frameQueue = {}
    device = None

    # myFrameQueue = {}
    # 构造函数
    def __init__(self):
        self.cam_socket_opts = {
            'rgb': dai.CameraBoardSocket.RGB,  # Or CAM_A  板载接口名称可复用
            'left': dai.CameraBoardSocket.LEFT,  # Or CAM_B
            'right': dai.CameraBoardSocket.RIGHT,  # Or CAM_C
            'camd': dai.CameraBoardSocket.CAM_D,
        }

    #     配置相机节点
    def cameraNodeConfig(self):
        for c in self.cam_list:
            # 创建MonoCamera节点(注意:这里可能对于RGB摄像头需要改为ColorCamera)
            self.cam[c] = self.pipeline.create(dai.node.MonoCamera)
            # if c == 'rgb':
            #     self.cam[c] = self.pipeline.create(dai.node.ColorCamera)
            # 设置摄像头分辨率为800P
            self.cam[c].setResolution(dai.MonoCameraProperties.SensorResolution.THE_800_P)
            # 根据摄像头类型设置帧同步模式
            if c == 'rgb':
                self.cam[c].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.OUTPUT)  # 输出同步模式
            else:
                self.cam[c].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.INPUT)  # 输入同步模式
            # 设置摄像头连接到板载的哪个接口
            self.cam[c].setBoardSocket(self.cam_socket_opts[c])
            # 创建XLinkOut节点,用于将摄像头数据输出到主机
            self.xout[c] = self.pipeline.create(dai.node.XLinkOut)
            # 设置输出流的名称
            self.xout[c].setStreamName(c)
            # 将摄像头的输出链接到XLinkOut的输入
            self.cam[c].out.link(self.xout[c].input)

    def depthAIConfig(self):
        config = dai.Device.Config()
        # 将GPIO引脚6配置为输出模式,并设置初始电平为高
        config.board.gpio[6] = dai.BoardConfig.GPIO(dai.BoardConfig.GPIO.OUTPUT,
                                                    dai.BoardConfig.GPIO.Level.HIGH)
        # 使用Device类创建一个设备实例,并传入之前配置的配置对象。同时,使用with语句确保设备在使用完毕后正确关闭。
        # with dai.Device(config) as device:
        self.device = dai.Device(config)
            # 启动pipeline对象
        self.device.startPipeline(self.pipeline)
            # 遍历相机列表,为每个相机设置输出队列、OpenCV窗口,并初始化FPS计算对象。
        for c in self.cam_list:
            self.frameQueue[c] = self.device.getOutputQueue(name=c, maxSize=1, blocking=False)  # 获取相机输出队列,非阻塞模式
            cv2.namedWindow(c, cv2.WINDOW_NORMAL)  # 为每个相机创建一个OpenCV窗口
            cv2.resizeWindow(c, (640, 480))  # 调整窗口大小


    def get_Frame(self):
        while True:
            for c in self.cam_list:
                # 尝试从输出队列中获取一帧数据。
                try:
                    pkt = self.frameQueue[c].tryGet()
                    if pkt is not None:
                        # 将数据包转换为OpenCV的Mat对象并显示。
                        frame = pkt.getCvFrame()
                        cv2.imshow(c, frame)
                    else:
                        print('sda')
                    key = cv2.waitKey(1)
                    if key == ord('q'):
                        break
                except:
                    pass

if __name__ == '__main__':
    a = CamerDrive()
    a.cameraNodeConfig()
    a.depthAIConfig()
    a.get_Frame()

二、获取相机内参

1.安装depthai-ros

mkdir -p dai_ws/src
cd dai_ws/src
git clone https://gitee.com/oakchina/depthai-ros.git
cd ..
source /opt/ros/melodic/setup.bash
rosdep install --from-paths src --ignore-src -r -y
catkin_make
source devel/setup.bash

2.执行相机对应的launch文件

cd dai_ws
source devel/setup.bash
roslaunch depthai_examples mobile_publisher.launch camera_model:=OAK-D

3.查看相机内参

rostopic echo -n 1 /mobilenet_publisher/color/camera_info

4.相机内参结果

相机内参Intrinsics: k表示等距畸变系数,mu,mv对应焦距,v,u对应主点坐标。 相机外参Extrinsics(从右目往左目): rotation表示旋转矩阵, translation表示平移矩阵。 D、K、R、P 分别为畸变参数,内参矩阵,矫正矩阵,投影矩阵。

seq: 0

stamp:

secs: 1719912958

nsecs: 823117551

frame_id: "oak_rgb_camera_optical_frame"

height: 720

width: 1280

distortion_model: "plumb_bob"

畸变参数D: [-1.87286, 16.683033, 0.001053, -0.002063, 61.878521, -2.158907, 18.424637, 57.682858, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

内参矩阵 K: [1479.458984, 0.0, 950.694458, 0.0, 1477.587158, 530.697632, 0.0, 0.0, 1.0]

R: [0.9997062937394856, -0.023389961528659683, 0.006343181957754751, 0.0233922879452606, 0.999726320114537, -0.0002928052810344399, -0.006334597252184302, 0.0004411008211352551, 0.9999798389506251]

P: [1479.458984, 0.0, 950.694458, 0.0, 0.0, 1477.587158, 530.697632, 0.0, 0.0, 0.0, 1.0, 0.0]

binning_x: 0

binning_y: 0

roi:

x_offset: 0

y_offset: 0

height: 0

width: 0

do_rectify: False

---

三、OAK相机外参

git clone https://gitee.com/oakchina/depthai.git
python3 install_requirements.py
//运行
python3 calibrate.py -s 2.75 -ms 2.05 -brd OAK-D -cd 0 -c 1 -mst 1

-db:表示默认板,表示你正在使用 Charuco 标记。

  • -nx:x 方向上的 Charuco 标记数。

  • -c:每次显示多边形时拍摄的照片数量(可选,建议在你的情况下省略)。

  • -cd:拍摄照片前的倒计时时间(以秒为单位)(可选,建议用于更快的图像校准)。

  • -s:Charuco 标记周围的正方形大小(以厘米为单位)。

  • -ms:标记的大小(以厘米为单位)。

  • -brd:设备的板(在本例中为 OAK-D-SR-POE)

修改其json文件

{
    "board_config":
    {
        "name": "OAK-D",
        "revision": "R1M0E1",
        "cameras":{
            "CAM_A": {
                "name": "rgb",
                "hfov": 89.5水平视场角
                "type": "color"相机类型
            },
            "CAM_B": {
                "name": "left",
                "hfov": 71.86,
                "type": "mono",
                "extrinsics": {
                    "to_cam": "CAM_C",
                    "specTranslation": {
                        "x": -7.5,
                        "y": 0,
                        "z": 0
                    },
                    "rotation":{
                        "r": 0,
                        "p": 0,
                        "y": 0
                    }
                }
            },
            "CAM_C": {
                "name": "right",
                "hfov": 71.86,
                "type": "mono",
                "extrinsics": {
                    "to_cam": "CAM_A",
                    "specTranslation": {
                        "x": 3.75,
                        "y": 0,
                        "z": 0
                    },
                    "rotation":{
                        "r": 0,
                        "p": 0,
                        "y": 0
                    }
                }
            }
        },
        "stereo_config":{
            "left_cam": "CAM_B",
            "right_cam": "CAM_C"
        }
    }
}

标定结果


 

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

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

相关文章

【2】kettle使用的小细节——输出数据分发和复制

在进行地铁数据清洗时,遇到3组线路: 出现的问题:程序运行到 增加序列 组件还有396条数据记录,但是在排序记录中只有 132条数据,即对3条线路进行了分发,各发送了132条数据。 断开这三条连接,重新…

对智能的研究正在悄悄地诱发复杂取代科学

随着智能人工智能的发展,传统科学研究方法可能面临新的挑战或者被扩展。人工智能的发展带来了大数据分析、机器学习、深度学习等新的工具和方法,这些方法在处理复杂系统和大规模数据方面表现出色,使得科学研究变得更加多样化和复杂化。对智能…

市面上护眼台灯哪个牌子最好?五款必须入手的护眼台灯分享

护眼台灯最终都绕不开护眼这个话题。护眼灯作为保护视力的辅助工具,以有效护眼的价值深受大众青睐。学生长时间用眼,普通台灯的伤害大,而护眼台灯的出现,通过其先进的技术和设计,能为学生提供了一个既舒适又健康的照明…

WPF/C#:在WPF中如何实现依赖注入

前言 本文通过 WPF Gallery 这个项目学习依赖注入的相关概念与如何在WPF中进行依赖注入。 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于实现控制反转(Inversion of Control&#xff0…

Python高层神经网络 API库之Keras使用详解

概要 随着深度学习在各个领域的广泛应用,许多开发者开始使用各种框架来构建和训练神经网络模型。Keras 是一个高层神经网络 API,使用 Python 编写,并能够运行在 TensorFlow、CNTK 和 Theano 之上。Keras 旨在简化深度学习模型的构建过程,使得开发者能够更加专注于实验和研…

公司内部配置GitLab,通过SSH密钥来实现免密clone、push等操作

公司内部配置GitLab,通过SSH密钥来实现免密clone、push等操作。以下是配置SSH密钥以实现免密更新的步骤: 1.生成SSH密钥 在本地计算机上打开终端或命令提示符。输入以下命令以生成一个新的SSH密钥:ssh-keygen -t rsa -b 4096 -C "your…

一文清晰了解表格表单

一、表格 要想实现下述内容&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"GBK"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第59-agent自动获取喵星人资讯并保存至云文件夹

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第59-agent自动获取喵星人资讯并保存至云文件夹 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由Java…

springboot仪器校准系统-计算机毕业设计源码51504

摘 要 随着科技的不断发展。测量设备的准确性和可靠性对于各行各业都至关重要。仪器校准系统作为确保测量设备性能的重要手段&#xff0c;已成为工业生产、科学研究、质量控制等领域不可或缺的一部分。本文对仪器校准系统进行了概述&#xff0c;探讨了校准方法、流程、特点、应…

等保2.0丨5分钟速览:小白都能理解的等保2.0简介

等保2.0的概念 等保2.0全称网络安全等级保护2.0制度&#xff0c;是我国网络安全领域的基本国策、基本制度。以1.0的规范为基础&#xff0c;等级保护标准以积极的防御为重点&#xff0c;由被动的防御发展为安全可信、动态感知和全过程的事前、事中和事后的全过程的全方位的审核…

解决MCM功率电源模块EMC的关键

对MCM功率电源而言&#xff0c;由于其工作在几百kHz的高频开关状态&#xff0c;故易成为干扰源。电磁兼容性EMC&#xff08;Electro Magnetic Compatibility&#xff09;&#xff0c;是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的…

STM32 - DOG看门狗笔记

WDG&#xff08;Watchdog&#xff09;看门狗 作用&#xff1a; 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#x…

蓝队必备技能--yara-让自己编写AVVT

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

STM32G4 DMA的使用(寄存器开发)

下面以STM32G474为例&#xff0c;使用DMA来存储USART1的接收数据。 1. 查看硬件支持 首先查看要使用的DMA支持的通道数&#xff0c;在手册中有如下说明。 根据上图可以看到&#xff0c;对于不同的设备类型有不同的DMA通道数量。设备类型分类如下图所示。 我使用的是STM32G474…

springboot乡镇医院管理系统-计算机毕业设计源码51697

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2研究现状 1.3论文结构与章节安排 2 SpringBoot乡镇医院管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3…

spark基于Spark的对招聘信息的分析与设计-计算机毕业设计源码50716

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设计 3.1 系统架构设…

大模型之战进入新赛季,开始卷应用

最近一段时间&#xff0c;国产大模型Kimi彻底火了&#xff0c;而这波爆火&#xff0c;某种意义上也展示了一个问题&#xff0c;即大模型的落地场景可能比技术比拼&#xff0c;更重要。 国产大模型Kimi突然爆火&#xff0c;与Kimi相关的产业链甚至被冠上“Kimi概念股”之名&…

MES系统助力塑料制品行业数字化转型

注塑MES系统助力工厂生产力提升具体体现在&#xff1a;覆盖生产全流程&#xff1b;数据自动收集、科学规划排产&#xff1b;优化配送模型、平衡物流运转&#xff1b;严格把控品质、异常自动分析&#xff1b;实时监控设备&#xff0c;保证正常运转&#xff1b;产品快速追溯&…

uniapp 九宫格抽奖

<template><view class"container"><view class"navleft" click"navback"><image src"/static/cj/left.png" mode""></image></view><view class"navtitle">抽奖</…

鸿蒙应用开发之Counter容器

前面学习了纵向容器,现在来学习一个计数器的容器,就是说这个容器显示增加或减少,但数值会显示一个文本组件内,如下图所示: 上面组件中间显示5的组件是一个文本组件,边上提供了增减的按钮。 它有两个事件组件,用来响应边上两个按钮: 要在文本组件里显示出来,需要定义一…