嗨,大家好,我正在一个项目中,我们试图检测照片中眼睛是闭合还是睁开……到目前为止,我们所做的是先检测到人脸,然后再检测到眼睛,然后应用霍夫变换,希望虹膜是睁开眼睛时唯一的圆,问题是,闭眼时…也会产生一个圆
这是代码:
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)? 我已经将转换为,并检查第一个是否为,但是还有其他方法吗? 问题答案: 是的,除以它。是,但是是。通过简单的比较很容易找出是哪一个,因此您得到: (这假定只能是两个零之一)