【问题标题】:Get textured pointcloud with Block-Matching-Algorithm使用块匹配算法获取纹理点云
【发布时间】:2015-11-12 09:57:11
【问题描述】:

我想用两个图像的原始图像颜色对生成的点云进行纹理处理。为此,我使用块匹配计算了视差图并进行了重建。为 .ply 文件编写导出函数也没什么大不了的。 我的问题是:如何从块匹配算法中获取颜色?它确实会在校正后的图像上寻找相似的像素,但没有变量可以保存找到的匹配位置,参考API。之后无法恢复颜色。

StereoBM sbm;
sbm(left_rectfied_image, right_rectified_image, disparity, CV_32F);

(我正在使用 OpenCV 2.4.8)

【问题讨论】:

    标签: c++ opencv stereo-3d stereoscopy disparity-mapping


    【解决方案1】:

    是的!您正在计算的视差图适用于校正后的左图像!您可以简单地为 3D 中的所有点使用左图像像素 XY 坐标值。例如

    reprojectImageTo3D(disp_32, xyz, Q, true);
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>); 
    const double max_z = 1.0e4;
    
    for (int Row = 0; Row < xyz.rows; Row++)
    {
        for (int Col = 0; Col < xyz.cols; Col++)
        {
            pcl::PointXYZRGB point;
            vec3b Pix;
            //Just taking the Z Axis alone
            Vec3f Depth= xyz.at<Vec3f>(Row,Col);
            point.x = Depth[0];
            point.y = Depth[1];
            point.z = Depth[2];
    
            if(fabs(Depth[2] - max_z) < FLT_EPSILON || fabs(Depth[2]) > max_z|| Depth[2] > 0) 
                continue;
    
            Pix= mCamFrame_Left.at<vec3b>(Row,Col);
    
            uint32_t rgb = (static_cast<uint32_t>(Pix.val[0]) << 16 |static_cast<uint32_t>(Pix.val[1]) << 8 | static_cast<uint32_t>(Pix.val[2]));
            point.rgb = *reinterpret_cast<float*>(&rgb);
            point_cloud_ptr->points.push_back (point);
        }
    }
    point_cloud_ptr->width = (int) point_cloud_ptr->points.size();
    point_cloud_ptr->height = 1;
    

    【讨论】:

    • 非常感谢您的及时帮助,您帮了我很多。很好的答案!
    猜你喜欢
    • 2022-12-05
    • 2011-06-22
    • 2012-04-19
    • 1970-01-01
    • 2015-04-23
    • 2020-04-11
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多