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】
(^_^)の画像は認識されていたようなので,(・_^)のように左右の目が統一されてない画像に弱いっぽい.

python opencv6 グレイスケールへの変換

cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)を用いる.
imgread()で第二引数に0を指定しても同じ効果な気がする.

# -*- coding: utf-8 -*-
import cv2

def main():
    img = cv2.imread("cocoa.jpg",0)
    cv2.imshow("cocoa",img)

    img = cv2.imread("cocoa.jpg")                 
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)  # RGB画像をグレースケールに変換
    cv2.imshow("gray scale",gray)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

f:id:umashika5555:20170324033540p:plain
cv2.COLOR_RGB2GRAYの代わりにcv2.COLOR_BGR2HSVとすると下のようになった.

# -*- coding: utf-8 -*-
import cv2

def main():
    img = cv2.imread("cocoa.jpg")                 
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    cv2.imshow("gray scale",gray)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

f:id:umashika5555:20170324033953p:plain
github.com

python opencv5 画像の重ねあわせ

im = im1 + im2という感じで重ねあわせられる(すごすぎ!)
im1,im2は同じサイズでなければならない.

# -*- coding: utf-8 -*-
import cv2

def main():
    # 2枚の画像をグレースケールで取得
    im1 = cv2.imread("test1.png",0)
    im2 = cv2.imread("test2.png",0)
    # 画像データを重ねあわせ
    im = im1 + im2
    cv2.imshow("test",im)
    cv2.waitKey(0)
    cv2.destroyAllWindows()    # ウィンドウ破棄
    
if __name__ == '__main__':
    main()

f:id:umashika5555:20170324031625p:plainf:id:umashika5555:20170324031627p:plain
合成画像ではどちらかの画像がはっきり見えているから単にピクセルを重ねただけではないようである.




python/plus.py at python · tanaka0079/python · GitHub

python opencv4 画像のりサイズ

画像のりサイズにはcv2.resize()を使う.
引数には読み込んだ画像と,リサイズしたい高さと幅のタプル

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import cv2

# Load an color image in grayscale
original_size_img = cv2.imread('cocoa.jpg',1)#0:グレースケール 1:通常

height = original_size_img.shape[0]#高さ
width  = original_size_img.shape[1]#幅
half_size_img = cv2.resize(original_size_img,(height/2,width/2))

cv2.imshow("original_size",original_size_img)
cv2.imshow("half_size",half_size_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

f:id:umashika5555:20170324030638p:plain
tatabox.hatenablog.com

python opencv3 画像の範囲切り取り+保存

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import cv2

# Load an color image in grayscale
img = cv2.imread('cocoa.jpg',1)#0:グレースケール 1:通常
cv2.imshow('cocoa',img)#読み込んだ画像を表示

x = 200
y = 200
width = 100
height = 100
src = img
dst = src[y:y+height,x:x+width]#(x,y)-(x+w,y+h)の正方形範囲を切り取る
cv2.imwrite('dst.jpg',dst)#画像を保存

clngn.hatenablog.com
opencv.blog.jp

python opencv2 画素へのアクセス

RGBではなくBGRの順にリストになっているのが注意

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import cv2

# Load an color image in grayscale
img = cv2.imread('cocoa.jpg',1)#0:グレースケール 1:通常
cv2.imshow('cocoa',img)#読み込んだ画像を表示

px = img[100,100]#画素へのアクセス
print px

print "blue:",img[100,100,0]
print "green:",img[100,100,1]
print "red:",img[100,100,0]


cv2.waitKey(0)#キーを押すと終了
cv2.destroyAllWindows()

Basic Operations on Images — OpenCV 3.0.0-dev documentation
opencv.blog.jp

python opencv1 画像を読み込んで表示

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import cv2

# Load an color image in grayscale
img = cv2.imread('cocoa.jpg',0)#0:グレースケール 1:通常
cv2.imshow('cocoa',img)#読み込んだ画像を表示

cv2.waitKey(0)#キーを押すと終了
cv2.destroyAllWindows()

opencv.blog.jp