前提・実現したいこと
WEBカメラの映像をPythonとOpenCVで顔認識して遊ぶ
こちらのサイトを参考(丸コピ)して顔認識できるツールを作ってみたのですが、
cv2.VideoCaptureでWebカメラから取得した映像を90度回転させたいです。
該当のソースコード
python
1import sys 2import cv2 # OpenCV のインポート 3import tkinter 4import numpy as np 5 6''' 7参考 8@link http://ensekitt.hatenablog.com/entry/2017/12/19/200000 9@link https://note.nkmk.me/python-opencv-face-detection-haar-cascade/ 10@link https://note.nkmk.me/python-opencv-mosaic/ 11@link http://workpiles.com/2015/04/opencv-detectmultiscale-scalefactor/ 12''' 13 14# VideoCaptureのインスタンスを作成する。 15# 引数でカメラを選べれる。 16cap = cv2.VideoCapture(1) 17 18if cap.isOpened() is False: 19 print("can not open camera") 20 sys.exit() 21 22# 評価器を読み込み 23# https://github.com/opencv/opencv/tree/master/data/haarcascades 24cascade = cv2.CascadeClassifier('/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml') 25eye_cascade = cv2.CascadeClassifier('/usr/local/share/opencv4/haarcascades/haarcascade_eye_tree_eyeglasses.xml') 26 27def mosaic(src, ratio=0.1): 28 small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST) 29 return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST) 30 31def mosaic_area(src, x, y, width, height, ratio=0.1): 32 dst = src.copy() 33 dst[y:y + height, x:x + width] = mosaic(dst[y:y + height, x:x + width], ratio) 34 return dst 35 36while True: 37 # VideoCaptureから1フレーム読み込む 38 ret, frame = cap.read() 39 40 # そのままの大きさだと処理速度がきついのでリサイズ 41 frame = cv2.resize(frame, (int(frame.shape[1]*0.7), int(frame.shape[0]*0.7))) 42 #windowサイズはここで変更 43 44 # 処理速度を高めるために画像をグレースケールに変換したものを用意 45 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 46 47 # 顔検出 48 facerect = cascade.detectMultiScale( 49 gray, 50 scaleFactor=1.11, 51 minNeighbors=3, 52 minSize=(100, 100) 53 ) 54 55 if len(facerect) != 0: 56 for x, y, w, h in facerect: 57 # 顔の部分(この顔の部分に対して目の検出をかける) 58 face_gray = gray[y: y + h, x: x + w] 59 60 # くり抜いた顔の部分を表示(処理には必要ない。ただ見たいだけ。) 61 show_face_gray = cv2.resize(face_gray, (int(gray.shape[1]), int(gray.shape[0]))) 62 cv2.imshow('face', show_face_gray) 63 64 # 顔の部分から目の検出 65 eyes = eye_cascade.detectMultiScale( 66 face_gray, 67 scaleFactor=1.11, # ここの値はPCのスペックに依存するので適宜修正してください 68 minNeighbors=3, 69 minSize=(15, 15) 70 ) 71 72 if len(eyes) == 0: 73 # 目が閉じられたとみなす 74 cv2.putText( 75 frame, 76 'close your eyes', 77 (x, y - 10), # 位置を少し調整 78 cv2.FONT_HERSHEY_PLAIN, 79 2, 80 (0, 255,0), 81 2, 82 cv2.LINE_AA 83 ) 84 else: 85 for (ex, ey, ew, eh) in eyes: 86 # 目の部分にモザイク処理 87 frame = mosaic_area( 88 frame, 89 int((x + ex) - ew / 2), 90 int(y + ey), 91 int(ew * 2.5), 92 eh 93 ) 94 95 # 顔検出した部分に枠を描画 96 cv2.rectangle( 97 frame, 98 (x, y), 99 (x + w, y + h), 100 (255, 255, 255), 101 thickness=2 102 ) 103 104 cv2.imshow('ARA', frame) 105 106 # キー入力を1ms待って、k が27(ESC)だったらBreakする 107 k = cv2.waitKey(1) 108 if k == 27: 109 break 110 111# キャプチャをリリースして、ウィンドウをすべて閉じる 112cap.release() 113cv2.destroyAllWindows()
補足情報(FW/ツールのバージョンなど)
python 3.7.3
anaconda3 2019.07
openCV
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/26 11:13