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

打印 上一主题 下一主题

主题 527|帖子 527|积分 1581

目次
一、depthai ROS驱动


一、depthai ROS驱动

(1)驱动下载地址:2. C++ 开辟快速上手 — DepthAI Docs 0.3.0.0 documentation
  1. sudo apt install ./depthai_2.17.1_arm64.deb
  2. //运行
  3. Python3 utilities/cam_test.py -mres 400 -cams rgb,m left,m right,m camd,m
复制代码
(2)或者运行python脚本打开相机
  1.       
  2. import depthai as dai
  3. import cv2
  4. cam_list = ["CAM_B", "CAM_C", "CAM_D","CAM_A"]
  5. cam_socket_opts = {
  6.     "CAM_A": dai.CameraBoardSocket.RGB,
  7.     "CAM_B": dai.CameraBoardSocket.LEFT,
  8.     "CAM_C": dai.CameraBoardSocket.RIGHT,
  9.     "CAM_D": dai.CameraBoardSocket.CAM_D,
  10. }
  11. pipeline = dai.Pipeline()
  12. cam = {}
  13. xout = {}
  14. for c in cam_list:
  15.     cam[c] = pipeline.create(dai.node.MonoCamera)
  16.     cam[c].setResolution(dai.MonoCameraProperties.SensorResolution.THE_800_P)
  17.     if c == "CAM_A":
  18.         cam[c].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.OUTPUT)
  19.     else:
  20.         cam[c].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.INPUT)
  21.     # cam[c].initialControl.setExternalTrigger(4, 3)
  22.     cam[c].setBoardSocket(cam_socket_opts[c])
  23.     cam[c].setFps(20)
  24.     xout[c] = pipeline.create(dai.node.XLinkOut)
  25.     xout[c].setStreamName(c)
  26.     cam[c].out.link(xout[c].input)
  27. config = dai.Device.Config()
  28. config.board.gpio[6] = dai.BoardConfig.GPIO(
  29.     dai.BoardConfig.GPIO.OUTPUT, dai.BoardConfig.GPIO.Level.HIGH
  30. )
  31. # config.version = dai.OpenVINO.VERSION_UNIVERSAL
  32. with dai.Device(config) as device:
  33.     device.startPipeline(pipeline)
  34.    
  35.     print('Connected cameras:')
  36.     for p in device.getConnectedCameraFeatures():
  37.         print(f' -socket {p.socket.name:6}: {p.sensorName:6} {p.width:4} x {p.height:4} focus:', end='')
  38.         print('auto ' if p.hasAutofocus else 'fixed', '- ', end='')
  39.         print(*[type.name for type in p.supportedTypes])
  40.         
  41.     q = {}
  42.     for c in cam_list:
  43.         q[c] = device.getOutputQueue(name=c, maxSize=1, blocking=False)
  44.         cv2.namedWindow(c, cv2.WINDOW_NORMAL)
  45.         cv2.resizeWindow(c, (640, 480))
  46.     while not device.isClosed():git clone https://github.com/ethz-asl/kalibr.git
  47.         frame_list = []
  48.         for c in cam_list:
  49.             pkt = q[c].tryGet()
  50.             if pkt is not None:
  51.                 print(c + ":", pkt.getTimestampDevice())
  52.                 frame_list.append((c, pkt.getCvFrame()))
  53.                 # cv2.imshow(c, frame)
  54.         if frame_list:
  55.             print("-------------------------------")
  56.             for c,frame in frame_list:
  57.                 cv2.imshow(c, frame)
  58.             
  59.         #print("-------------------------------")
  60.         key = cv2.waitKey(1)
  61.         if key == ord("q"):
  62.             break
  63.    
