如何将RGB图像像素与相应的点云点进行匹配

问题描述 投票:0回答:1

我有一张彩色图像,由oak-D相机捕获的对应点云(见下图),我想获取彩色图像中的像素信息以及点云中对应的点云值。 我怎样才能得到这些信息?例如,我在彩色图像中有一个像素值(200,250),如何知道点云中相应的点值? 任何帮助将不胜感激。

image-processing computer-vision point-cloud-library luxonis
1个回答
0
投票

听起来您想使用计算的视差图将 2D 图像投影到 3D 点云。为此,您还需要了解相机的内部结构。由于您使用的是 Oak-D,因此您应该能够通过以下代码获得所需的一切。

with dai.Device(pipeline) as device:
    calibData = device.readCalibration()
    
    # get right intrinsic matrix
    w, h = monoRight.getResolutionSize()
    K_right = calibData.getCameraIntrinsics(dai.CameraBoardSocket.RIGHT, dai.Size2f(w, h))

    # get left intrinsic matrix
    w, h = monoLeft.getResolutionSize()
    K_left = calibData.getCameraIntrinsics(dai.CameraBoardSocket.LEFT, dai.Size2f(w, h))
    
    R_left = calibData.getStereoLeftRectificationRotation()
    R_right = calibData.getStereoRightRectificationRotation()
    x_baseline = calibData.getBaselineDistance()

一旦掌握了所有相机参数,您应该能够使用 opencv 来解决这个问题。

首先,您需要构造 Q 矩阵(或校正变换矩阵)。

您需要提供

  • 左右固有校准矩阵
  • 从第一个相机的坐标系到第二个相机的平移向量
  • 从第一个相机的坐标系到第二个相机的旋转矩阵

这是一个编码示例:

import numpy as np
import cv2

Q = np.zeros((4,4))
cv2.stereoRectify(cameraMatrix1=K_left,  # left intrinsic matrix
                  cameraMatrix2=K_right, # right intrinsic matrix
                  distCoeffs1=0,  
                  distCoeffs2=0,  
                  imageSize=imageSize, # pass in the image size 
                  R=R_left,            # Rotation matrix from camera 1 to camera 2
                  T=x_baseline,        # Translation matrix from camera 1 to camera 2          
                  R1=None, 
                  R2=None, 
                  P1= None, 
                  P2= None, 
                  Q=Q);

接下来,您需要使用已知的视差图和 Q 矩阵将图像重新投影为 3D。操作如下图所示,但 opencv 使这变得更容易。

xyz = cv2.reprojectImageTo3D(disparity, Q)

这将为您提供一系列 3D 点。该数组具体具有以下形状:(行、列、3),其中 3 对应于点云的 (x,y,z) 坐标。现在您可以使用像素位置来索引 xyz 并找到它对应的 (x, y, z) 点。

pix_row = 200
pix_col = 250
point_cloud_coordinate = xyz[pix_row, pix_col, :]

请参阅文档了解更多详细信息

© www.soinside.com 2019 - 2024. All rights reserved.