我有一张彩色图像,由oak-D相机捕获的对应点云(见下图),我想获取彩色图像中的像素信息以及点云中对应的点云值。 我怎样才能得到这些信息?例如,我在彩色图像中有一个像素值(200,250),如何知道点云中相应的点值? 任何帮助将不胜感激。
听起来您想使用计算的视差图将 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 来解决这个问题。
您需要提供
这是一个编码示例:
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, :]
请参阅文档了解更多详细信息