私は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つのポイントに加えて、私はこのトピックについて多くのことを読みましたが、それでもすべての部分をまとめることはできません。
これが私の質問です(私はこれの初心者であることを忘れないでください)
差し迫った衝突を検出するためにオプティカルフローはどのように使用されますか?つまり、関数cv :: calcOpticalFlowPyrLK()から正しい結果を取得できるとすると、フレーム上のオブジェクトとの差し迫った衝突を検出するために、そこからどのように進めればよいでしょうか。衝突する可能性が最も高い物体からの距離を測定することは可能ですか?
これまたは私が見ることができる同様の機能を実装するサンプルの作業プロジェクトはありますか?eosgarden.comでプロジェクトを確認しましたが、機能が実装されていないようです。
上記のサンプルコードでは、lastCornersをUIImageに変換し、その画像を画面に表示しています。これにより、画面上に色付きの水平線のみが表示され、元のテスト画像とはまったく異なる画像が表示されます。これはその関数の正しい出力ですか?
このプロジェクトで使用されているデータ型を理解するのに少し苦労しています。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を実装していますか?