現在Python, openCVを用いて顔検出のプログラムを作成しています。
cascade = cv2.CascadeClassifier(cascade_path) facerect = cascade.detectMultiScale(frame,scaleFactor=1.1,minNeighbors=1,minSize=(100,100)) if len(facerect) > 0: for rect in facerect: 処理
このようなコードを実行しようとした際に、len(facerect)が0になってしまいif内の処理を実行できません。
検出した顔を四角で囲むという処理は通っているので、顔の検出自体はできているはずなのですが...
また、dlibについても
dets = detector(frame[:, :, ::-1]) if len(dets) > 0: 処理
このコードについても同じ問題が発生しています。
そこで質問です。
顔を認識できているのにlen(facerect)やlen(dets)が0となる理由と解決策をご教示いただきたいです。
追記:今回使用したプログラム全体です。(動画をフレーム分割し、各画像から顔を検出,顔を囲んだ画像を保存という流れです)
import glob import cv2 import os import dlib import csv import matplotlib.pyplot as plt import numpy as np from PIL import Image, ImageDraw %matplotlib inline import pandas as pd from pandas import DataFrame, Series count=0 movie='パス.mov'#使用する動画 cap = cv2.VideoCapture(movie) while True: ret, img = cap.read() if ret == True: count += 1 cv2.imwrite('パス' + "Sample" + '_' + str("{0:05d}".format(count)) +'.jpg', img) #画像として保存する else: break files = sorted(glob.glob(r"パス/*.jpg") )# .jpgを整理する cascade = cv2.CascadeClassifier("パスhaarcascade_frontalface_default.xml") facerect = cascade.detectMultiScale(img,minSize=(100,100)) count=0 if len(facerect) > 0: for f in files: count += 1 img = cv2.imread(f) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = cascade.detectMultiScale(gray, minSize=(100, 100)) for (x,y,w,h) in faces: img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] cv2.imwrite('パス' + "Sample_after" + '_' + str("{0:05d}".format(count)) +'.jpg', img) #画像として保存する cv2.waitKey(0) cv2.destroyAllWindows()
回答1件
あなたの回答
tips
プレビュー