問題タブ [libfreenect2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java: Processing 3.2.1 を実行している Raspberry Pi で未解決のリンク エラーが発生する
OpenKinect Kinect v1 サンプル PointCloud からサンプル コードを実行すると、常にこのエラーが発生します。
OpenKinect ライブラリは、ARM Linux アーキテクチャ専用に作成されており、ここで見つけることができます。基本的な問題は、ライブラリに libfreenect.so ライブラリがあるにもかかわらず、libfreenect.so ライブラリが正しく検出されているとは思えないことです。パスにはないと思います。
実行中のサンプル コードについては、以下を参照してください (ライブラリ freenect.* のインポートが問題の原因であると私は考えています)。
編集 ここに私が得ているものの写真があります:
c++ - libfreenect2を使用した読み取り/書き込みアクセス違反C ++
私は C++ の初心者で、Kinect V2 と libfreenect2 をいじり始めました。ライブラリの構築はうまくいったと思います。しかし、コードで使用しようとすると、いくつかの奇妙な例外が発生します。
このコードを実行するたびに、シリアル番号 [serial = freenect2.getDefaultDeviceSerialNumber();] の取得に失敗します:
「未処理の例外がスローされました: 読み取りアクセス違反。
_Pnext は 0xFFFFFFFFFFFFFFFF でした。」
私が使用している場合
代わりに、新しいフレーム [listener.waitForNewFrame(frames)] の待機中に失敗し、次の例外がスローされます。
"ConsoleApplication1.exe の 0x000000018026D0C2 (ig75icd64.dll) で例外がスローされました: 0xC0000005: アクセス違反書き込み場所 0x000000002BA0D700"
それで、私は何を間違っていますか、どうすればそれを改善できますか?
アドバイスありがとうございます。
編集:コードを短くしました...
c++ - /usr/include/libfreenect.hpp:33: エラー: libusb.h: そのようなファイルまたはディレクトリはありません
libfreenecをインストールしました。QT を開き、コーディングを開始しました。libfreenect.h を使用してもエラーは発生しません。しかし、libfreenect.hpp を使用すると、このエラーが発生しました:「エラー: libusb.h: そのようなファイルまたはディレクトリはありません」.pro ファイルの内容は次のとおりです。
問題はどこだ?
c++ - C++の他の関数でリスナーにアクセスできるようにする方法は?
関数で次のリスナーにアクセスできるようにしたいと考えていgetFrames()
ます。これどうやってするの?プライベートフィールドにリスナーを追加してこれを試しましたが、まだ次のエラーが発生しますlistener(libfreenect2::Frame::Color | libfreenect2::Frame::Depth | libfreenect2::Frame::Ir);
:
'(libfreenect2::SyncMultiFrameListener) (int) の呼び出しに一致しません
サンプルアプリケーションコードを見てください
ソースファイル:
ヘッダー ファイル:
githubからのサンプル アプリケーション:
python - pylibfreenect2 から getPointXYZ() を使用すると、Kinect V2 深度画像が奇妙な点群座標を生成しますか?
MS Kinect V2 から実世界の座標を生成しようとしています。
pyqt + opengl 散布図をつなぎ合わせ、pylibfreenect2 を使用して Kinect からの深度データを表示することができました。
深度データが点群データと同じではないことにすぐに気付きました。私の部屋の天井が非常に歪んでいることに注意してください (平らなはずの天井がホッケースティック グラフのようになり始めています)。
ソースファイルを読んで掘り下げた後、非常に有望な関数を見つけることができました。
getPointXYZ - 点群で 3D ポイントを構築します。
一度に 1 つのピクセルでしか機能しないため、単純なネストされた for ループを作成しました。以下のコードでは、次の行が表示されます。
何が起こっているのかわからない。それは直線のように見えますが、時には長方形に似ていて、非常に平らです (それでも、3 次元すべてで任意の角度に配置されています)。センサーの前で手を動かすと、いくつかのポイントが動き回るのがわかりますが、宣言可能な形状は表示されません。すべてのポイントが詰め込まれているようです。
以下は、openGL 散布図を含む pyQt アプリケーション ウィンドウを表示する Python スクリプトです。フレームは pylibfreenect2 を介して Kinect センサーから受信され、散布図のポイントは深度データの各行と列を反復処理し、getPointXYZ を介して送信することによって生成されます (これは非常に遅く、機能しません...)。
実際の点群座標データを取得するために次に何をすべきかわかりません。
私が間違っていることについて何か提案はありますか?
私のオペレーティング システムは、Python 3.5 を使用した Ubuntu 16.0.4 です。
ありがとう。
python - Kinect の実世界の座標処理アルゴリズムをベクトル化して高速化する
私は最近、pylibfreenect2 を使用して Linux で Kinect V2 を使い始めました。
最初に深度フレーム データを散布図で表示できたとき、どの深度ピクセルも正しい位置にないように見えてがっかりしました。
部屋の側面図 (天井が湾曲していることに注意してください)。
私はいくつかの調査を行い、変換を行うためにいくつかの単純なトリガーが含まれていることに気付きました。
テストするために、列、行、および深度ピクセル強度を受け入れ、そのピクセルの実際の位置を返す pylibfreenect2 の事前に作成された関数から始めました。
getPointXYZ()またはgetPointXYZRGB( )を使用する唯一の欠点は、一度に 1 つのピクセルしか処理できないことです。次のようにネストされた for ループを使用する必要があるため、Python では時間がかかる場合があります。
getPointXYZ() が座標を計算する方法をよりよく理解しようとしました。私の知る限りでは、これは OpenKinect-for-Processing 関数のdepthToPointCloudPos()に似ています。libfreenect2 のバージョンには、内部でさらに多くのことが行われているのではないかと思いますが。
その gitHub ソースコードを例として使用して、私自身の実験のために Python で書き直そうとしたところ、次のようになりました。
これは、従来の getPointXYZ とカスタム関数の比較です。
彼らは非常に似ています。ただし、明らかな違いがあります。左の比較は、フラットな天井のエッジがよりまっすぐで、正弦波の形状を示しています。追加の数学が関係していると思われます。
私の機能と libfreenect2 の getPointXYZ との違いについて誰かがアイデアを持っているかどうか聞いてみたいと思います。
しかし、私がここに投稿した主な理由は、各要素をループする代わりに、上記の関数をベクトル化して配列全体で動作させることについて質問することです。
上記から学んだことを適用して、depthToPointCloudPos のベクトル化された代替と思われる関数を作成することができました。
[編集]
この機能をさらに効率的にする手助けをしてくれた Benjamin に感謝します!
これは機能し、前の関数 depthToPointCloudPos() と同じポイント クラウドの結果を生成します。唯一の違いは、処理速度が 1 fps から 5 ~ 10 fps になったことです (WhooHoo!)。これにより、Python がすべての計算を行うことによるボトルネックが解消されると思います。そのため、半現実世界の座標が計算され、散布図が再びスムーズに実行されるようになりました。
深度フレームから 3D 座標を取得するための効率的な関数ができたので、このアプローチを適用して、カラー カメラ データを深度ピクセルにマッピングしたいと思います。ただし、それを行うためにどのような数学や変数が関係しているのかはわかりません.Googleで計算する方法についてはあまり言及されていません.
別の方法として、libfreenect2 を使用して、getPointXYZRGB を使用して色を深度ピクセルにマッピングすることができました。
ポイント クラウドと色付きの頂点を生成します (非常に遅い <1Fps):
要約すると、私の2つの質問は基本的に次のとおりです。
depthToPointCloudPos()関数 (およびベクトル化された実装)から返される実際の 3D 座標データが、libfreenect2 の getPointXYZ() によって返されるデータにより似ているようにするには、どのような追加手順が必要ですか?
また、自分のアプリケーションで深さから色へのレジストレーション マップを生成する (おそらくベクトル化された) 方法を作成するには、何が必要でしょうか?これは解決済みですので、アップデートを参照してください。
[アップデート]
登録されたフレームを使用して、カラーデータを各ピクセルにマッピングすることができました。これは非常に単純で、setData() を呼び出す前に次の行を追加するだけで済みました。
これにより、Python はカラー データをすばやく処理し、スムーズな結果を得ることができます。以下の機能例にそれらを更新/追加しました。
Pythonでリアルタイムに実行される色登録による実世界の座標処理!
(GIF画像の解像度を大幅に落としています)
[アップデート]
アプリケーションでもう少し時間を費やした後、散布図の視覚的な品質を向上させ、この例/質問をより直感的にすることを期待して、いくつかの追加パラメーターを追加し、それらの値を調整しました。
最も重要なことは、頂点を不透明に設定したことです。
その後、サーフェスに非常に接近してズームすると、隣接する頂点間の距離が拡大し、表示されるすべてのものがほとんど空のスペースになることに気付きました。これは、頂点のポイント サイズが変更されていないことが原因の 1 つです。
色付きの頂点でいっぱいの「ズームに適した」ビューポートの作成を支援するために、現在のズーム レベルに基づいて頂点ポイント サイズを計算する次の行を追加しました (更新ごとに)。
そして見よ:
(ここでも、GIF 画像の解像度が大幅に低下しています)
ポイントクラウドのスキニングほど良くはないかもしれませんが、実際に見ているものを理解しようとするときに物事を簡単にするのに役立つようです.
言及されたすべての変更は、機能例に含まれています。
[アップデート]
前の 2 つのアニメーションで見られるように、現実世界の座標の点群が、グリッド軸と比較して歪んだ方向を持っていることは明らかです。これは、私が実際の Kinect の実際の向きを補正していなかったからです!
したがって、各頂点の新しい (回転およびオフセット) 座標を計算する追加のベクトル化された三角関数を実装しました。これにより、実空間での Kinect の実際の位置を基準にして、それらが正しく方向付けられます。また、傾斜する三脚を使用する場合に必要です (リアルタイム フィードバック用に INU またはジャイロ/加速度計の出力を接続するためにも使用できます)。
注意:rotatePoints() は「仰角」と「方位角」に対してのみ呼び出されます。これは、ほとんどの三脚がロールをサポートしておらず、CPU サイクルを節約するためにデフォルトで無効になっているためです。何か派手なことをするつもりなら、遠慮なくコメントを外してください!!
この画像ではグリッドの床が水平になっていますが、左側のポイント クラウドはそれに合わせていないことに注意してください。
Kinect の向きを設定するパラメータ:
センサーの実際の位置と向きに応じてこれらを更新する必要があります。
最も重要な 2 つのパラメーターは、シータ (仰角) 角度と床からの高さです。使用したのは単純な巻尺と目盛り付きの目だけですが、いつかエンコーダーまたは INU データをフィードして、これらのパラメーターをリアルタイムで更新するつもりです (センサーが動き回るにつれて)。
ここでも、すべての変更が機能例に反映されています。
誰かがこの例の改善に成功した場合、または物事をよりコンパクトにする方法について提案がある場合は、詳細を説明するコメントを残していただければ幸いです。
このプロジェクトの完全に機能する例を次に示します。