OAK相机:自动或手动设置相机参数

这篇具有很好参考价值的文章主要介绍了OAK相机:自动或手动设置相机参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

硬件

使用硬件如下:

  • 4✖️ov9782相机
  • OAK-FFC-4P驱动板

硬件接线参考博主的一篇博客:OAK相机:多相机硬件同步拍摄

软件

博主使用的是Ubuntu18.04系统,首先配置所需的python环境:
1、下载SDK软件包:

git clone https://gitee.com/oakchina/depthai.git

2、安装依赖:

python3 -m pip install -r depthai/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

3、注意:在Linux平台并且第一次使用OAK需要配置udev规则

echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666"' | sudo tee /etc/udev/rules.d/80-movidius.rules
sudo udevadm control --reload-rules && sudo udevadm trigger

相关python API可参考官方文档:https://docs.luxonis.com/projects/api/en/latest/references/python/#
在此博主提供一个示例:四个相机通过硬件触发同步,使用ROS发布图像消息,并可以自动或手动设置相机参数,更多设置可参考官方文档的API加以修改,完整程序如下:

# -*- coding: utf-8 -*-
#!/usr/bin/env python3
import depthai as dai
import yaml
import cv2
assert cv2.__version__[0] == '4', 'The fisheye module requires opencv version >= 3.0.0'
import numpy as np
import glob

NAME_LIST = ['cama', 'camb', 'camc', 'camd']

FPS = 20
AUTOSET = True

def clamp(num, v0, v1):
    return max(v0, min(num, v1))

class CameraArray:
    def __init__(self,fps=20):
        self.FPS = fps
        self.RESOLUTION = dai.ColorCameraProperties.SensorResolution.THE_800_P
        self.cam_list = ['cam_a', 'cam_b', 'cam_c', 'cam_d']
        self.cam_socket_opts = {
            'cam_a': dai.CameraBoardSocket.CAM_A,
            'cam_b': dai.CameraBoardSocket.CAM_B,
            'cam_c': dai.CameraBoardSocket.CAM_C,
            'cam_d': dai.CameraBoardSocket.CAM_D,
        }
        self.pipeline = dai.Pipeline()
        self.cam = {}
        self.xout = {}

        # color
        self.controlIn = self.pipeline.create(dai.node.XLinkIn)
        self.controlIn.setStreamName('control')
        for camera_name in self.cam_list:
            self.cam[camera_name] = self.pipeline.createColorCamera()
            self.cam[camera_name].setResolution(self.RESOLUTION)
            if camera_name == 'cam_a':  # ref trigger
                self.cam[camera_name].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.OUTPUT)
            else:  # other trigger
                self.cam[camera_name].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.INPUT)
            self.cam[camera_name].setBoardSocket(self.cam_socket_opts[camera_name])
            self.xout[camera_name] = self.pipeline.createXLinkOut()
            self.xout[camera_name].setStreamName(camera_name)
            self.cam[camera_name].isp.link(self.xout[camera_name].input)
            self.cam[camera_name].setFps(self.FPS)

        self.config = dai.Device.Config()
        self.config.board.gpio[6] = dai.BoardConfig.GPIO(dai.BoardConfig.GPIO.OUTPUT, dai.BoardConfig.GPIO.Level.HIGH)
        self.device = dai.Device(self.config)

    def start(self):
        self.device.startPipeline(self.pipeline)

        self.output_queue_dict = {}
        for camera_name in self.cam_list:
            self.output_queue_dict[camera_name] = self.device.getOutputQueue(name=camera_name, maxSize=1, blocking=False)

    def read_data(self):
        output_img = {}
        output_ts = {}
        for camera_name in self.cam_list:
            output_data = self.output_queue_dict[camera_name].tryGet()
            if output_data is not None:
                timestamp = output_data.getTimestampDevice()
                img = output_data.getCvFrame()
                # img = cv2.rotate(img, cv2.ROTATE_180)
                output_img[camera_name] = img
                output_ts[camera_name] = timestamp.total_seconds()
                # print(camera_name, timestamp, timestamp.microseconds, img.shape)
            else:
                # print(camera_name, 'No ouput')
                output_img[camera_name] = None
                output_ts[camera_name] = None
        return output_img, output_ts

