繁体   English   中英

如何将深度图转换为 cv::rgbd::RgbdNormals 的 3D 点

[英]how to convert depth map to 3D points for cv::rgbd::RgbdNormals

我正在尝试使用 OpenCV 计算表面法线。 下面是代码片段:

// load 16bit uchar depth image (values are in millimeters)
cv::Mat img = cv::imread("depth.png", CV_16UC1);

// define our camera matrix
cv::Mat k = (cv::Mat1d(3, 3) << 900, 0, 640, 0, 900, 360, 0, 0, 1);

// compute surface normals
cv::Mat normals;
cv::rgbd::RgbdNormals normal_computer(img.rows, img.cols, CV_32F, k, 3);
normal_computer(img, normals);

std::cout << "normals" << std::endl
          << normals << std::endl
          << normals.size() << std::endl
          << normals.channels() << std::endl
          << std::endl;

不幸的是,它显示以下错误:

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.2.0) ../contrib/modules/rgbd/src/normal.cpp:776: error: (-215:Assertion failed) points3d_ori.channels() == 3 in function 'operator()'

Aborted (core dumped)

根据文档,输入点应该是 CV_32F/CV64F 的行 x 列 x 3 矩阵或行 x 列 x 1 CV_U16S。

因此,我的问题是如何将深度图像转换为上述合适的格式(即 CV_32F/CV64F 的行 x cols x 3 矩阵或行 x cols x 1 CV_U16S)

PS:我在 Ubuntu 20.04 LTS 上使用 OpenCV v4.2.0。

原来OpenCV中有一个叫depthTo3d的函数来做这个转换。 请看以下代码片段:

  cv::Mat points3d;
  cv::rgbd::depthTo3d(img, k, points3d);

转换后,这些点应作为输入给出,如下所示:

normal_computer(points3d, normals);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM