OpenCVによる”アニメ顔”検出
急にアニメ動画から顔を取り出したくなったので、OpenCV用のアニメ顔検出器を探してたんですが、ここのを使うと便利なようです。
OpenCVによるアニメ顔検出ならlbpcascade_animeface.xml - デー
よくある”顔検出器”ではアニメ顔をほとんど検出してくれませんが、ここにある”lbpcascade_animeface.xml”を使うとほんとによく検出してくれます。
入手元:http://anime.udp.jp/data/lbpcascade_animeface.xml
てことで、動画から直接顔を検出するコードを作りました。
◆「movie2face.py」
import cv2
import glob
video_path = './(動画ファイル名)'
video_name = video_path[2:8] + '_'
output_path = './movie/'
out_face_path = './face/'
xml_path = "./lbpcascade_animeface.xml"
def movie_to_image(num_cut):
capture = cv2.VideoCapture(video_path)
img_count = 0
frame_count = 0
while(capture.isOpened()):
ret, frame = capture.read()
if ret == False:
break
if frame_count % num_cut == 0:
img_file_name = output_path + str(img_count) + ".jpg"
cv2.imwrite(img_file_name, frame)
img_count += 1
frame_count += 1
capture.release()
def face_detect(img_list):
classifier = cv2.CascadeClassifier(xml_path)
img_count = 1
for img_path in img_list:
org_img = cv2.imread(img_path, cv2.IMREAD_COLOR)
gray_img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
face_points = classifier.detectMultiScale(gray_img, \
scaleFactor=1.2, minNeighbors=2, minSize=(1,1))
for points in face_points:
x, y, width, height = points
dst_img = org_img[y:y+height, x:x+width]
face_img = cv2.resize(dst_img, (64,64))
new_img_name = out_face_path + video_name + str(img_count) + 'face.jpg'
cv2.imwrite(new_img_name, face_img)
img_count += 1
if __name__ == '__main__':
movie_to_image(int(10))
images = glob.glob(output_path + '*.jpg')
face_detect(images)
この「movie2face.py」と先の「lbpcascade_animeface.xml」と動画ファイルを同一フォルダに置きます。
そのフォルダ内に「face」と「movie」というフォルダを作成。
あとは
> python movie2face.py
と実行すれば、まず「movie」フォルダに動画から取り出された静止画が保存され
その静止画から取り出された顔の部分が「face」に保存されます(64×64)。
若干誤認識がありますけど、結構な精度で落としてくれます。
ただ”ハシビロちゃん”がうまく認識されないですよね・・・ってなにをキャプチャしてるんだか。
上のコードの「xml_path = "./lbpcascade_animeface.xml"」の部分を「xml_path = "./haarcascade_frontalface_default.xml"」と置き換えて、動画をアニメからドラマやホームビデオに変えれば、人の顔をキャプチャする検出器に早変わりします。
”haarcascade_frontalface_default.xml”は、たいていOpenCVをインストールすればデフォルトで入ってくるようですが、別途入手する方法は以下。
(1) https://github.com/opencv/opencvにアクセス
(2) 「Clone or Download」をクリックし「Download ZIP」をクリック
(3) ダウンロードしたファイル(opencv-master.zip)を解凍
(4) 解凍したフォルダ内にある「data\haarcascades」の中に「haarcascade_frontalface_default.xml」というのがあるのでこれを取り出す
これを使えばリアルな人の顔を検出できます。
動画から何かを取り出したい場合は同様に、別の検出器を入手し、このコードの”xml_path=・・・”に入れればOK。
例えば猫を検出したかったら、以下のサイトから”xml”ファイルが入手可能。
ねこと画像処理 part 2 – 猫検出 (モデル配布) « Rest Term
試しにここから検出器を入手して
https://github.com/wellflat/cat-fancier
猫動画を処理してみると
確かに猫だらけになります。ただし、誤認識もちょっと多め。
自分で”物体検出器”を作りたくなったら、以下を参照。
OpenCVで物体検出器を作成する① ~基礎知識~ - 技術者ブログ
これをやるためには3000枚以上のサンプル画像を作る覚悟が必要ですが。
結構いろいろな”検出器”が転がってるようなので、応用はききそうですね。
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab |
« 128×128の1.5インチOLED付Arduino互換ボード”Pixel 2.0” | トップページ | 百均のiPhoneケースもアイデア次第で豪華に!? »
「パソコン系」カテゴリの記事
- 我が家の最近のガジェット事情(2025.01.11)
- 2024年まとめ記事(2024.12.31)
- 動画編集ソフト「Felmora(フィモーラ)」を購入(2024.12.11)
- ロジクール製小型静音Bluetoothマウスを購入(2024.11.18)
- 例のUSB電力計で会社PCの電力を測ってみた(2024.11.17)
« 128×128の1.5インチOLED付Arduino互換ボード”Pixel 2.0” | トップページ | 百均のiPhoneケースもアイデア次第で豪華に!? »
コメント