2014년 12월 5일 금요일

Opencv의 Machine Learning, Cuda, OpenCL 사용 Eye Tracking

 OpenCV를 이용해서 간단한 Eye Tracking을 만들어 보았다.



 Training Data는 Opencv 2.4.9 설치 할때 있는 Data를 그대로 써보았는데, 제법 잘 Train 되어 있었다. Cuda와 Opencl은 직접 코딩한거는 아니고, Opencv에서 제공하는 함수를 썻는데, 직접 최적화 한거랑 성능 비교는 나중에 해봐야겠다.

 아래 Code는 OpenCV의 OpenCL(Ocl클래스)를 사용한것이다.

[-] Collapse
UINT CSecretDlg::EyeDetectOcl(LPVOID lParam)
{
    CSecretDlg *pDlg = (CSecretDlg*)lParam;
    CGrab * pGrab = CGrab::GetInstance(1600,1200);
    IplImage* pImage = NULL;
    Mat matImg;


    ocl::OclCascadeClassifier eye_classifier;
    eye_classifier.load("C:\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml");
    while(pDlg->bContinuosGrab)
    {
        pGrab->GrabImage(pImage);
        if(pImage==NULL)
            continue;
        matImg = cvarrToMat(pImage);
        oclMat frame(matImg);
        oclMat grayframe;

        ocl::cvtColor(frame, grayframe, CV_BGR2GRAY);
        ocl::equalizeHist(grayframe,grayframe);
        // -------------------------------------------------------------
        // face detection routine
        // a vector array to store the face found
        vector<cv::Rect> eyes;
        eye_classifier.detectMultiScale(grayframe, eyes,1.2,4,CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE,Size(30,30),Size(150,150));

        // -------------------------------------------------------------
        // draw the results
        for(int i=0; i<eyes.size(); i++)
        {
            rectangle(matImg, eyes[i], cv::Scalar(0,255,0), 3, 4, 0);
        }
        CDisplayPC::GetInstance()->DisplayImage(matImg,pDlg->m_hWnd,IDC_STATIC_DISPLAY);
    }
    cvReleaseImage(&pImage);
    return 0;
}

댓글 없음:

댓글 쓰기