haar cascade for opencv android中的眼球

时间:2013-12-13 07:23:41

标签: android opencv eye-detection

我正在研究opencv眼睛检测项目,并且我已经通过两只眼睛的haar级联来成功地检测到双眼的矩形区域。现在我想从两只眼睛中检测到眼球,问题是我没有用于眼球跟踪的帽子级联。如果有人有这个xml并建议其他解决方案,请帮助我。 这是我的眼睛检测代码

    private Mat  get_template(CascadeClassifier clasificator, Rect area,int size)
{
        Mat eye = new Mat();
        Mat template = new Mat();
        Mat mROI = mGray.submat(area);
        MatOfRect eyes = new MatOfRect();
        Point iris = new Point();
        Rect eye_template = new Rect();
        clasificator.detectMultiScale(mROI, eyes, 1.15, 2, Objdetect.CASCADE_FIND_BIGGEST_OBJECT|Objdetect.CASCADE_SCALE_IMAGE, new Size(30,30), new Size());
    Rect[] eyesArray = eyes.toArray();

    for (int i = 0; i < eyesArray.length; i++)

    {

        Rect e = eyesArray[i];

        e.x = area.x + e.x;
        e.y = area.y + e.y;

        Core.rectangle(mROI, e.tl(), e.br(), new Scalar(25, 50, 0, 255));

        Rect eye_only_rectangle = new Rect((int)e.tl().x,   (int)( e.tl().y + e.height*0.4),   (int)e.width,   (int)(e.height*0.6));
        //reduce ROI
        mROI = mGray.submat(eye_only_rectangle);
        Mat vyrez = mRgba.submat(eye_only_rectangle);
        Core.MinMaxLocResult mmG = Core.minMaxLoc(mROI);
        //Draw pink circle on eyeball
        int radius = vyrez.height()/2; 
   //   Core.circle(vyrez, mmG.minLoc, 2, new Scalar(0, 255, 0, 1), radius);
        //Core.circle(vyrez, mmG.minLoc,2, new Scalar(255, 0, 255),1);
        iris.x = mmG.minLoc.x + eye_only_rectangle.x;
        iris.y = mmG.minLoc.y + eye_only_rectangle.y;
        eye_template = new Rect((int)iris.x-size/2,(int)iris.y-size/2 ,size,size);
        //draw red rectangle around eyeball 
        //Core.rectangle(mRgba,eye_template.tl(),eye_template.br(),new Scalar(255, 0, 0, 255), 2);
        eye = (mRgba.submat(eye_only_rectangle));
        template = (mGray.submat(eye_template)).clone();
        //return template;

        Mat eyeball_HSV = new Mat();
        Mat dest = new Mat();       
        //Mat eye = new Mat();

        //eye = mRgba.submat(eye_only_rectangle);

        List<Mat> hsv_channel = new ArrayList<Mat>();
         //convert image to HSV 
           Imgproc.cvtColor(eye, eyeball_HSV, Imgproc.COLOR_RGB2HSV, 0);

          // get HSV channel 
        //hsv_channel[0] is hue
        //hsv_channel[1] is saturation
        //hsv_channel[2] is visibility
        Core.split(eyeball_HSV, hsv_channel);

        try
        {
             hsv_channel.get(0).setTo(new Scalar(145));

             Log.v(TAG, "Got the Channel!");
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            Log.v(TAG, "Didn't get any channel");
        }

        Core.merge(hsv_channel, eyeball_HSV);

        Imgproc.cvtColor(eyeball_HSV, dest, Imgproc.COLOR_HSV2RGB);
        Imgproc.cvtColor(dest, eye, Imgproc.COLOR_RGB2RGBA);    


    }

     return eye;
  }`enter code here`  

1 个答案:

答案 0 :(得分:2)

如果您愿意考虑其他解决方案,那么您可以使用面部地标检测代码。面部地标包可以给出图像中眼睛的位置(通常是眼睛的中心和左右边界)。

地标检测包的示例:

STASM: http://www.milbo.users.sonic.net/stasm/

Flandmark探测器: http://cmp.felk.cvut.cz/~uricamic/flandmark/