Pythonとopencvでわちゃわちゃした
卒検配属が近づいてきた
希望の研究室はそれなりに人気があるところで倍率も1倍を超えている
審査では何かしらこれまでやってきたことなどをアピールする場があるらしい
大学に入って2年半テキトウに過ごしてきてしまったことを後悔した
審査まで日数は無いがせめてこれからだけでも何かしようと希望の研究室でやっていることに1つである画像処理に関係するものに触れてみることにした
そこで最初に思いついたのがラズパイで監視カメラを作ること
ドアにセンサを付けたりする方法など色々考えたが結局motionとかで撮った画像に僕以外の顔が写ってたらTwitterなりslackなりに送るものを作ることにした
しかし僕はプログラミングが出来ない
ちょっと講義でC言語に触れたことがあるぐらい
pythonなんて以ての外でちょっと調べた時には配列みたいなものの種類が沢山あって理解を諦めた
そんなわけで数日で出来ることなんて限られている
だからひとまずpythonとopencvで顔認識するプログラムを書こうと考えた
前置きが長くなったがこれからpythonとopencvについて調べ始めてからそのプログラムができるまでを書く
まずpythonとopencvに対する僕の理解はROSとかに使われている言語と画像処理に便利なライブラリという程度
しかしまあ時間も無かったのでそこら辺についての理解は深めずに取り敢えず環境を作る実例と目的に合いそうなソースがあるところを探して写経することにする
取り敢えずpythonとopencvで顔認識してる実例を探した
そのまま使えそうなソースが落ちているところを見つけたので参考にさせてもらうことにした
Python OpenCVの基礎 画像の読み込み(静止画) - Pythonの学習の過程とか
Pythonで遊んでみる -part1- (OpenCVで顔認識) | たくのこ Web
正直これだけで行けそうだったので次に環境を整える
このサイトを参考にした
sudo apt-get install python-numpy
sudo apt-get install python-opencv
たぶんこれでなんとかなった
そして
実際に書いたものは下のようになった
#cording: utf-8
import
numpy as np
import
cv2
color
=
(
0
,
0
,
225
)
img
=
cv2.imread(
'a.jpg'
)
gray
=
cv2.cvtColor(img,cv2.cv.CV_BGR2GRAY)
cascade
=
cv2.CascadeClassifier(
'haarcascade_profileface.xml'
)
facerect
=
cascade.detectMultiScale(gray,scaleFactor
=
1.1
,minNeighbors
=
1
,minSize
=
(
1
,
1
))
if
len
(facerect) >
0
:
for
rect
in
facerect:
cv2.rectangle(img,
tuple
(rect[
0
:
2
]),
tuple
(rect[
0
:
2
]
+
rect[
2
:
4
]),color,thickness
=
2
)
else
:
print
(
"no face"
)
cv2.imwrite(
'image.jpg'
,img)
cv2.imshow(
'image'
,img)
cv2.waitKey(
0
)
cv2.destroyAllWindows()
https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml
ここにあるものを使った
結果なんとか動いた気がするがどうも精度に満足できない
lennaとかわかりやすそうなのは認識できたが正面を向いてるのに認識できなかったり誤認識してたりと精度が悪く感じた
ちなみに萌え絵は全く認識できなかった
カスケード型分類器というものの仕組みを全く理解していないので考察はできない
自分にとって為になったんだか為になって無いんだかわからないけど取り敢えずやったことは書き終えた
ただ時間を失った虚しさだけが残ったので今後は目的をもって物事に取り組みたいと思う(プログラムを書けたら便利なんだろうなという漠然とした認識は得た)
あとusrの下を探してもopencvのフォルダが見つからなかったので心当たりのある人は教えてくれると嬉しいです