OpenCV 可通過 cv::imread(path, cv::IMREAD_UNCHANGED) 讀取 16 位/32 位深度圖(如 PNG、TIFF、EXR 格式)。返回 Mat 單通道,像素值代表毫米或米級深度。
[R|t]。// 深度像素 (u_d, v_d) -> 3D 點 -> 投影到 RGB 像素 (u_rgb, v_rgb)
cv::Mat depth = imread("depth.png", IMREAD_UNCHANGED);
cv::Mat alignedDepth(rgbSize, CV_16U);
for (int v = 0; v < depth.rows; ++v) {
for (int u = 0; u < depth.cols; ++u) {
float z = depth.at(v, u) * depthScale;
if (z == 0) continue;
float x = (u - cx_d) * z / fx_d;
float y = (v - cy_d) * z / fy_d;
// 轉換到 RGB 相機座標系
cv::Mat p3d = (cv::Mat_(3,1) << x, y, z);
cv::Mat p3d_rgb = R * p3d + t;
float u_rgb = fx_rgb * p3d_rgb.at(0) / p3d_rgb.at(2) + cx_rgb;
float v_rgb = fy_rgb * p3d_rgb.at(1) / p3d_rgb.at(2) + cy_rgb;
// 雙線性插值填充
if (inRange(u_rgb, v_rgb)) alignedDepth.at(v_rgb, u_rgb) = depth.at(v, u);
}
}
rgbd::registerDepth 或 CUDA 並行化。CSDN 博客《OpenCV 深度圖配準實戰》:https://m.blog.csdn.net/blog/breeze5428/30055391