交通標識認識(OpenCV)

こんにちは、OpenCV(Intel)を使用して実際の問題を解決した経験を共有することにしました。



その理由は次のとおりです-ビデオ内の道路標識の自動認識がリアルタイムで望ましい。 残念ながら、ロシア語では同様の問題に関する情報はほとんどなく、例はさらに少ない。

一般的にインターネット上で調べてみると、必要なマットを備えたOpenCVライブラリを使用することが決定されました。 装置およびそれが後で非常に高性能であることが判明したように。



だから問題を解決する段階。

最初のステップは、カメラから画像を取得することです。 開発中、ネットワークカメラが使用されましたが、Webカメラの解像度は十分に手元にありませんでした。 OpenCVは、Webカメラを操作するためのかなり簡単な方法を提供します。 (HighGuiモジュール)

cvNamedWindow("web-cam", CV_WINDOW_AUTOSIZE); //

this->capture = cvCreateCameraCapture(0);

cvSetCaptureProperty(this->capture,CV_CAP_PROP_FRAME_WIDTH_HEIGHT,640480); // 640x480



while (1)

{

// -

if(!cvGrabFrame(this->capture)) //

break;

this->frame = cvRetrieveFrame(this->capture); // ( IplImage)

if(!frame)

break;

cvShowImage("web-cam",this->frame); //



cvWaitKey(10);

if(this->fwork == false)

break;

}







同様のコードを使用して、カメラから常に関連するフレームを取得します





2番目の段階は、結果の画像の変換です。 最初の段階では、特定の文字グループのみを認識しました。 (禁止、警告)いくつかの実験の結果、フィルターが取得され、その後、次の画像が取得されます。





3番目の段階は、しきい値フィルターの使用です。 OpenCVには多数の変換と処理が含まれており、このフィルターのcvThresholdパラメーターを経験的に選択しました。





4番目の段階は、輪郭の境界の決定です。 繰り返しになりますが、私は自分の3輪自転車を考え出す必要はありませんでした;境界検出器であるcvCannyライブラリの最適化された機能が採用されました。 結果の輪郭は、元の画像で丸で囲まれます。





したがって、回路のリストを受け取り、事前に訓練されたニューラルネットワークを使用して、結果の回路を分類します。 回路が複数の事前定義されたタイプに属していない場合、ゴミ箱に移動されて表示されませんでした。



このような作業スキームにより、(フレームの負荷に応じて)1秒あたり約3〜5フレームを処理できる既製のアプリケーションを作成できました。 テストでは、ラップトップ-Core 2 Duo T5450、解像度1024x768のネットワークカメラを使用しました。 テスト中、システムは文字の約90%のどこかで認識を示しましたが、唯一の認識です。 看板が曲がったり、看板などで覆われていると、システムは標識を認識できません(残念ながら、これは非常に一般的です。ほぼ完全な道路でテストされています)。



その結果、完全に機能するアプリケーションが完成しました。最も重要なことは、openCVでの作業スキルとビデオ認識の分野の知識を得たことです。 このライブラリの類似物は見つかりませんでした。



PS 夜には、このアプローチもかなりの適用性があり、いくつかのバリエーションがあります。



All Articles