Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 如何将cv::Mat转换为pcl::pointcloud_Opencv_Converter_Point Cloud Library - Fatal编程技术网

Opencv 如何将cv::Mat转换为pcl::pointcloud

Opencv 如何将cv::Mat转换为pcl::pointcloud,opencv,converter,point-cloud-library,Opencv,Converter,Point Cloud Library,如何从opencv Mat pointcloud到pcl::pointcloud?颜色对我来说并不重要,只是点本身 您可以这样做: pcl::PointCloud<pcl::PointXYZ>::Ptr SimpleOpenNIViewer::MatToPoinXYZ(cv::Mat OpencVPointCloud) { /* * Function: Get from a Mat to pcl pointclo

如何从opencv Mat pointcloud到pcl::pointcloud?颜色对我来说并不重要,只是点本身

您可以这样做:

pcl::PointCloud<pcl::PointXYZ>::Ptr SimpleOpenNIViewer::MatToPoinXYZ(cv::Mat OpencVPointCloud)
         {
             /*
             *  Function: Get from a Mat to pcl pointcloud datatype
             *  In: cv::Mat
             *  Out: pcl::PointCloud
             */

             //char pr=100, pg=100, pb=100;
             pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);//(new pcl::pointcloud<pcl::pointXYZ>);

             for(int i=0;i<OpencVPointCloud.cols;i++)
             {
                //std::cout<<i<<endl;

                pcl::PointXYZ point;
                point.x = OpencVPointCloud.at<float>(0,i);
                point.y = OpencVPointCloud.at<float>(1,i);
                point.z = OpencVPointCloud.at<float>(2,i);

                // when color needs to be added:
                //uint32_t rgb = (static_cast<uint32_t>(pr) << 16 | static_cast<uint32_t>(pg) << 8 | static_cast<uint32_t>(pb));
                //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;

             return point_cloud_ptr;

         }
pcl::PointCloud::Ptr SimplePointInviewer::Mattopinxyz(cv::Mat OpencVPointCloud)
{
/*
*函数:从Mat获取到pcl pointcloud数据类型
*In:cv::Mat
*Out:pcl::PointCloud
*/
//字符pr=100,pg=100,pb=100;
pcl::PointCloud::Ptr point_cloud_Ptr(新的pcl::PointCloud);//(新的pcl::PointCloud);
对于(i=0;i点在(i).x;
OpenCVPointCloud.at(1,i)=point_cloud_ptr->points.at(i).y;
OpenCVPointCloud.at(2,i)=point_cloud_ptr->points.at(i).z;
}
返回OpenCVPointCloud;
}

要将由Kinect传感器捕获并由depthMat表示的距离图像转换为pcl::PointCloud,您可以尝试此功能。校准参数是使用的参数

{
pcl::PointCloud::Ptr Mattopinxyz(cv::Mat depthMat)
{
pcl::PointCloud::Ptr ptCloud(新的pcl::PointCloud);
//校准参数
浮动常数fx_d=5.9421434211923247e+02;
浮球常数fy_d=5.9104053696870778e+02;
浮点数cx_d=3.39307809750314e+02;
浮子常数cy_d=2.4273913761751615e+02;
无符号字符*p=depthMat.data;
对于(int i=0;i点向后推(点);
++p;
}
}
ptCloud->width=(int)depthMat.cols;
ptCloud->height=(int)depthMat.rows;
返回ptCloud;
}
}

这是一个缓慢的函数,可以通过较少的乘法和更多的for循环之外的运算来加速。在函数1/fx\u d和1/fy\u d之前执行fx\u d和fy\u d,然后再进行乘法。试试吧!@MartijnvanWezel谢谢你的评论。我编辑了答案。
点。向后推
也许我们可以定义预定义大小的点云基于图像大小不重新分配内存?这仅适用于无组织的云。
 cv::Mat MVW_ICP::PoinXYZToMat(pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr){

     cv::Mat OpenCVPointCloud(3, point_cloud_ptr->points.size(), CV_64FC1);
     for(int i=0; i < point_cloud_ptr->points.size();i++){
        OpenCVPointCloud.at<double>(0,i) = point_cloud_ptr->points.at(i).x;
        OpenCVPointCloud.at<double>(1,i) = point_cloud_ptr->points.at(i).y;
        OpenCVPointCloud.at<double>(2,i) = point_cloud_ptr->points.at(i).z;
    }

    return OpenCVPointCloud;
}
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr MatToPoinXYZ(cv::Mat depthMat)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr ptCloud (new pcl::PointCloud<pcl::PointXYZ>);

// calibration parameters
    float const fx_d = 5.9421434211923247e+02;
    float const fy_d = 5.9104053696870778e+02;
    float const cx_d = 3.3930780975300314e+02;
    float const cy_d = 2.4273913761751615e+02;

    unsigned char* p = depthMat.data;
    for (int i = 0; i<depthMat.rows; i++)
    {
        for (int j = 0; j < depthMat.cols; j++)
        {
            float z = static_cast<float>(*p);
            pcl::PointXYZ point;
            point.z = 0.001 * z;
            point.x = point.z*(j - cx_d)  / fx_d;
            point.y = point.z *(cy_d - i) / fy_d;
            ptCloud->points.push_back(point);
            ++p;
        }
    }
    ptCloud->width = (int)depthMat.cols; 
    ptCloud->height = (int)depthMat.rows; 

    return ptCloud;

}
}