复制代码
(3)使用python脚本
  1. '''
  2.     func:驱动DepthAi套件的相机
  3.     by:2024.7.5
  4. '''
  5. import depthai as dai
  6. import cv2
  7. import queue
  8. class CamerDrive():
  9.     cam_list = ['rgb', 'left', 'right', 'camd']
  10.     cam_socket_opts = {}
  11.     pipeline = dai.Pipeline()
  12.     # 初始化两个字典,用于存储摄像头节点和XLinkOut节点
  13.     cam = {}
  14.     xout = {}
  15.     #
  16.     frameQueue = {}
  17.     device = None
  18.     # myFrameQueue = {}
  19.     # 构造函数
  20.     def __init__(self):
  21.         self.cam_socket_opts = {
  22.             'rgb': dai.CameraBoardSocket.RGB,  # Or CAM_A  板载接口名称可复用
  23.             'left': dai.CameraBoardSocket.LEFT,  # Or CAM_B
  24.             'right': dai.CameraBoardSocket.RIGHT,  # Or CAM_C
  25.             'camd': dai.CameraBoardSocket.CAM_D,
  26.         }
  27.     #     配置相机节点
  28.     def cameraNodeConfig(self):
  29.         for c in self.cam_list:
  30.             # 创建MonoCamera节点(注意:这里可能对于RGB摄像头需要改为ColorCamera)
  31.             self.cam[c] = self.pipeline.create(dai.node.MonoCamera)
  32.             # if c == 'rgb':
  33.             #     self.cam[c] = self.pipeline.create(dai.node.ColorCamera)
  34.             # 设置摄像头分辨率为800P
  35.             self.cam[c].setResolution(dai.MonoCameraProperties.SensorResolution.THE_800_P)
  36.             # 根据摄像头类型设置帧同步模式
  37.             if c == 'rgb':
  38.                 self.cam[c].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.OUTPUT)  # 输出同步模式
  39.             else:
  40.                 self.cam[c].initialControl.setFrameSyncMode(dai.CameraControl.FrameSyncMode.INPUT)  # 输入同步模式
  41.             # 设置摄像头连接到板载的哪个接口
  42.             self.cam[c].setBoardSocket(self.cam_socket_opts[c])
  43.             # 创建XLinkOut节点,用于将摄像头数据输出到主机
  44.             self.xout[c] = self.pipeline.create(dai.node.XLinkOut)
  45.             # 设置输出流的名称
  46.             self.xout[c].setStreamName(c)
  47.             # 将摄像头的输出链接到XLinkOut的输入
  48.             self.cam[c].out.link(self.xout[c].input)
  49.     def depthAIConfig(self):
  50.         config = dai.Device.Config()
  51.         # 将GPIO引脚6配置为输出模式,并设置初始电平为高
  52.         config.board.gpio[6] = dai.BoardConfig.GPIO(dai.BoardConfig.GPIO.OUTPUT,
  53.                                                     dai.BoardConfig.GPIO.Level.HIGH)
  54.         # 使用Device类创建一个设备实例,并传入之前配置的配置对象。同时,使用with语句确保设备在使用完毕后正确关闭。
  55.         # with dai.Device(config) as device:
  56.         self.device = dai.Device(config)
  57.             # 启动pipeline对象
  58.         self.device.startPipeline(self.pipeline)
  59.             # 遍历相机列表,为每个相机设置输出队列、OpenCV窗口,并初始化FPS计算对象。
  60.         for c in self.cam_list:
  61.             self.frameQueue[c] = self.device.getOutputQueue(name=c, maxSize=1, blocking=False)  # 获取相机输出队列,非阻塞模式
  62.             cv2.namedWindow(c, cv2.WINDOW_NORMAL)  # 为每个相机创建一个OpenCV窗口
  63.             cv2.resizeWindow(c, (640, 480))  # 调整窗口大小
  64.     def get_Frame(self):
  65.         while True:
  66.             for c in self.cam_list:
  67.                 # 尝试从输出队列中获取一帧数据。
  68.                 try:
  69.                     pkt = self.frameQueue[c].tryGet()
  70.                     if pkt is not None:
  71.                         # 将数据包转换为OpenCV的Mat对象并显示。
  72.                         frame = pkt.getCvFrame()
  73.                         cv2.imshow(c, frame)
  74.                     else:
  75.                         print('sda')
  76.                     key = cv2.waitKey(1)
  77.                     if key == ord('q'):
  78.                         break
  79.                 except:
  80.                     pass
  81. if __name__ == '__main__':
  82.     a = CamerDrive()
  83.     a.cameraNodeConfig()
  84.     a.depthAIConfig()
  85.     a.get_Frame()
复制代码
二、获取相机内参

1.安装depthai-ros

  1. mkdir -p dai_ws/src
  2. cd dai_ws/src
  3. git clone https://gitee.com/oakchina/depthai-ros.git
  4. cd ..
  5. source /opt/ros/melodic/setup.bash
  6. rosdep install --from-paths src --ignore-src -r -y
  7. catkin_make
  8. source devel/setup.bash
复制代码
2.执行相机对应的launch文件

  1. cd dai_ws
  2. source devel/setup.bash
  3. roslaunch depthai_examples mobile_publisher.launch camera_model:=OAK-D
复制代码
3.查看相机内参

  1. 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相机外参

  1. git clone https://gitee.com/oakchina/depthai.git
  2. python3 install_requirements.py
  3. //运行
  4. 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文件
  1. {
  2.     "board_config":
  3.     {
  4.         "name": "OAK-D",
  5.         "revision": "R1M0E1",
  6.         "cameras":{
  7.             "CAM_A": {
  8.                 "name": "rgb",
  9.                 "hfov": 89.5水平视场角
  10.                 "type": "color"相机类型
  11.             },
  12.             "CAM_B": {
  13.                 "name": "left",
  14.                 "hfov": 71.86,
  15.                 "type": "mono",
  16.                 "extrinsics": {
  17.                     "to_cam": "CAM_C",
  18.                     "specTranslation": {
  19.                         "x": -7.5,
  20.                         "y": 0,
  21.                         "z": 0
  22.                     },
  23.                     "rotation":{
  24.                         "r": 0,
  25.                         "p": 0,
  26.                         "y": 0
  27.                     }
  28.                 }
  29.             },
  30.             "CAM_C": {
  31.                 "name": "right",
  32.                 "hfov": 71.86,
  33.                 "type": "mono",
  34.                 "extrinsics": {
  35.                     "to_cam": "CAM_A",
  36.                     "specTranslation": {
  37.                         "x": 3.75,
  38.                         "y": 0,
  39.                         "z": 0
  40.                     },
  41.                     "rotation":{
  42.                         "r": 0,
  43.                         "p": 0,
  44.                         "y": 0
  45.                     }
  46.                 }
  47.             }
  48.         },
  49.         "stereo_config":{
  50.             "left_cam": "CAM_B",
  51.             "right_cam": "CAM_C"
  52.         }
  53.     }
  54. }
复制代码
标定效果












 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表