Я пытаюсь преобразовать pointcloud с информацией rgb из формата pcl в cv :: Mat и обратно в pcl. Я нашел convert mat to pointcloud на stackoverflow.Как преобразовать cv :: Mat в pcl :: pointcloud с цветом
код Обновлено
поэтому я использовал этот код найденный на StackOverflow в качестве отправной точки. И теперь имеем следующее:
//input pcl::PointCloud<pcl::PointXYZRGB> point_cloud_ptr
cv::Mat OpenCVPointCloud(3, point_cloud_ptr.points.size(), CV_64FC1);
OpenCVPointCloudColor = cv::Mat(480, 640, CV_8UC3);
for(int y=0;y<OpenCVPointCloudColor.rows;y++)
{
for(int x=0;x<OpenCVPointCloudColor.cols;x++)
{
OpenCVPointCloud.at<double>(0,y*OpenCVPointCloudColor.cols+x) = point_cloud_ptr.points.at(y*OpenCVPointCloudColor.cols+x).x;
OpenCVPointCloud.at<double>(1,y*OpenCVPointCloudColor.cols+x) = point_cloud_ptr.points.at(y*OpenCVPointCloudColor.cols+x).y;
OpenCVPointCloud.at<double>(2,y*OpenCVPointCloudColor.cols+x) = point_cloud_ptr.points.at(y*OpenCVPointCloudColor.cols+x).z;
cv::Vec3b color = cv::Vec3b(point_cloud_ptr.points.at(y*OpenCVPointCloudColor.cols+x).b,point_cloud_ptr.points.at(y*OpenCVPointCloudColor.cols+x).g,point_cloud_ptr.points.at(y*OpenCVPointCloudColor.cols+x).r);
OpenCVPointCloudColor.at<cv::Vec3b>(cv::Point(x,y)) = color;
}
}
cv::imshow("view 2", OpenCVPointCloudColor);
cv::waitKey(30);
Отображение снимка выше обеспечили мне, что цвета извлекаются правильно (изображение сравнивается на глаз с необработанного изображения). Затем я хочу, чтобы преобразовать его обратно в PointCloud:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
for(int y=0;y<OpenCVPointCloudColor.rows;y++)
{
for(int x=0;x<OpenCVPointCloudColor.cols;x++)
{
pcl::PointXYZRGB point;
point.x = OpencVPointCloud.at<double>(0,y*OpenCVPointCloudColor.cols+x);
point.y = OpencVPointCloud.at<double>(1,y*OpenCVPointCloudColor.cols+x);
point.z = OpencVPointCloud.at<double>(2,y*OpenCVPointCloudColor.cols+x);
cv::Vec3b color = OpenCVPointCloudColor.at<cv::Vec3b>(cv::Point(x,y));
//Try 1 not working
//uint8_t r = (color[2]);
//uint8_t g = (color[1]);
//uint8_t b = (color[0]);
//Try 2 not working
//point.r = color[2];
//point.g = color[1];
//point.b = color[0];
//Try 3 not working
//uint8_t r = (color.val[2]);
//uint8_t g = (color.val[1]);
//uint8_t b = (color.val[0]);
//test working WHY DO THE ABOVE CODES NOT WORK :/
uint8_t r = 255;
uint8_t g = 0;
uint8_t b = 0;
int32_t rgb = (r << 16) | (g << 8) | b;
point.rgb = *reinterpret_cast<float*>(&rgb);
point_cloud_ptr -> points.push_back(point);
}
}
Может кто-нибудь объяснить, почему значения явно указаны 255.0.0 цветов всего красного. Но если я выбираю вывод из цветного изображения, облако неправильно окрашено?
Наткнулся на this, я не вижу, какая разница у моего кода, кроме того, что тип облака отличается?
обновление
чтение this обсуждения PCL закончился со мной переключение на xyzrgba (также упоминается о stackoverflow). Код Затем я попытался при преобразовании обратно:
point.b = OpenCVPointCloudColor.at<cv::Vec3b>(x,y)[0];
point.g = OpenCVPointCloudColor.at<cv::Vec3b>(x,y)[1];
point.r = OpenCVPointCloudColor.at<cv::Vec3b>(x,y)[2];
point.a = 255;
Результирующий цвет облако отличается от тех, которые созданы в XYZRGB, но все еще не так:/WTF?
Extra
Даже если я заставляю красный цвет во всех точках OpenCVPointCloudColor
, используя cvCloudColor.at<cv::Vec3f>(x,y) = cv::Vec3f(0,0,255);
затем чтение из OpenCVPointCloudColor
все еще создает неверную информацию о цвете в ЗКС облаке.
В этом примере вы, кажется, сохраняете точки в 'OpenCVPointCloudColor' при попытке прочитать их из' colorImage'. То же самое? – iamai
@iamai да, да, я сейчас обновлю вопрос, чтобы у них были одинаковые имена переменных. (просто они были в двух вызовах функций). – JTIM
(не относится к приведенному выше коду) Если вы пытаетесь прочитать их с изображения, загруженного с помощью OpenCV, остерегайтесь того, что цветная система по умолчанию BGR вместо RGB. Это может повлиять на цвета. – ilke444