3

私はOpenCVを使用して衝突回避を実装する必要があるプロジェクトに取り組んでいます。これはiOSで実行されます(iOS 5以降でも実行できます)。

プロジェクトの目的:アイデアは、車のダッシュボードにiPadをマウントし、アプリケーションを起動することです。アプリケーションはカメラからフレームを取得し、それらを処理して、車が障害物と衝突するかどうかを検出する必要があります。

私はあらゆる種類の画像処理の初心者であるため、このプロジェクトでは概念レベルで立ち往生しています。

私がこれまでにしたこと:

  • OpenCVを見て、ネットで読んだ。衝突回避は、Lukas-Kanadeピラミッド法を使用して実装されます。これは正しいですか?
  • このプロジェクトを出発点として使用する:http://aptogo.co.uk/2011/09/opencv-framework-for-ios/ iPadで正常に実行され、キャプチャ機能も機能します。つまり、カメラのキャプチャは適切です。統合。プロセスフレームの実装を変更して、キャニーエッジ検出の代わりにオプティカルフローを試しました。これが関数です(まだ不完全です)。

        -(void)processFrame {
        int currSliderVal = self.lowSlider.value;
        if(_prevSliderVal == currSliderVal) return;
        cv::Mat grayFramePrev, grayFrameLast, prevCorners, lastCorners, status, err;
    
        // Convert captured frame to grayscale for _prevFrame
        cv::cvtColor(_prevFrame, grayFramePrev, cv::COLOR_RGB2GRAY);
        cv::goodFeaturesToTrack(grayFramePrev, prevCorners, 500, 0.01, 10);
        // Convert captured frame to grayscale for _lastFrame
        cv::cvtColor(_lastFrame, grayFrameLast, cv::COLOR_RGB2GRAY);
        cv::goodFeaturesToTrack(grayFrameLast, lastCorners, 500, 0.01, 10);
    
        cv::calcOpticalFlowPyrLK(_prevFrame, _lastFrame, prevCorners, lastCorners, status, err);
        self.imageView.image = [UIImage imageWithCVMat:lastCorners];
        _prevSliderVal = self.lowSlider.value;
    }
    
  • オプティカルフローと、それが差し迫った衝突を検出するために(概念的に)どのように使用されるかについて読んでください。概要:オブジェクトのサイズが大きくなっているが、フレームのいずれかの端に向かって移動している場合、それは衝突パスではありません。オブジェクトのサイズが大きくなっているが、どのエッジにも移動していない場合、そのオブジェクトは衝突パス上にあります。これは正しいですか?
  • このプロジェクト(http://se.cs.ait.ac.th/cvwiki/opencv:tutorial:optic_flow)は、私が達成したいことを正確に実行しているようです。しかし、コードを読んでも、それがどのように行われているのか理解できませんでした。Linuxボックスがないので実行できません。このウェブページの説明を読んだところ、同形異義語の行列にたどり着いたようです。この結果は衝突回避にどのように使用されますか?

上記の4つのポイントに加えて、私はこのトピックについて多くのことを読みましたが、それでもすべての部分をまとめることはできません。

これが私の質問です(私はこれの初心者であることを忘れないでください)

  1. 差し迫った衝突を検出するためにオプティカルフローはどのように使用されますか?つまり、関数cv :: calcOpticalFlowPyrLK()から正しい結果を取得できるとすると、フレーム上のオブジェクトとの差し迫った衝突を検出するために、そこからどのように進めればよいでしょうか。衝突する可能性が最も高い物体からの距離を測定することは可能ですか?

  2. これまたは私が見ることができる同様の機能を実装するサンプルの作業プロジェクトはありますか?eosgarden.comでプロジェクトを確認しましたが、機能が実装されていないようです。

  3. 上記のサンプルコードでは、lastCornersをUIImageに変換し、その画像を画面に表示しています。これにより、画面上に色付きの水平線のみが表示され、元のテスト画像とはまったく異なる画像が表示されます。これはその関数の正しい出力ですか?

  4. このプロジェクトで使用されているデータ型を理解するのに少し苦労しています。InputArray、OutputArrayなどは、OpenCVAPIで受け入れられるタイプです。しかし、processFrame関数では、cv::MatがCannyエッジ検出メソッドに渡されていました。prevImageとnextImageのcv::MatをcalcOpticalFlowPyrLK()に渡しますか?

前もって感謝します :)

更新:このサンプルプロジェクトが見つかりました(http://www.hatzlaha.co.il/150842/Lucas-Kanade-Detection-for-the-iPhone)。私のMacではコンパイルされませんが、これからオプテ​​ィカルフローの動作するコードが得られると思います。しかし、それでも私は、それらのポイントを追跡することから、衝突の妨げをどのように検出できるかを理解できません。あなたの誰かがQtsにさえ答えることができるならば。第一に、それは大いに役立つでしょう。

更新オプティカルフローがFoE(Focus of Expansion)の計算に使用されているようです。複数のFoE候補が存在する可能性があります。そして、FoEを使用して、TTC(Time To Collision)に到達します。後半はよくわかりません。しかし、私は今のところ正しいですか?OpenCVはFoEやTTCを実装していますか?

4

1 に答える 1

0

1

差し迫った衝突を検出するためにオプティカル フローはどのように使用されますか?

オプティカル フローを使用したことはありませんが、最初の Google リクエストで次のような論文が表示されました。

オプティカル フローを使用した障害物検出

あなたがすでにそれを読んだかどうかはわかりません。あらゆる角度で接触するまでの時間を推定する方法を示します。

2

これにより、画面上に色付きの水平線のみが表示された画像が表示されます。元のテスト画像とはまったく異なります。

goodFeaturesToTrack の出力は画像ではなく、点の表だと思います。たとえば、Python の例(古いバージョンの OpenCV) でそれらがどのように使用されているかを参照してください。同様のことが calcOpticalFlowPyrLK の出力にも当てはまります。最初にデバッグにあるものを見てください。私は通常、なじみのない OpenCV 関数の出力を理解するために Python + OpenCV を使用します。

4

このプロジェクトで使用されているデータ型を理解するのに少し苦労しています。InputArray、OutputArray などは、OpenCV API で受け入れられる型です。しかし、processFrame 関数では、cv::Mat が Canny エッジ検出メソッドに渡されていました。prevImage と nextImage の calcOpticalFlowPyrLK() に cv::Mat を渡しますか?

ドキュメントから:

これは、読み取り専用の入力配列を OpenCV 関数に渡すためのプロキシ クラスです。.... 、、、、または_InputArrayから構築できるクラスです。行列式から構築することもできます。MatMat_<T>Matx<T, m, n>std::vector<T>std::vector<std::vector<T> >std::vector<Mat>

だからあなたはただ渡すことができますMat。いくつかの古い関数はまだのみ Matを期待しています。

于 2012-07-27T23:36:56.057 に答える