##背景差分のアルゴリズム
アルゴリズムにはいろいろな種類がある。
アルゴリズムに関する性能の違いに関しては、「このサイト」にまとめられているので、詳しくはそこで見てください。C++で書かれているのでpythonの形式に直す必要がある。ちなみに「gt」とは、ground truthのことで理想の結果で人の手で作成したものである。
今回、試したアルゴリズムはMOG2とGSONです。どちらも、findContoursを使い輪郭抽出を行っている。
これらの、アルゴリズムを利用するにはopencv-contribをインストールする必要がある。
pipでインストールすることができる。
pip install opencv-contrib-python
###GSON
先のサイトで1番性能の良さそげだったため、最初に試してみた。
pythonの形式に直すのは非常に簡単だった。
このアルゴリズムを利用すると、きれいに物体検出をすることができる。
しかし、このアルゴリズムだと人の影が出てしまう。
fgmaskは2値化された値となっている。
fgbg = cv2.bgsegm.createBackgroundSubtractorGSOC()
fgmask = fgbg.apply(frame)
###MOG2
次にMOG2を使ってみた。MOG2を使った理由としては、thresholdを利用して影を消すためである。
2値化されていると、thresholdを用いて影を消すことができない。
人の影を消すには200くらいにしておくと消えるらしい。
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG2()
fgmask = fgbg.apply(frame)
_ , fgmask = cv2.threshold(fgmask,200,255 ,cv2.THRESH_BINARY )
###まとめ
GSON,MOG2それぞれを使い、物体検知を行ったがどちら求めている結果をえることができなかった。
GSONの場合、遠いところでの物体検知は良く、検出が途中で切れることはなかった。しかし、影が出てしまうため、二人並んで歩いてしまうとまとめて一つとして検知されてしまう。
一方MOG2は、遠方での物体検知は良くなり、影がなかった分人が重ならない限りまとめて検知されることはなかった。しかし、検出がよく切れ安定しなかった。
対象が絶対に一人だけであれば、GSONを使ったほうがいい。