質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.64%

OpenCV デプスデータからPCLで点群表示の際、4角錐のように表示される原因がわかりません

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,854

mypace

score 45

OpenCV3.4.1を使用しデプスデータ作成後、PCL(PointCloudLibrary)を使用して
点群データを表示しましたが、表示する点群データが四角錐のようになります。
原因を確認しましたがわかりませんでした。
どなたかこのような現象となる原因についてご存知でしたらご教授いただきたく思います。
イメージ説明
イメージ説明

//視差画像2D->深度マップ
int ImageProc::DisparityCreation3D(cv::Mat capImg, cv::Mat Q, char *depthImgSaveFilePath, cv::Mat disparity_data, std::vector<float> &depthdata, int loopCount) {
    int chk = 0;
    int devNo = 1;

    float baseline = 1.0f;

    //--- 深度マップ作成 ---//
    printf("深度マップを作成します。");

    cv::Mat image3DData;
    //cv::reprojectImageTo3D(disparity_data, _3dImage, Q);            //視差画像を3次元空間に再投影する
    cv::reprojectImageTo3D(disparity_data, image3DData, Q);// , false, CV_32F);            //視差画像を3次元空間に再投影する

    cv::FileStorage fs3DData("3dImage_data.xml", cv::FileStorage::WRITE);
    if (!fs3DData.isOpened()) {
        std::cout << "File can not be opened." << std::endl;
        std::wcout << "3Dデータファイルが開けません。" << std::endl;
    }
    fs3DData << "data" << image3DData;
    fs3DData.release();

    pcl::PointXYZRGB point;

    //--- 表示 ---//
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>());
    cloud_ptr->width = static_cast<uint32_t>(disparity_data.cols);
    cloud_ptr->height = static_cast<uint32_t>(disparity_data.rows);
    cloud_ptr->is_dense = false;

    for (int i = 0; i < disparity_data.rows; ++i) {
        //
        uchar *rgb_ptr = capImg.ptr<uchar>(i);
        uchar *disp_ptr = disparity_data.ptr<uchar>(i);
        double *xyz_ptr = image3DData.ptr<double>(i);

        for (int j = 0; j < disparity_data.cols; ++j) {
            uchar d = disp_ptr[j];
            if (d == 0) continue;
            Point3f p = image3DData.at<Point3f>(i, j);

            //**** 190105 add p.z操作 ****//
            if (std::isinf(p.z)) {
                p.z = 0;
            }
            //else {
            //    p.z /= 100;
            //}

            point.z = p.z;
            point.x = p.x;
            point.y = p.y;

            point.b = rgb_ptr[3 * j];
            point.g = rgb_ptr[3 * j + 1];
            point.r = rgb_ptr[3 * j + 2];
            cloud_ptr->points.push_back(point);
        }
    }
    pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
    viewer.showCloud(cloud_ptr);

    while (!viewer.wasStopped())
    {
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/01/05 20:16

    正常ならばどうなると想定されてますか?

    キャンセル

  • mypace

    2019/01/05 20:23

    正常ならば、カメラで写した対象物部分だけが盛り上がり、
    それ以外の箇所は平らになると想定しています。

    キャンセル

  • y_waiwai

    2019/01/05 20:26

    できれば、質門を編集し、そのことを加筆されればよろしいかと。

    キャンセル

回答 1

checkベストアンサー

0

image3DDataからデータを取得する際、xyz_ptrではdoubleで取り出していますが、pではpoint3fで取り出しているように見えます。
point3fはfloat型ですので、どちらかがおかしい事になりますので確認お願いします。
また、PCLはよくわからないのですが、リファレンス読む限り

cloud_ptr->width = static_cast<uint32_t>(disparity_data.cols);
cloud_ptr->height = static_cast<uint32_t>(disparity_data.rows);
cloud_ptr->is_dense = false;


ここはいらないのではないかと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • C++に関する質問
  • OpenCV デプスデータからPCLで点群表示の際、4角錐のように表示される原因がわかりません