rcl情報をpcl形式からcv :: Matに、そしてpclに戻そうとしています。私はconvert mat to pointcloudをstackoverflowで見つけました。cv :: Matを色付きのpcl :: pointcloudに変換する方法
更新
コードIは、従って、出発点として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);
色は(画像は原画像と目で比較されて)正しく抽出されていることを私に確実に上の画像を表示:そして今、次があります。
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、私のコードは、雲の種類以外の違いが表示されませんか? PCLにthis説明を読む
更新
は、私は(もstackoverflowに言及した)xyzrgbaへの切り替えで終わりました。バック変換するとき、私はその後、試したコードは次のとおりです。
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?
エクストラ
は私がOpenCVPointCloudColor
からの読み取り、その後cvCloudColor.at<cv::Vec3f>(x,y) = cv::Vec3f(0,0,255);
を使用して、すべての点OpenCVPointCloudColor
に赤い色を強制場合でも、まだPCLクラウドで間違った色情報を作成します。
この例では、 'OpenCVPointCloudColor'にポイントを保存しているように見えますが、' colorImage'からポイントを読み取ろうとしています。それらは同じですか? – iamai
@iamaiはい、彼らは同じ変数名を持つように今質問を更新します。 (ちょうど2つの関数呼び出しでそれらを持っていた)。 – JTIM
(上記のコードとは関係ありません)OpenCVを使用して読み込まれた画像からそれらを読み取ろうとする場合、デフォルトのカラーシステムはRGBではなくBGRです。それは色に影響するかもしれません。 – ilke444