python opencv7 カスケード分類器

事前に学習したい物体の特徴を抽出して, 特徴量を機械が学習し, 学習データのまとまりをカスケード分類器というらしい.
OpenCVでは"/usr/local/share/OpenCV/haarcascades/lbpcascade_animeface.xml"のようにxml形式で扱う.

pythonでは読み込んだ画像を
1.グレースケールに変換する.

image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)
#読み込む際にimage_gray = cv2.imread(image_path,0)でもOKだった

2.カスケード分類器の特徴量を取得

#cascade_path = "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"#普通の顔
cascade_path = "/usr/local/share/OpenCV/haarcascades/lbpcascade_animeface.xml" #アニメ顔
cascade = cv2.CascadeClassifier(cascade_path)

3.認識の実行

facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
#[ [顔1の範囲: x座標 y座標 横 縦]
#  [顔1の範囲: x座標 y座標 横 縦]
#]


より精度を上げたかったり, 標準に備わってなかったりする物体を認識させるためには自分で機械学習を行い分類器を作る必要があるらしい.


認識した顔の画像をファイルへ出力

i = 0;
for rect in facerect:
	#顔だけ切り出して保存
	x,y,width,height = rect#x座標, y座標, 横の長さ, 縦の長さ
	dst = image[y:y+height, x:x+width]#画像の切り出し
	cv2.imwrite("出力先のパス", dst)
	i += 1


画像に長方形を描画する.

cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=5)
#cv2.rectangle(img, 始点のタプル, 終点のタプル, 色, 線の太さ)


顔を囲った画像をファイルへ出力

if len(facerect):#顔があったら
	color = (0, 0, 255) #BGR
	for rect in facerect:
		#検出した顔を囲む矩形の作成
		cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2)
	#認識結果の保存
	cv2.imwrite(出力先のパス, image)

ここにあるコードのカスケードを変更して実行すると下のようになった.
famirror.hateblo.jp
f:id:umashika5555:20170325012923j:plain
f:id:umashika5555:20170325013105j:plain
認識できていない場合もあった.
目が2つないとダメなのかな?
f:id:umashika5555:20170325013321j:plain




OpenCVで物体検出器を作成① 基礎知識【開発会社プロフェッサ】
ultraist.hatenablog.com
opencv.blog.jp
famirror.hateblo.jp



【追記:2017:03:25】
(^_^)の画像は認識されていたようなので,(・_^)のように左右の目が統一されてない画像に弱いっぽい.