前回Go言語用のOpenCVの環境構築を行いました。
elsammit-beginnerblg.hatenablog.com
今回はこの環境を用いてカメラ+ラズパイでストリーミング配信された映像から顔認識してみたいと思います!!
カメラ+ラズパイからストリーミング配信する方法はこちらを参照。
elsammit-beginnerblg.hatenablog.com
■顔認識方法
顔認識のサンプルが公式で展開されていたため、こちらをベースに作成。
Face Detect :: GoCV - Golang Computer Vision Using OpenCV 4
ただし、本サンプルは
・実行時の引数に"カメラID"と"カスケードファイルパス"を指定しなければならない
・カメラからの入力に対する処理になっている(ストリーミング配信ではない)
ので、今回実施したい環境に修正します。
修正箇所ですが、まずは引数を用いないため下記を削除。
if len(os.Args) < 3 { fmt.Println("How to run:\n\tfacedetect [camera ID] [classifier XML file]") return } deviceID, _ := strconv.Atoi(os.Args[1])
そしてカスケードファイルパスを格納する変数である"xmlFile"にカスケードファイルパスを直接記載.
xmlFile := "haarcascade_frontalface_default.xml" ← カスケードファイルパスを指定.
最後にビデオキャプチャ処理を下記に変更.
webcam, err := gocv.OpenVideoCapture("ストリーミング配信リンク")
そして、変更後のファイルを実行!!
ストリーミング配信された映像が表示された!!
けど、、、
数秒(5秒程度?)遅れて表示される。。。泣
カクカク動くし。。。泣
■顔認識処理速度改善
なぜ処理が遅いのだろう??
試しに顔認識処理を取り除いてストリーミング配信を表示させてみたところ、、、
遅延がない!!
ということは、顔認識処理が遅延させている原因だということがわかりました。
よくよく処理内容を確認すると、
カスケードファイルを用いた認識処理が、
rects := classifier.DetectMultiScale(img)
となっており、パラメータが設定されていない。
minSizeやMaxSizeを設定しないと、様々な大きさの矩形領域で顔認識を行ってしまうため処理が遅くなってしまいます。
原因はここだ!!と思い、該当箇所をこちらのように変更!!
rects := classifier.DetectMultiScaleWithParams(img,1.5,2,0,image.Point{X: 100, Y: 100}, image.Point{X:300, Y:300})
DetectMultiScale関数は、
func (c *CascadeClassifier) DetectMultiScale(img Mat) []image.Rectangle
であり、パラメータを設定できないので代わりに DetectMultiScaleWithParamsを用いました。
func (c *CascadeClassifier) DetectMultiScaleWithParams(img Mat, scale float64, minNeighbors, flags int, minSize, maxSize image.Point) []image.Rectangle
今回のパラメータでは、最大の顔認識検知領域を300×300までとし、最小を100×100としました!!
変更した結果を確認するために実行!!
遅延なくストリーミング映像が表示されることを確認!!
結果はこんな感じで、しっかり顔認識できることを確認できました。
■最後に
go言語でも顔認識させることができました。
環境さえセットアップできてしまえばpythonと同じような感覚で顔認識まで行うことができました!!
opencvを用いれば画像類似度や動体検知も行えるようです。
色々な画像処理が行えるのでとても便利!!
詳解 OpenCV 3 ?コンピュータビジョンライブラリを使った画像処理・認識 新品価格 |
もう少しopencv色々触ってみようかな??
Webもやりたいから、、、う~~んどうしよう??