OpenCV正交投影实现顶视坐标系RGBD图像变换问题
问题描述
现有输入条件
- 分辨率为480×848像素的彩色图像
- 与彩色图像对齐、分辨率同为480×848像素的深度图像
- 完整的相机内参
- 相机坐标系到物体顶部自定义坐标系的位姿变换矩阵
场景需求
相机以倾斜角度朝向目标物体拍摄,已在物体顶部定义目标参考坐标系,需要将相机采集的彩色图像、深度图像变换到该顶部坐标系下,模拟相机安装在该顶部坐标系位置正对拍摄的效果。
目前可通过深度图像结合相机参数解算得到无颜色信息的3D点云(包含各点x、y、z三维坐标),计划将映射了颜色信息的3D点变换到顶部坐标系下;由于3D点对应三维空间中的真实物理点,判断该变换属于正交投影范畴。
现有实现代码
import numpy as np import cv2 as cv print(cv.__version__) # 输出: '4.2.0' image = cv.imread("image.png") print(image.shape, image.dtype) # 输出: ((480, 848, 3), dtype('uint8')) depth = cv.imread("depth.png", cv.CV_16UC1) print(depth.shape, depth.dtype) # 输出: ((480, 848), dtype('uint16')) mask = np.ones_like(depth) * 255 mask = mask.astype(np.uint8) print(mask.shape, mask.dtype) # 输出: ((480, 848), dtype('uint8')) # 定义相机坐标系到顶部自定义坐标系的变换矩阵 Rt = np.array([[ 1. , -0. , 0. , 0. ], [ 0. , 0.89867918, 0.43860659, -0.191 ], [-0. , -0.43860659, 0.89867918, 0.066 ], [ 0. , 0. , 0. , 1. ]]) # 相机焦距与主点参数 cameraMatrix = np.array([[ 428.12915039, 0, 418.72729492 ], [ 0, 427.6109314, 238.20678711 ], [ 0, 0, 1 ]]) # 相机畸变参数 (k1, k2, t1, t2, k3) distCoeff = np.array([-0.05380916, 0.0613398, -0.00064336, 0.00040269, -0.01984365]) warpedImage, warpedDepth, warpedMask = cv.rgbd.warpFrame(image, depth, mask, Rt, cameraMatrix, distCoeff) cv.imwrite("warpedImage.png", warpedImage) cv.imwrite("warpedDepth.png", warpedDepth)
效果偏差说明
- 坐标系定义:相机位于
camera_color_optical_frame坐标系,光轴倾斜朝向目标物体;物体顶部目标坐标系命名为my_frame;目标物体放置于workspace frame参考坐标系下。 - 当前输出问题:现有代码生成的变换后图像存在物体侧壁红色区域,不符合预期。
- 预期输出要求:输出图像需近似为相机安装在顶部位置正对物体拍摄的正交投影视图,视图中仅呈现物体顶面内容,无侧壁区域。
内容的提问来源于stack exchange,提问作者ravi
相关产品推荐
相关产品推荐

