2016-07-09 12 views
0

Viola-JonesPythonというアルゴリズムがあります。私はopenCVルートファイルからロードするhaarcascade xmlを使用しています。しかし、口と鼻のxmlファイルはopenCVにありませんでしたので、これらのファイルはEmguCVからダウンロードしました。顔の検出の結果はOKですが、目の検出は良くなく、口の鼻は非常に悪いです。私はface_cascade.detectMultiScaleでパラメータを変更しようとしましたが、それはまったく助けませんでした。OpenCV、検出口、鼻を持つPythonのViola-Jones


マイコード:

import cv2 
import sys 

def facedet(img): 
    face_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_frontalface_default.xml') 
    eye_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_eye.xml') 
    mouth_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_mcs_mouth.xml') 
    nose_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_mcs_nose.xml') 

    img = cv2.imread(img) 
    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) 
     nose = nose_cascade.detectMultiScale(roi_gray) 
     mouth = mouth_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) 
     for (nx, ny, nw, nh) in nose: 
      cv2.rectangle(roi_color, (nx, ny), (nx + nw, ny + nh), (0, 0, 255), 2) 
     for (mx, my, mw, mh) in mouth: 
      cv2.rectangle(roi_color, (mx, my), (mx + mw, my + mh), (0, 0, 0), 2) 

    cv2.namedWindow('image', cv2.WINDOW_NORMAL) 
    cv2.imshow('image',img) 
    cv2.waitKey(0) 
    cv2.destroyAllWindows() 


if __name__ == '__main__': 
    #img = sys.argv[1] 
    facedet(img) 

私の質問

私が間違って何をしているのですか?私には良い結果をもたらす簡単な解決策はありますか?


出力:

enter image description here

enter image description here

enter image description here

enter image description here

+0

ちょうど1つの注釈:これらの写真は公開されていますか?彼らはあなたのものですか?それ以外の場合は削除してください。 – Berriel

+0

写真は公開されており、http://ibug.doc.ic.ac.uk/resources/facial-point-annotations/からダウンロードできます。 – Kattynka

答えて

2

ハールCアスカードは顔に対してはうまくいくが、個々の小さな部分ではうまくいかない。より良い解決策は、すべての顔ランドマークを一緒に検出することです。そのための良いアルゴリズムは、Dlib(http://dlib.net/face_landmark_detection.py.html)で実装されている「Vahid KazemiとJosephine Sullivanによる回帰木のアンサンブルによる1ミリ秒の顔の整列、CVPR 2014」です。

0

輸入CV2 輸入SYS

face_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_frontalface_default.xml') 
eye_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_eye.xml') 
mouth_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_mcs_mouth.xml') 
nose_cascade = cv2.CascadeClassifier('/home/kattynka/opencv/data/haarcascades/haarcascade_mcs_nose.xml') 

img = cv2.imread(img) 
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(gray, 1.3, 5) 
    nose = nose_cascade.detectMultiScale(gray, 1.3, 5) 
    mouth = mouth_cascade.detectMultiScale(gray, 1.7, 11) 

    for (ex,ey,ew,eh) in eyes: 
     cv2.rectangle(img, (ex,ey), (ex+ew, ey+eh), (0,255,0), 2) 
    for (nx, ny, nw, nh) in nose: 
     cv2.rectangle(img, (nx, ny), (nx + nw, ny + nh), (0, 0, 255), 2) 
    for (mx, my, mw, mh) in mouth: 
     cv2.rectangle(img, (mx, my), (mx + mw, my + mh), (0, 0, 0), 2) 

cv2.namedWindow('image', cv2.WINDOW_NORMAL) 
cv2.imshow('image',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

あなたはこのコードを試すことができます。それは私のために働いた。