android - 在 opencv android 中用于眼球的 haar 级联

标签 android opencv eye-detection

我正在从事 opencv 眼睛检测项目,我已经通过 haar 级联双眼的帮助成功检测了双眼的矩形区域。现在我想检测双眼的眼球,问题是我没有用于眼球跟踪的 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`  

最佳答案

如果你愿意考虑其他解决方案然后 haar 级联,你可以使用面部标志检测代码。 Facial landmark packages可以给出图像中眼睛的位置(通常是眼睛的中心和左右边界)。

地标检测包示例:

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

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

关于android - 在 opencv android 中用于眼球的 haar 级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20561189/

相关文章:

android - 动态创建sqlite表

python - 开放CV : Detect object without displaying the webcam view window

android - 是否可以通过眼动仪在按钮上触发 Click 事件?

qt - OpenCv QT CvNamedWindow IplImage不起作用

opencv - 面部内眼部检测

android - 如何将 google play 和 testflight 中的 beta 用户转移到生产应用程序

android - 如何以编程方式禁用或隐藏系统设置?

java - ANDROID: If...Else 作为 Switch on String

c++ - 带有fedora 23的Opencv Qt:程序意外完成

python - 在 GUI 中嵌入窗口