2016-03-26 15 views
1

Ünlü Oscar selfie görüntüsündeki yüzlerin her birinde göz taraması yapmak zorundayım.Çocukların çoğu yakın frontal olduğundan yüzlerde Haar Casacades kullanmayı denedim, ancak göz algılama tamamen rastgele ve hiç bir göz tanınmıyor.Oscar selfie'de göz taraması

enter image description here

bekar yüzlerle görüntülerde göz tespiti için aynı Haar kaskad xml dosyası denedim ve iyi çalıştı.

Gözleri doğru bir şekilde algılamak için hangi adımları izleyebilirim?

ben göz tespiti için kullanılan resim buradan indirilebilir: Aşağıda

https://drive.google.com/file/d/0B3jt6sHgpxO-d1plUjg5eU5udW8/view?usp=sharing

Ben yüz ve göz tespiti için yazdım kodudur. Temel fikir ilk olarak viola jones algoritmasını kullanarak yüzü tespit ettim ve her bir yüz içinde gözleri tespit etmeye çalışıyorum.

#include <opencv2/highgui/highgui.hpp> 
#include <cv.h> 
#include <opencv2/objdetect/objdetect.hpp> 
#include <vector> 

using namespace cv; 
using namespace std; 

int x,y,w,h; 

int main(int argc, const char** argv) 
{ 
    Mat image = imread("oscarSelfie.jpg",CV_LOAD_IMAGE_UNCHANGED); 
    Mat gray_img; 
    cvtColor(image, gray_img, CV_BGR2GRAY); 
    string faceCascade_file = "haarcascade_frontalface_alt2.xml"; 
    string eyeCascade_file = "haarcascade_eye.xml"; 

    CascadeClassifier faceCascade; 
    CascadeClassifier eyeCascade; 
     //Cascade classifier is a class which has a method to load the classifier from file 
    if(!faceCascade.load(faceCascade_file)) 
     { cout<<"--(!)Error loading\n"; return -1; }; 
    //If it returns zero, it means an error has occured in loading the classifier 

    if(!eyeCascade.load(eyeCascade_file)) 
     { cout<<"--(!)Error loading\n"; return -1; }; 

    equalizeHist(gray_img, gray_img); 
    //Increases contrast and make image more distingushable 

    /***** Detecting Faces in Image *******/ 
    vector<Rect> faces; 
    vector<Rect> eyes; 
    //Rect is a class handling the rectangle datatypes 
    faceCascade.detectMultiScale(gray_img, faces, 1.1, 1,  0|CV_HAAR_SCALE_IMAGE, Size(30, 30)); 
    //faces.size()-it will return number of faces detected 
    for(int i = 0; i < faces.size(); i++) 
    { 
     x = faces[i].x; 
     y = faces[i].y; 
     w = faces[i].width; 
     h = faces[i].height; 
     //Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5); 
     //ellipse(image, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); 
     rectangle(image, cvPoint(x,y), cvPoint(x+w,y+h), CV_RGB(0,255,0), 2, 8); 

     /******** Detecting eyes ***********/ 
    eyeCascade.detectMultiScale(gray_img, eyes, 1.1, 50, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30)); 

    for(int j=0; j < eyes.size(); j++) 
    { 
     Point center(faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5); 
     int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); 
     circle(image, center, radius, Scalar(255, 0, 0), 4, 8, 0); 
    } 
} 

namedWindow("oscarSelfie :)", CV_WINDOW_AUTOSIZE); 
imshow("oscarSelfie :)", image); 
waitKey(0); 
destroyWindow("pic"); 
return 0; 

} `

+0

(https://github.com/Itseez/opencv/blob/master/samples/cpp/facedetect OpenCV [örnekleri], bkz tekerleği yeniden icat gerek .cpp) ve [tutorials] (https://github.com/Itseez/opencv/blob/master/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp) – sturkmen

+0

hey sturkmen, daha önce dersler ve örnekler içerisindeydim ama Tıkanıklık nedeniyle tüm yüzleri algılamıyor gibi görünmüyor ve gözümün algılanması sadece korkunç, bir gözü bile bir çift tespit etmiyor. –

cevap

1

i facedetect.cpp ile aşağıdaki sonuç

ben de dlib en face_landmark_detection_ex.cpp çalıştı enter image description here

tüm yüzleri ve gözleri bulmak için beklemeyin

( haarcascade_eye_tree_eyeglasses.xml kullanır) olsun sonuçları karşılaştırmak için: enter image description here

dlib

enter image description here

+1

hey sturkmen, hatam oldu. Her yüzden ziyade tüm görüntü üzerinde göz taraması yapıyordum. Yardım ve örnek kod için çok teşekkürler. :) –

0

aşağıda görüldüğü Sen yüz dönüm tespiti için CLM-framework kullanmak isteyebilirsiniz sever hizalanmış yüzleri verir ekstra bir özelliği vardır. CLM-framework performansı konusunda tecrübem var. eylem sistemin

Bazı örnekler: http://youtu.be/V7rV0uy7heQ

+0

Hey Giray, alternatif bir kütüphane önerdiğin için teşekkürler. Ama OpenCV kullanarak bunu yapmanın daha iyi bir yolunu arıyordum. –

İlgili konular