web-dev-qa-db-ja.com

opencvでカスケード分類子を使用した顔検出python

顔検出に組み込みのカスケード分類器を使用しています。これはコードです( OpenCV Pythonチュートリアル ):

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('ammma.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

for (x,y,w,h) in faces:
    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]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for(ex,ey,ew,eh) in eyes:
        cv2.Rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

しかし、コードを実行すると、次のエラーが発生します。

C:\ Python27\python.exe C:/Users/Dell/Downloads/Amma/code/fd.py

OpenCVエラー:アサーションが失敗しました(!empty())in cv :: CascadeClassifier :: detectMultiScale、file C:\ builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp、line 1634 Traceback(最新の呼び出しの最後):ファイル "C:/Users/Dell/Downloads/Amma/code/fd.py"、10行目、faces = face_cascade.detectMultiScale(img、1.3、5)cv2.error:C:\ builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\objdetect\src\cascadedetect.cpp:1634:error:(-215)!empty()in function cv :: CascadeClassifier :: detectMultiScale

7
praddy4

コードの this 行を参照してください。カスケードが空でないことを確認できませんでした。訓練されたカスケードを含むXMLファイルへのパスを確認してください。次のようなXMLへの完全パスを指定する必要がある場合があります。

face_cascade = cv2.CascadeClassifier('D:\opencv\data\haarcascades\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('D:\opencv\data\haarcascades\haarcascade_eye.xml')

または、スクリプトを含むディレクトリにこのファイルを置くだけです。

28
akarsakov

.xmlファイルをダウンロードまたはコピーする必要はありません。 OpenCV-Python PyPiページ によると、インストールされたカスケードへのパッケージ化されたパスを使用するだけです-cv2.data.haarcascades

import cv2

# Globals
FACE_CLASSIFIER = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
EYE_CLASSIFIER = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
SCALE_FACTOR = 1.3
BLUE_COLOR = (255, 0, 0)
MIN_NEIGHBORS = 5

# Then use it however you'd like
try:
    faces = FACE_CLASSIFIER.detectMultiScale(gray, SCALE_FACTOR, MIN_NEIGHBORS)
    for (x, y, w, h) in faces:
        cv2.rectangle(self.roi_frame, (x, y), (x+w, y+h), BLUE_COLOR, HAAR_LINE_THICKNESS)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = self.roi_frame[y:y+h, x:x+w]
        eyes = EYE_CLASSIFIER.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), GREEN_COLOR, HAAR_LINE_THICKNESS)
except Exception as e:
    warnings.warn('{}.show_haar_features: got exception {}'.format(__name__, e))
7
Zhanwen Chen

同様の問題に直面したとき、たまたまこの投稿を見ました。以下の2行を実行してエラーを解決しました。

face_cascade = cv2.CascadeClassifier('opencv-3.0.0/data/harcascades/haarcascade_frontalface.xml')

eye_cascade = cv2.CascadeClassifier('opencv-3.0.0/data/harcascades/haarcascade_eye.xml')

多分、それは他の人が同じことを解決するのを助けるでしょう!

2
SBhandari

私も同じ問題に直面しました。まず、システムへのファイルの正しいパスを指定する必要があります。これは、/ home/xxxx/Desktop/Projects/haarcascade_eye.xmlのようになります。次に、githubでコードを開き、実行するためにコードの未加工バージョンを保存する必要があります。両方のファイルを、プロジェクトファイルを保存するフォルダーに置くことをお勧めします。ハッピーコーディング

1

pythonがpcでそれらを見つけることができないため、このエラーが発生した場合は、これらの2つの.xmlファイルをダウンロードする必要があります。同じ問題が発生したため、.xmlファイルをダウンロードし、私の.pyファイルがあるフォルダーにそれを保存し、それから私は完璧な出力を得ましたファイルをダウンロードするには、ファイル名を検索し、sourceforgeからダウンロードします。

0
Shashank tiwari

この投稿は古いですが、それでも私の回答です。絶対パスを使用しても機能しませんでした。 (curlを使用して)ダウンロードしたXMLファイルが破損していることがわかりました。 githubフォルダーからコンテンツを手動でコピーして貼り付けた後、すべてが機能し始めました。 Zhanwen Chenの回答も機能します(組み込みの分類子でこれを行うには正しい方法だと思います)。

0
Sarvavyapi

新しいバージョンのopencv haarcascadesにもインストールされますが、haarcascadesのファイルの場所が必要です。それを取得するには、以下に示すようにcv2.data.haarcascadesを使用できます。

cascPath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + cascPath)

0
Ajinkya Gholape

たぶん、あなたはvirtualenvをpython私のように使用します。あなたはこれを試します。

import os

base_directory = os.path.abspath(os.getcwd())
directory_cv2 = os.path.join(base_directory, "Lib", "site-packages", "cv2","data")
print("la carpeta es: {}".format(directory_cv2))
0
Yerry Aguirre