当前位置: 首页 > 面试题库 >

OpenCV-检测眼睛是闭合还是睁开

蒋星驰
2023-03-14
问题内容

嗨,大家好,我正在一个项目中,我们试图检测照片中眼睛是闭合还是睁开……到目前为止,我们所做的是先检测到人脸,然后再检测到眼睛,然后应用霍夫变换,希望虹膜是睁开眼睛时唯一的圆,问题是,闭眼时…也会产生一个圆

这是代码:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.imgproc.Imgproc;




public class FaceDetector {

    public static void main(String[] args) {



        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        System.out.println("\nRunning FaceDetector");

        CascadeClassifier faceDetector = new CascadeClassifier("D:\\CS\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
        CascadeClassifier eyeDetector = new CascadeClassifier("D:\\CS\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml");

        Mat image = Highgui.imread("C:\\Users\\Yousra\\Desktop\\images.jpg");
        Mat gray = Highgui.imread("C:\\Users\\Yousra\\Desktop\\eyes\\E7.png");

        String faces;
        String eyes;


        MatOfRect faceDetections = new MatOfRect();
        MatOfRect eyeDetections = new MatOfRect();

        Mat face;
        Mat crop = null;
        Mat circles = new Mat();
        faceDetector.detectMultiScale(image, faceDetections);

   for (int i = 0; i< faceDetections.toArray().length; i++){

            faces = "Face"+i+".png";

             face = image.submat(faceDetections.toArray()[i]);
             crop = face.submat(4, (2*face.width())/3, 0, face.height());
            Highgui.imwrite(faces, face);
             eyeDetector.detectMultiScale(crop, eyeDetections, 1.1, 2, 0,new Size(30,30), new Size());

             if(eyeDetections.toArray().length ==0){

                 System.out.println(" Not a face" + i);
             }else{

                 System.out.println("Face with " + eyeDetections.toArray().length + "eyes" );

                 for (int j = 0; j< eyeDetections.toArray().length ; j++){

                    System.out.println("Eye" );
                    Mat eye = crop.submat(eyeDetections.toArray()[j]);
                    eyes = "Eye"+j+".png";
                    Highgui.imwrite(eyes, eye);

                 }
             }
         }





             Imgproc.cvtColor(gray, gray, Imgproc.COLOR_BGR2GRAY);
             System.out.println("1 Hough :" +circles.size());
 float circle[] = new float[3];

             for (int i = 0; i < circles.cols(); i++)
             {
                     circles.get(0, i, circle);
                 org.opencv.core.Point center = new org.opencv.core.Point();
                 center.x = circle[0];
                 center.y = circle[1];
                 Core.circle(gray, center, (int) circle[2], new Scalar(255,255,100,1), 4);
                 }


             Imgproc.Canny( gray, gray, 200, 10, 3,false);

             Imgproc.HoughCircles( gray, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 100, 80, 10, 10, 50 );
             System.out.println("2 Hough:" +circles.size());

             for (int i = 0; i < circles.cols(); i++)
             {
                     circles.get(0, i, circle);
                 org.opencv.core.Point center = new org.opencv.core.Point();
                 center.x = circle[0];
                 center.y = circle[1];
                 Core.circle(gray, center, (int) circle[2], new Scalar(255,255,100,1), 4);
                 }
             Imgproc.Canny( gray, gray, 200, 10, 3,false);

             Imgproc.HoughCircles( gray, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 100, 80, 10, 10, 50 );
             System.out.println("3 Hough" +circles.size());

             //float circle[] = new float[3];

             for (int i = 0; i < circles.cols(); i++)
             {
                     circles.get(0, i, circle);
                 org.opencv.core.Point center = new org.opencv.core.Point();
                 center.x = circle[0];
                 center.y = circle[1];
                 Core.circle(gray, center, (int) circle[2], new Scalar(255,255,100,1), 4);
                 }

            String hough = "afterhough.png";
            Highgui.imwrite(hough, gray);
   }     
}

关于如何使其更准确的任何建议?


问题答案:

在大多数情况下,即眼睛部分张开或闭合时,环形霍夫变换不太可能很好地起作用。最好隔离眼睛周围的矩形区域(边界框),并根据像素强度(灰度级)计算度量。例如,该区域内像素的方差可以很好地区分睁眼和闭眼。使用OpenCV
Haar级联在面部周围检测到的包围盒的相对位置,可以相当可靠地获得眼睛周围的包围盒。本文中的图3给出了定位过程的一些想法。

http://personal.ee.surrey.ac.uk/Personal/J.Collomosse/pubs/Malleson-
IJCV-2012.pdf



 类似资料:
  • 本文向大家介绍使用OpenCV在Python中进行人脸和眼睛检测,包括了使用OpenCV在Python中进行人脸和眼睛检测的使用技巧和注意事项,需要的朋友参考一下 使用的模块: python-opencv(cv2) Opencv(Open source computer vision) 是一个python库,可帮助我们解决计算机视觉问题。 下载python-opencv(cv2) 通用方式:pip

  • 当我在学习OpenGL时,我经常偶然发现所谓的眼空间坐标。 如果我是对的,你通常有三个矩阵。模型矩阵、视图矩阵和投影矩阵。虽然我不完全确定这背后的数学是如何工作的,但我知道将坐标转换为世界空间、视图空间和屏幕空间。 但是眼睛空间在哪里,我需要哪些矩阵来将一些东西转换为眼睛空间?

  • 问题内容: 我想检查使用PHP在特定实例上网站是否正常运行。我知道curl会获取文件的内容,但我不想阅读网站的内容。我只想查看网站的状态。有什么方法可以检查网站的状态?我们可以使用ping检查状态吗?对于我来说,从服务器获取状态信号(例如404、403等)就足够了。一小段代码可能对我有很大帮助。 问题答案: 这样的事情应该工作

  • 问题内容: 这应该很容易。 我有一个脚本,在脚本中我想确定请求是否通过或方法到达。 正确的方法是什么? 我正在考虑使用这样的东西 但是我内心深处并不觉得这是正确的方法。任何的想法? 问题答案: 更好地使用:

  • 问题内容: 我有一个json流,可以像这样: 或类似的东西 在我的Java代码中,请执行以下操作: 在第一种情况下,上述方法不起作用,因为流中只有一个元素。如何检查流是an 还是an ? 我尝试过,但是没有用。 谢谢 问题答案: 这样的事情应该做到: 这样做的好处是,只需从一次获取属性值。由于获取属性值涉及遍历哈希树或类似的树,因此对于性能(价值而言)很有用。

  • 问题内容: 是否可以检查a 是正零(0.0)还是负零(-0.0)? 我已经将转换为,并检查第一个是否为,但是还有其他方法吗? 问题答案: 是的,除以它。是,但是是。通过简单的比较很容易找出是哪一个,因此您得到: (这假定只能是两个零之一)