opencv c++ 深度图生成点云
时间: 2023-10-13 08:06:43 浏览: 318
要生成点云,您需要使用OpenCV中的reprojectImageTo3D函数。以下是一个简单的代码示例:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
// 加载深度图
Mat depth_img = imread("depth.png", IMREAD_ANYDEPTH);
// 相机内参
double fx = 518.0;
double fy = 519.0;
double cx = 325.5;
double cy = 253.5;
// 生成点云
Mat Q = Mat(4, 4, CV_64FC1);
Q.at<double>(0, 0) = 1.0;
Q.at<double>(0, 1) = 0.0;
Q.at<double>(0, 2) = 0.0;
Q.at<double>(0, 3) = -cx;
Q.at<double>(1, 0) = 0.0;
Q.at<double>(1, 1) = 1.0;
Q.at<double>(1, 2) = 0.0;
Q.at<double>(1, 3) = -cy;
Q.at<double>(2, 0) = 0.0;
Q.at<double>(2, 1) = 0.0;
Q.at<double>(2, 2) = 0.0;
Q.at<double>(2, 3) = fx;
Q.at<double>(3, 0) = 0.0;
Q.at<double>(3, 1) = 0.0;
Q.at<double>(3, 2) = -1.0 / 0.1; // 深度图缩放因子
Q.at<double>(3, 3) = (cx - 320.0) / 0.1; // 偏移量
Mat point_cloud;
reprojectImageTo3D(depth_img, point_cloud, Q);
// 显示点云
viz::Viz3d window("Point Cloud");
viz::WCloud cloud_widget(point_cloud, viz::Color::green());
window.showWidget("Point Cloud", cloud_widget);
window.spin();
return 0;
}
```
其中,深度图以16位无符号整数格式加载。相机内参是指相机的焦距和光心,这些参数通常可以从相机的说明书中找到。Q矩阵用于将深度图中的像素坐标转换为3D点的坐标。最后,使用Viz3D可视化点云。
阅读全文