if __name__ == '__main__':
    import rospy
    from sensor_msgs.msg import Image
    from std_msgs.msg import Header

    class CvBridge():
        def __init__(self):
            self.numpy_type_to_cvtype = {'uint8': '8U', 'int8': '8S', 'uint16': '16U',
                                            'int16': '16S', 'int32': '32S', 'float32': '32F',
                                            'float64': '64F'}
            self.numpy_type_to_cvtype.update(dict((v, k) for (k, v) in self.numpy_type_to_cvtype.items()))

        def dtype_with_channels_to_cvtype2(self, dtype, n_channels):
            return '%sC%d' % (self.numpy_type_to_cvtype[dtype.name], n_channels)

        def cv2_to_imgmsg(self, cvim, encoding = "passthrough"):
            img_msg = Image()
            img_msg.height = cvim.shape[0]
            img_msg.width = cvim.shape[1]
            if len(cvim.shape) < 3:
                cv_type = self.dtype_with_channels_to_cvtype2(cvim.dtype, 1)
            else:
                cv_type = self.dtype_with_channels_to_cvtype2(cvim.dtype, cvim.shape[2])
            if encoding == "passthrough":
                img_msg.encoding = cv_type
            else:
                img_msg.encoding = encoding

            if cvim.dtype.byteorder == '>':
                img_msg.is_bigendian = True
            img_msg.data = cvim.tobytes()
            img_msg.step = len(img_msg.data) // img_msg.height
            return img_msg

    bridge = CvBridge()

    img_pub_dict = {}
    rospy.init_node('camera_array', anonymous=True)
    rate = rospy.Rate(20)
    for camera_name in ['cam_a', 'cam_b', 'cam_c', 'cam_d']:
        img_pub_dict[camera_name] = rospy.Publisher('/img/'+str(camera_name), Image, queue_size=0)

    img_cnt_dict = {
        'cam_a':0, 'cam_b':0, 'cam_c':0, 'cam_d':0
    }
    camera_array = CameraArray(FPS)
    camera_array.start()

    controlQueue = camera_array.device.getInputQueue(camera_array.controlIn.getStreamName())
	
    if AUTOSET:
        ctrl = dai.CameraControl()
        ctrl.setAutoExposureEnable()
        ctrl.setAutoWhiteBalanceMode(dai.CameraControl.AutoWhiteBalanceMode.AUTO)
        controlQueue.send(ctrl)
    else:
		# Defaults and limits for manual focus/exposure controls
        expTime = 10000
        expMin = 1
        expMax = 33000
        
        sensIso = 100
        sensMin = 100
        sensMax = 1600
	
        wbManual = 3500
	    
        expTime = clamp(expTime, expMin, expMax)
        sensIso = clamp(sensIso, sensMin, sensMax)
        print("Setting manual exposure, time:", expTime, "iso:", sensIso)
        ctrl = dai.CameraControl()
        ctrl.setManualExposure(expTime, sensIso)
        ctrl.setManualWhiteBalance(wbManual)
        controlQueue.send(ctrl)

    first_time_cam = None
    first_time_local = None
    while not rospy.is_shutdown():
        output_img, output_ts = camera_array.read_data()
        
        if first_time_cam is None and output_ts['cam_a'] is not None:
            first_time_cam = output_ts['cam_a']
            first_time_local = rospy.Time.now().to_sec()
        
        for key in output_img.keys():
            if output_img[key] is None:
                continue
            frame = output_img[key]

            # convert
            img = bridge.cv2_to_imgmsg(undistorted_img, encoding="bgr8")
            img.header = Header()
            if first_time_cam is not None:
                ts = output_ts[key] - first_time_cam + first_time_local
                img.header.stamp = rospy.Time.from_sec(ts)
            else:
                img.header.stamp = rospy.Time.now()
            img_pub_dict[key].publish(img)
            
        rate.sleep()

将程序拷贝到本地,运行程序python camera.py;输入rostopic list,查看话题名;打开Rviz查看图像输出。文章来源地址https://www.toymoban.com/news/detail-702054.html

