PythonとOpenCVで交通標識の抽出をやってみた

このエントリーをはてなブックマークに追加
どうも!シャノン技術部の_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には機械学習の機能もあるのでチャレンジしてみると面白そうです。
次の記事
« Prev Post
前の記事
Next Post »

1 コメント:

Write コメント
匿名
AUTHOR
2015年2月25日 16:22 delete

ffmpegの上のコマンドでmovファイルをaviに変換した動画を再生したところ,所定の場所で
cv2.error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:261: error: (-215) size.width>0 && size.height>0 in function cv::imshow
というエラーを吐き,動画が停止してしまいます.
何か良い対処法をご存知ではないでしょうか.

Reply
avatar
Related Posts Plugin for WordPress, Blogger...