C++ 从点云到Mat的转换
假设我初始化了一个点云。我想将其RGB通道存储在opencv的Mat数据类型中。我该怎么做C++ 从点云到Mat的转换,c++,opencv,image-processing,computer-vision,point-cloud-library,C++,Opencv,Image Processing,Computer Vision,Point Cloud Library,假设我初始化了一个点云。我想将其RGB通道存储在opencv的Mat数据类型中。我该怎么做 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); //Create a new cloud pcl::io::loadPCDFile<pcl::PointXYZRGBA> ("cloud.pcd", *cloud); pcl::PointC
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); //Create a new cloud
pcl::io::loadPCDFile<pcl::PointXYZRGBA> ("cloud.pcd", *cloud);
pcl::PointCloud::Ptr cloud(新的pcl::PointCloud)//创建新云
pcl::io::loadPCDFile(“cloud.pcd”,*cloud);
我知道如何将Mat(3D图像)转换为XYZRGB。我想你可以用另一种方法。这里Q是深度矩阵的视差
pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
double px, py, pz;
uchar pr, pg, pb;
for (int i = 0; i < img_rgb.rows; i++)
{
uchar* rgb_ptr = img_rgb.ptr<uchar>(i);
uchar* disp_ptr = img_disparity.ptr<uchar>(i);
double* recons_ptr = recons3D.ptr<double>(i);
for (int j = 0; j < img_rgb.cols; j++)
{
//Get 3D coordinates
uchar d = disp_ptr[j];
if ( d == 0 ) continue; //Discard bad pixels
double pw = -1.0 * static_cast<double>(d) * Q32 + Q33;
px = static_cast<double>(j) + Q03;
py = static_cast<double>(i) + Q13;
pz = Q23;
// Normalize the points
px = px/pw;
py = py/pw;
pz = pz/pw;
//Get RGB info
pb = rgb_ptr[3*j];
pg = rgb_ptr[3*j+1];
pr = rgb_ptr[3*j+2];
//Insert info into point cloud structure
pcl::PointXYZRGB point;
point.x = px;
point.y = py;
point.z = pz;
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;
pcl::PointCloud::Ptr point_cloud_Ptr(新的pcl::PointCloud);
双px,py,pz;
uchar pr、pg、pb;
对于(int i=0;ipoints.size();
点云->高度=1;
我是否理解正确,您只对点云的RGB值感兴趣,而不关心其XYZ值
然后你可以做:
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
//Create a new cloud
pcl::io::loadPCDFile<pcl::PointXYZRGBA> ("cloud.pcd", *cloud);
cv::Mat result;
if (cloud->isOrganized()) {
result = cv::Mat(cloud->height, cloud->width, CV_8UC3);
if (!cloud->empty()) {
for (int h=0; h<result.rows; h++) {
for (int w=0; w<result.cols; w++) {
pcl::PointXYZRGBA point = cloud->at(w, h);
Eigen::Vector3i rgb = point.getRGBVector3i();
result.at<cv::Vec3b>(h,w)[0] = rgb[2];
result.at<cv::Vec3b>(h,w)[1] = rgb[1];
result.at<cv::Vec3b>(h,w)[2] = rgb[0];
}
}
}
}
pcl::PointCloud::Ptr cloud(新的pcl::PointCloud);
//创建新云
pcl::io::loadPCDFile(“cloud.pcd”,*cloud);
cv::Mat结果;
如果(云->异构()){
结果=cv::Mat(云->高度,云->宽度,cv_8UC3);
如果(!cloud->empty()){
对于(inth=0;h我有同样的问题,我成功地解决了它
首先应变换坐标,使“地平面”为X-O-Y平面。
核心api是
你可以看看我的
祝你好运!此外,如果你构建了示例代码,你实际上可以使用pcl2png[/path/to.pcd][/path/to.png]
这肯定不是这个问题的答案!此外,很少有变量没有定义,因此这增加了混淆!