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

目录

一、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"
        }
    }
}

标定结果


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Wireshark 对 https 请求抓包并展示为明文

文章目录 1、目标2、环境准备3、Wireshark 基本使用4、操作步骤4.1、彻底关闭 Chrome 进程4.2、配置 SSLKEYLOGFILE [核心步骤]4.3、把文件路径配置到 Wireshark 指定位置4.4、在浏览器发起请求4.5、抓包配置4.6、过滤4.6.1、过滤域名 http.host contains "baidu.com4.6.2…

AIGC时代创意设计师从“创作”向“智作”升级

随着人工智能技术的飞速发展,AIGC(AI Generated Content,即人工智能生成内容)时代已经到来,为创意设计领域带来了前所未有的变革。在这一时代背景下,创意设计师们正经历着从传统的“创作”向“智作”的转型…

FreeRTOS 队列

队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存 储数量有限、大小固定的多个数据,队列中的每一个数据叫做队列项目,队列能够存储队列项 目的最大数量称为队列的长度,在创建队列的时候,就需要指…

html5——CSS基础选择器

目录 标签选择器 类选择器 id选择器 三种选择器优先级 标签指定式选择器 包含选择器 群组选择器 通配符选择器 Emmet语法&#xff08;扩展补充&#xff09; 标签选择器 HTML标签作为标签选择器的名称&#xff1a; <h1>…<h6>、<p>、<img/> 语…

在pycharm中使用jupyter

在pycharm中使用jupyter 前置条件&#xff1a;你的环境中应该有juptyer &#xff0c;没有的话 pip install jupyter 点击项目目录&#xff0c;右键->new->jupyter notebook 打开file settings 找到 jupyter server &#xff08;按照默认的用代理服务器就行&#xff09; P…

ollama + lobechat 搭建自己的多模型助手

背景 人工智能已经推出了快2年了&#xff0c;各种模型和插件&#xff0c;有渐渐变成熟的趋势&#xff0c;打造一个类似 hao123网站的人工智能模型入口&#xff0c;也变得有需求了。用户会去比较多个ai给出的答案&#xff0c;作为程序员想拥有一台自己的GPU服务器来为自己服务。…

react启用mobx @decorators装饰器语法

react如果没有经过配置&#xff0c;直接使用decorators装饰器语法会报错&#xff1a; Support for the experimental syntax ‘decorators’ isn’t currently enabled 因为react默认是不支持装饰器语法&#xff0c;需要做一些配置来启用装饰器语法。 step1: 在 tsconfig.js…

always块敏感列表的相关报错,

在综合的时候&#xff0c;报错如下 Synthesis synth_1 [Synth 8-91] ambiguous clock in event control ["E:/FPGA/FPGA_project/handwrite_fft/handwrite_fft.srcs/sources_1/new/reg_s2p.v":140] 猜测报错原因&#xff08;暂时没有时间寻找原因&#xff0c;后续在…

【linux】服务器卸载cuda

【linux】服务器卸载cuda 文章目录 【linux】服务器卸载cuda1、查找已安装的 CUDA 包&#xff1a;2、卸载 CUDA&#xff1a;3、删除残留文件4、更新系统的包索引&#xff1a;5、检查是否卸载干净&#xff1a; 1、查找已安装的 CUDA 包&#xff1a; dpkg -l | grep cuda2、卸载…

Unity之OpenXR+XR Interaction Toolkit实现 Gaze眼部追踪

使用 Unity OpenXR 实现Gaze眼部追踪 在虚拟现实(VR)和增强现实(AR)应用中,眼动追踪是一项强大而受欢迎的技术。它可以让开发者更好地理解用户的注意力和行为,并创造出更加沉浸和智能的体验。在本文中,我们将探讨如何使用 Unity OpenXR 实现Gaze眼部追踪功能。 Unity …

IEEE顶刊“放水”?稳居1区Top,发文扩张IF稳长,CCF推荐,审稿友好!

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • CCF推荐&#xff0c;4.5-5.0&#xff08;2天见刊&#xff09; • 生物医学制药类&#xff08;2天逢投必中&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09…

python3读取shp数据

目录 1 介绍 1 介绍 需要tmp.shp文件和tmp.dbf文件&#xff0c;需要安装geopandas第三方库&#xff0c;python3代码如下&#xff0c; import geopandas as gpdshp_file_path "tmp.shp" shp_data gpd.read_file(shp_file_path) for index, row in shp_data.iterro…

【Neo4j】实战 (数据库技术丛书)学习笔记

Neo4j实战 (数据库技术丛书) 第1章演示了应用Neo4j作为图形数据库对改进性能和扩展性的可能性, 也讨论了对图形建模的数据如何正好适应于Neo4j数据模型,现在到了该动 手实践的时间了。第一章 概述 Neo4j将数据作为顶点和边存储(或者用Neo4j术语,节点和关系存 储)。用户被定…

DSC主备归档报错

先看一个报错&#xff1a; 2024-07-10 22:12:21.725 [ERROR] database P0000003511 T0000000000000003696 rafil_list_overlap_consecutive_check failed, rfil(DMDATA/data/DSC02/arch/ARCHIVE_LOCAL1_0x57843343_EP1_2024-07-10_20-44-40.log)->next_seq(2901) > nex…

2.54插座开口朝板内还是板外?

答&#xff1a;开口朝板内。 这样无论是安装立式插座&#xff0c;还是卧式插座&#xff0c;引脚定义都一致。并且从左往右&#xff1a;1,2,3,4

Nordic 蓝牙5产品简介

蓝牙5.0 有四个重要的新功能&#xff1a; 更高的比特率为 2 Mbps。长距离模式在 500 kbps 和 125 kbps 两个新的较低比特率下具有更好的灵敏度。通过广告扩展&#xff0c;广播能力提高了 8 倍。改进的信道选择算法 (CSA #2)&#xff0c;可以提高与其他蓝牙和非蓝牙流量的信道协…

初识C++ | 基本介绍、命名空间、输入输出、缺省函数、函数重载、引用、内联函数、nullptr

基本介绍 C的起源 1979年&#xff0c;当时的 Bjarne Stroustrup 正在⻉尔实验室从事计算机科学和软件⼯程的研究⼯作。⾯对项⽬中复杂的软件开 发任务&#xff0c;特别是模拟和操作系统的开发⼯作&#xff0c;他感受到了现有语⾔&#xff08;如C语⾔&#xff09;在表达能⼒、可…

The First项目报告:创新型金融生态Lista DAO

一、Lista DAO是什么&#xff1f; LISTA是Lista DAO的原生加密协议代币&#xff0c;设计为一种可互操作的实用代币&#xff0c;旨在促进去中心化金融&#xff08;DeFi&#xff09;领域内的支付、治理与激励。LISTA的诞生源于Lista DAO项目&#xff0c;该项目是一个基于BNB链的…

修BUG:程序包javax.servlet.http不存在

貌似昨晚上并没有成功在tomcat上面运行&#xff0c;而是直接运行了网页。 不知道为啥又报错这个。。。 解决方案&#xff1a; https://developer.baidu.com/article/details/2768022 就整了这一步就行了 而且我本地就有这个tomcat就是加进去了。 所以说啊&#xff0c;是不是&a…

【Linux进阶】文件系统5——ext2文件系统(inode)

1.再谈inode (1) 理解inode&#xff0c;要从文件储存说起。 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。操作系统读取硬盘的时候&#xff0c;不会一个个…