どうも!シャノン技術部の_fpです。
今回はWebから少し離れて、OpenCVを使った車載映像からの標識の抽出をやってみました。
参考にしたのはこちらの論文です。
今回は、論文の構成図のうち前段階の画像処理と画像抽出の部分をやってみました。
さて、元となる動画はこんな感じです。確か松戸の辺りだったと思います。撮影した元動画は 640x480 です。
この映像を OpenCV に入力するために変換します。デジカメで撮影した mov ファイルを ffmpeg というツールを使って変換しました。
ffmpeg -i filename.MOV -an -f avi -codec rawvideo -pix_fmt yuv420p filename.avi
できたAVIファイルのファイル名をパラメータに渡して表示してみます。
import sys import cv2 from numpy import * cap = cv2.VideoCapture("path to avi file") cv2.namedWindow("Example", cv2.WINDOW_AUTOSIZE ) while True: retval, image = cap.read() if image is None: break; cv2.imshow("Example", image) cv2.waitKey(100) cv2.destroyWindow("Example")表示できたら、画像処理に入ります。
論文では、2値化するためのスレッショルドを求めるためグレイスケールに変換し、ガウスぼかしを使うことで良い結果が得られたようです。
詳しくは書かれていませんが、ノイズによる誤検出を抑え、円形の輪郭を滑らかにするためでしょうか。今回は手抜きしてスレッショルド固定でやってみます。
image = cv2.cvtColor(orig_image, cv2.COLOR_RGB2GRAY) image = cv2.GaussianBlur(image, (9, 9), 0)次に、輪郭線を抽出するため2値の画像に変換します。2値の画像を元に、OpenCVの関数を使って画像から境界の経路を取得することができます。輪郭線の抽出はこちらのブログ記事を参考にしました。
ret,bimage = cv2.threshold(image,150,255,0) # find contours contours, hierarchy = cv2.findContours(bimage, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
そして、輪郭線上の複数の点にフィットする楕円を検出します。
for c in contours: # At least 5 points are required if len(c) < 5: continue center, axis, angle = cv2.fitEllipse(c)
以上の処理を行うと、この映像のようになります。
赤線が輪郭で、青線が検出した楕円です。
パラメータが悪いのか誤検出だらけですが、最後の方のフレームでなんとか標識の部分画像を取得できました。
論文では、これらの画像からスペクトルなどの特徴を抽出して機械学習を行うことで、道路標識を検出したようです。今回はここまでですが、OpenCVには機械学習の機能もあるのでチャレンジしてみると面白そうです。
1 コメント:
Write コメントffmpegの上のコマンドでmovファイルをaviに変換した動画を再生したところ,所定の場所で
Replycv2.error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:261: error: (-215) size.width>0 && size.height>0 in function cv::imshow
というエラーを吐き,動画が停止してしまいます.
何か良い対処法をご存知ではないでしょうか.