Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV无法正确检测眼睛_Python_Opencv_Deep Learning_Computer Vision_Eye Detection - Fatal编程技术网

Python OpenCV无法正确检测眼睛

Python OpenCV无法正确检测眼睛,python,opencv,deep-learning,computer-vision,eye-detection,Python,Opencv,Deep Learning,Computer Vision,Eye Detection,我需要它来分别检测眼睛,无论是睁眼还是闭眼,裁剪它们并将它们保存为图像。它可以工作,但不是每一张照片 我想尽了一切办法。我尝试了scaleFactor和minNeighbors的不同值,也尝试了为检测到的眼睛添加最小和最大大小,但差别不大 我还是有问题。它有时检测到2只以上的眼睛,有时只有1只。有时它甚至把鼻孔误认为眼睛:D。尤其是当眼睛闭着的时候,错误是很常见的 我可以做些什么来提高准确性?这对我接下来的课程非常重要 face_cascade = cv2.CascadeClassifier

我需要它来分别检测眼睛,无论是睁眼还是闭眼,裁剪它们并将它们保存为图像。它可以工作,但不是每一张照片

我想尽了一切办法。我尝试了scaleFactor和minNeighbors的不同值,也尝试了为检测到的眼睛添加最小和最大大小,但差别不大

我还是有问题。它有时检测到2只以上的眼睛,有时只有1只。有时它甚至把鼻孔误认为眼睛:D。尤其是当眼睛闭着的时候,错误是很常见的

我可以做些什么来提高准确性?这对我接下来的课程非常重要

  face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
  eyes_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

  faces_detected = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)

  (x, y, w, h) = faces_detected[0]
  cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1);

  eyes = eyes_cascade.detectMultiScale(img[y:y + h, x:x + w], scaleFactor=1.1, minNeighbors=5)
  count = 1
  for (ex, ey, ew, eh) in eyes:
      cv2.rectangle(img, (x + ex, y + ey), (x + ex + ew, y + ey + eh), (255, 255, 255), 1)
      crop_img = img[y + ey:y + ey + eh, x + ex:x + ex + ew]
      s1 = 'Images/{}.jpg'.format(count)
      count = count + 1
      cv2.imwrite(s1, crop_img)

对于人脸检测的东西,我的目标是。它更复杂,速度也更慢,但会产生更高质量的结果

步骤1是从OpenCV到dlib的转换:

img=cv2.cvt色度,cv2.COLOR\u BGR2RGB 接下来,您可以使用dlib人脸检测器检测人脸。第二个参数表示将采样增加1x:

探测器=dlib.get_正面探测器 检测数=检测数mg,1 然后使用以下工具查找面部地标:

sp=dlib.shape\u predictor shape\u predictor\u 68\u face\u landmarks.dat 面=dlib.full\u对象检测 对于det in检测: 面,面,面 注意:从这里您可以获得面部芯片dlib。get_face_chipimg,faces[0]

现在,您可以获得边界框和眼睛的位置:

bb=面[0]。矩形 右眼=[faces[0]。范围36、42中i的parti] 左眼=[faces[0]。在42,48范围内为i选择parti] 以下是根据以下条件进行的所有映射:

以下是我整理的结果和代码:

导入dlib 进口cv2 加载图像 img=cv2.imreadmonalisa.jpg 转换为dlib img=cv2.cvt色度,cv2.COLOR\u BGR2RGB dlib人脸检测 探测器=dlib.get_正面探测器 检测数=检测数mg,1 寻找地标 sp=dlib.shape\u predictor shape\u predictor\u 68\u face\u landmarks.dat 面=dlib.full\u对象检测 对于det in检测: 面,面,面 包围盒和眼睛 bb=[i.rect表示面中的i] bb=[i.左,i.顶, i、 右,i.bottom表示i in bb]转换为dlib格式 右眼=[[face.parti代表范围36中的i,42]代表face中的face] 右眼=[[i.x,i.y表示右眼中的i]表示右眼中的i]转换为dlib格式 左眼=[[face.parti代表范围42中的i,48]代表面中的面] 左眼=[[i.x,i.y表示左眼中的i]表示左眼中的眼]转换为dlib格式 陈列 imgd=cv2.CVTColormg,cv2.COLOR\u RGB2BGR转换回OpenCV 对于bb中的i: cv2.rectangleimgd,i[0],i[1],255,0,0,5边界框 对于右眼: cv2.rectangleimgd,maxeye,key=lambda x:x[0][0],maxeye,key=lambda x:x[1][1], mineye,key=lambda x:x[0][0],mineye,key=lambda x:x[1][1], 0, 0, 255, 5 对于眼睛中的点: cv2.circleimgd,点[0],点[1],2,0,255,0,-1 对于左眼的眼睛: cv2.rectangleimgd,maxeye,key=lambda x:x[0][0],maxeye,key=lambda x:x[1][1], mineye,key=lambda x:x[0][0],mineye,key=lambda x:x[1][1], 0, 255, 0, 5 对于眼睛中的点: cv2.circleimgd,点[0],点[1],2,0,0255,-1 cv2.imwriteoutput.jpg,imgd cv2.imshowoutput,imgd cv2.0
请提供您的输入和输出结果,以便其他人可以使用这些图像测试您的代码。您的意思是什么?我的输入是通过网络摄像头拍摄的照片-每次都不同。输出的是同一张照片,但在检测到人脸和眼睛的情况下,opencv会在其周围绘制一个矩形。然后我有了裁剪图像的代码——将眼睛保存为单独的照片。问题是opencv有时会检测到眼睛等其他面部特征,或者根本检测不到眼睛。我的意思是,如果您向我们展示一个示例输入图像,这样人们就可以测试您的代码并尝试提出改进建议,这会有所帮助。好的,下面有一篇文章展示了我正在做的事情:即使在本文中,他们展示了OpenCV-scrow的一些问题,一直到咕噜的图片,它检测到的是4只眼睛,而不是2只。我正试图找到一种方法来达到更好的准确性,仅此而已。
mouth: 48 - 68
right_eyebrow: 17 - 22
left_eyebrow: 22 - 27
right_eye: 36 - 42
left_eye: 42 - 48
nose: 27 - 35
jaw: 0 - 17