到了这里,关于OAK相机:自动或手动设置相机参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 计算机视觉:OpenCV相机标定

    针孔照相机模型是一种经典的相机模型,它将相机视为一个针孔,将场景中的点投影到成像平面上。在这个模型中,相机的 内参和外参 描述了相机的几何形状和相机的姿态。 相机的 内参矩阵 描述了相机的内部几何形状,包括相机的焦距、像素尺寸和像素坐标原点。相机的

    2024年01月19日
    浏览(63)
  • 计算机视觉基础(7)——相机基础

    从这一节开始,我们来学习 几何视觉 。中层视觉包括 相机模型、单目几何视觉、对极几何视觉和多目立体视觉等 。在学习几何视觉最开始,我们先来学习一下 相机模型 ,了解相机的基本原理,了解相机如何记录影像。 相机用于生成 二维的图像 ,图像最小的单元被称为

    2024年02月04日
    浏览(48)
  • 计算机视觉:多相机硬件同步拍摄

    目前主要有两种方法来同步不同传感器的信息(帧、IMU数据包、ToF等): 硬件同步(基于硬件信号触发,同步精度较高,需要硬件支持) 软件同步(基于时间戳或序列号同步,同步精度较低,无需硬件支持) 此博客重点介绍硬件同步,它允许在多个相机传感器之间精确同步

    2024年02月13日
    浏览(37)
  • 计算机视觉(相机标定;内参;外参;畸变系数)

    目录 一、预备知识 1、坐标系变换过程(相机成像过程) (1)相机坐标系转换为图像坐标系(透视投影变换遵循的是针孔成像原理) (2)齐次坐标的引入原因:(为什么引入齐次坐标???) 2、内参与外参矩阵的构成 3、畸变参数 二、相机标定 1、张正友标定法(光学标

    2024年02月07日
    浏览(49)
  • 【Matlab】相机标定(计算机视觉工具箱)

    图像处理和计算机视觉是Matlab的一个主要应用领域,这部分包括4个工具箱——图像处理、计算机视觉、雷达、医学图像。由于视觉的东西容易呈现,所以先从计算机视觉工具箱学起。 官方文档对计算机视觉工具箱的介绍如下:设计和测试计算机视觉、3D 视觉和视频处理系统

    2024年02月05日
    浏览(101)
  • 【计算机视觉】相机基本知识(还在更新)

    面阵相机则主要采用的 连续的、面状扫描光线 来实现产品的检测; 线阵相机即利用 单束扫描光 来进行物体扫描的工作的。 (1)面阵CCD工业相机: 优点 :应用面较广,如面积、形状、尺寸、位置,甚至温度等的测量。面阵CCD的优点是可以获取测量图像直观,二维图像信息

    2024年02月12日
    浏览(58)
  • 【计算机视觉】OpenCV实现单目相机标定

    文章目录 单目相机标定(基于Python OpenCV) 1.上期填坑 2.单目相机标定 2.1 数据采集 2.2 角点提取 2.3 参数求解 2.4 参数评估(重投影误差) 2.5 相机位姿(棋盘位姿)可视化 2.6 同Matlab标定结果比较 在开始本篇博客之前,先填一下上一篇博客【计算机视觉】基于ORB角点+RANSAC算法实现图像

    2023年04月18日
    浏览(56)
  • 计算机视觉算法中的 相机姿态估计(Camera Pose Estimation)

    目录 ​编辑引言 相机姿态估计的基本概念 相机姿态估计的方法 特征点匹配 直接法 基于深度学习的方法 相机姿态估计的应用 增强现实(AR) 机器人导航 三维重建 结论 相机姿态估计是计算机视觉领域的重要任务之一。它涉及到确定相机在三维空间中的位置和朝向,常用于

    2024年02月05日
    浏览(49)
  • 计算机视觉中的三维重建:基于激光雷达与相机的方法

    作者:禅与计算机程序设计艺术 近年来,随着激光雷达、相机等传感器的广泛应用,三维重建技术逐渐成为热门研究方向。三维重建技术可以从多种角度帮助我们理解世界,并进行精准定位、建筑物三维模型化、环境规划、自然现象研究以及各种各样的应用。 但由于三维重

    2024年03月22日
    浏览(48)
  • 【计算机视觉:算法和应用】第二章:图像形成——2.3数码相机

    2.1几何图元与变换 2.2相机辐射成像        从一个或多个光源开始,在世界中一个或多个表面反射并通过相机镜头后,光最终到达成像传感器。到达传感器的光子是如何转换为我们在数字图像上看到的数字(R,G,B)值的呢?在这一节,我们构建了一个简单的模型来解释大多数

    2024年01月19日
    浏览(63)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包