前提・実現したいこと
カメラ映像から取得した点群データをリアルタイムで平面分割したい。
別コードでカメラ映像から点群データをリアルタイムで出力しており、そのデータをさらに平面分割したいです。
ソースコードは公式ドキュメントの平面セグメンテーションを参考にしています。
コードを実行したところ、下記のようなエラーが発生しました。
発生している問題・エラーメッセージ
RuntimeError: [Open3D ERROR] There must be at least 'ransac_n' points.
該当のソースコード
import open3d as o3d
vis = o3d.visualization.Visualizer()
vis.create_window()
geome_add = False
while True:
pcd = o3d.io.read_point_cloud("./pc_color.pcd")
plane_model, inliers = pcd.segment_plane(distance_threshold=0.1,ransac_n=300,num_iterations=100)
inlier_cloud = pcd.select_by_index(inliers)
inlier_cloud.paint_uniform_color([1.0, 0, 0])
outlier_cloud = pcd.select_by_index(inliers, invert=True)
if geome_add == False:
vis.add_geometry(inlier_cloud)
vis.add_geometry(outlier_cloud)
geome_add = True
vis.update_geometry(inlier_cloud)
vis.update_geometry(outlier_cloud)
vis.poll_events()
vis.update_renderer()
試したこと
1つイシューがありましたが、解決策と同様にsegment_plane内の数値を調整してみましたが、結果は変わらずでした。
一瞬、1枚目のフレームを処理した画像が表示される場合がありますが原因が不明です。
補足情報(FW/ツールのバージョンなど)
conda環境
open3dバージョン0.11.2
pythonバージョン3.8.3
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
Current directory
はどこでしょうか?
./pc_color.pcd
は相対パスなのでこれでコケているかもしれません。
c:\users\[ユーザー名]\desktop\pc_color.pcd
にある場合に、
コケる例
c:\users\[ユーザー名]> python sample.py
とすると同じエラーが出てコケました。
コケない例
c:\users\[ユーザー名]\desktop> python sample.py
とするとコケずに通ります。
例えば、こんな感じのコードを先頭に入れるとCurrent directory
は解決できます。
import os
print("Current directory: ",os.getcwd())
os.chdir(os.path.dirname(__file__))
print("Current directory: ",os.getcwd())
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.18%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/11/19 12:48
早速同様にコードを加えてみたところ、
[Open3D WARNING] [ReadPCDData] Failed to read data record.
[Open3D WARNING] Read PCD failed: unable to read data.
PCDデータの読み取りにも問題が発生してしまいました。
pcdデータとコードはcurrent directoryである同様のユーザー直下のフォルダに配置しております。
また、当初と同様のransac_n pointのエラーも発生しております。
読み取りエラーは、pcdデータを別コードにてリアルタイムで更新し続けていることが原因なのでしょうか。
2020/11/20 06:18 編集
以下のコードを挟んではいかがでしょうか?
if os.path.exists(""./pc_color.pcd") is True:
____(従来の対応)
else:
____sys.exit()
少なくともデータがあればロードできるようになりますので読み取り失敗はなくなるはずです。読み取れているのにransac_nのエラーが出るのは謎ですね…。ほかの、例えば公開されているpcdファイルで試しても同じエラーが出ますか?
2020/11/23 01:59
ライブラリ内のpcdデータを用いたところ、動作しました…。
これはカメラ映像から生成したpcdデータに問題があるということでしょうか。
ループ処理でなく、1フレーム分のみの平面セグメンテーションでは問題なく動作するのですが…。
2020/11/23 03:11
2020/11/24 22:52
こちらでさらに調査したところ、おっしゃる通り、取得したpcdデータに問題があり、扱えないものが混じっていたようです。
リアルタイムで取得した点群データをそのまま別プログラムにて表示を試してみたところ、動作はしているものの、動画のfpsが10ほどしかなく、
[Open3D WARNING] [ReadPCDData] Failed to read data record.
[Open3D WARNING] Read PCD failed: unable to read data.
が連続して出力されます。
そのため、カメラ映像から取得している点群データの中に、取り扱えないものが混じってしまっているようでした。
ですがwrite_point_cloud()で取得し、特に加工等は行っていないため、原因が不明です。
取り扱えるpcdデータのサイズや点群の個数などに制限があるようなことはありますでしょうか。。
2020/11/25 19:15
2020/11/27 23:05
高fpsで回しているので、それが原因かもしれません。。調整してみます。