3D点云处理:数据集生成点云

文章目录

  • 点云结果
  • 1. 数据集
  • 2. 生成点云
    • 2.1 生成点云代码

点云结果

3D点云处理:数据集生成点云_第1张图片
生成的点云数据

1. 数据集

      数据集来源:T-LESS 。下载的数据分别是itodd_test_all 和tless_test_primesense_all。

2. 生成点云

      通过文件夹中的“scene_camera.json”获取相机内参,并通过C++\Opencv加载图像,使用Pcl生成点云。

  • 注意:图像的格式为32位的tif格式,需要正确使用Opencv读取。

2.1 生成点云代码

cv::Mat depthImg = cv::imread(toString(file), cv::IMREAD_LOAD_GDAL | cv::IMREAD_ANYDEPTH);
if (depthImg.empty()) {
    qDebug() << "depthImg empty";
}
const float fx = 1075.65091572;
const float fy = 1073.90347929;
const float cx = 373.06888344;
const float cy = 257.72159802;
if (depthImg.empty()) {
    qWarning().noquote() << "The input depth image is empty.";
    return;
}

auto pointCloud = std::make_shared<pcl::PointCloud<pcl::PointXYZ>>();
// 有序点云
pointCloud->width = depthImg.cols;
pointCloud->height = depthImg.rows; // 如果是无序点云,此处设置为1
pointCloud->resize(pointCloud->width * pointCloud->height);

depthImg.forEach<float>([&](const float value, const int* pts) {
    const int r = pts[0];
    const int c = pts[1];

    const float z = value;
    const float x = z * (c - cx) / fx;
    const float y = z * (r - cy) / fy;
    pointCloud->at(c, r).getVector3fMap() = Eigen::Vector3f(x, y, z);
});

你可能感兴趣的:(3D视觉,3d,opencv,人工智能)