ポイントクラウドを初期化するとしましょう。その 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);
ポイントクラウドを初期化するとしましょう。その 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);
ポイント クラウドの 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];
}
}
}
}
基本的な考え方を示すだけで十分だと思います。
ただし、ポイントクラウドが整理されている場合にのみ機能します。
整理された点群データセットは、データが行と列に分割された、整理された画像 (またはマトリックス) のような構造に似た点群に付けられた名前です。このような点群の例には、ステレオ カメラや Time Of Flight カメラからのデータが含まれます。組織化されたデータセットの利点は、隣接するポイント (ピクセルなど) 間の関係を知ることにより、最近傍演算がはるかに効率的になり、計算が高速化され、PCL の特定のアルゴリズムのコストが削減されることです。(ソース)
私は同じ問題を抱えており、それを解決することに成功しました!
まず、「地平面」が XOY 平面になるように座標を変換する必要があります。コア API はpcl::getTransformationFromTwoUnitVectorsAndOriginです。
あなたは私の質問を見ることができます:
幸運を!