opencv 能识别眼睛吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 能识别眼睛吗相关的知识,希望对你有一定的参考价值。

参考技术A 可以啊。给你个代码
人眼睛识别:
  #include "stdafx.h"
  #include "cv.h"
  #include "highgui.h"
  #include <stdio.h>

  #ifdef _EiC
  #define WIN32
  #endif

  static CvMemStorage* storage = 0;
  static CvHaarClassifierCascade* cascade = 0;

  void detect_and_draw( IplImage* image );

  const char* cascade_name =
  "haarcascade_eye.xml";//人脸检测分类器

  int main( int argc, char** argv )
  
  CvCapture* capture = 0;
  IplImage *frame, *frame_copy = 0;
  int optlen = strlen("--cascade=");
  const char* input_name;

  if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 )
  
  cascade_name = argv[1] + optlen;
  input_name = argc > 2 ? argv[2] : 0;
  
  else
  
  cascade_name = "C:/OpenCV2.0/data/haarcascades/haarcascade_eye.xml";//分类器路径

  input_name = argc > 1 ? argv[1] : 0;
  

  cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

  if( !cascade )//如果没有找到分类器,输出以下
  
  fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
  fprintf( stderr,
  "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );
  return -1;
  
  storage = cvCreateMemStorage(0);

  capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );//读取摄像头
  if(!capture)//如果没有摄像头读取视频文件

  capture = cvCaptureFromAVI("检测.avi");

  cvNamedWindow( "result", 1);//创建窗口

  if( capture )
  
  for(;;)
  
  if( !cvGrabFrame( capture ))//从摄像头中抓取帧
  break;
  frame = cvRetrieveFrame( capture );//读取上边抓取的帧
  if( !frame )
  break;
  if( !frame_copy )
  frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
  IPL_DEPTH_8U, frame->nChannels );
  if( frame->origin == IPL_ORIGIN_TL )
  cvCopy( frame, frame_copy, 0 );
  else
  cvFlip( frame, frame_copy, 0 );

  detect_and_draw( frame_copy );

  if( cvWaitKey( 10 ) >= 0 )
  break;
  

  cvReleaseImage( &frame_copy );
  cvReleaseCapture( &capture );
  
  else//没检测到视频文件或者摄像头
  
  const char* filename = (char*)"检测.jpg";//读图片
  IplImage* image = cvLoadImage( filename, 1 );

  if( image )
  
  detect_and_draw( image );
  cvWaitKey(0);
  cvReleaseImage( &image );
  
  else
  

  FILE* f = fopen( filename, "rt" );
  if( f )
  
  char buf[1000+1];
  while( fgets( buf, 1000, f ) )
  
  int len = (int)strlen(buf);
  while( len > 0 && isspace(buf[len-1]) )
  len--;
  buf[len] = '\0';
  image = cvLoadImage( buf, 1 );
  if( image )
  
  detect_and_draw( image );
  cvWaitKey(0);
  cvReleaseImage( &image );
  
  
  fclose(f);
  
  

  

  cvDestroyWindow("result");

  return 0;
  

  void detect_and_draw( IplImage* img )
  
  static CvScalar colors[] =
  
  0,0,255,
  0,128,255,
  0,255,255,
  0,255,0,
  255,128,0,
  255,255,0,
  255,0,0,
  255,0,255
  ;
  double scale = 1.3;
  IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
  IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
  cvRound (img->height/scale)),
  8, 1 );
  int i;

  cvCvtColor( img, gray, CV_BGR2GRAY );
  cvResize( gray, small_img, CV_INTER_LINEAR );
  cvEqualizeHist( small_img, small_img );
  cvClearMemStorage( storage );

  if( cascade )
  
  double t = (double)cvGetTickCount();
  CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
  1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
  cvSize(30, 30) );//检测人脸返回矩形人脸
  t = (double)cvGetTickCount() - t;
  printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
  for( i = 0; i < (faces ? faces->total : 0); i++ )//找到矩形中心,把矩形转化为圆形
  
  CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
  CvPoint center;
  int radius;
  center.x = cvRound((r->x + r->width*0.5)*scale);
  center.y = cvRound((r->y + r->height*0.5)*scale);
  radius = cvRound((r->width + r->height)*0.25*scale);
  cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
  
  

  cvShowImage( "result", img );
  cvReleaseImage( &gray );
  cvReleaseImage( &small_img );
  本回答被提问者和网友采纳
参考技术B 这个库里面好像就有吧。。。

OpenCV-Python 人脸眼睛嘴识别

 1 # 识别眼睛、嘴巴、人脸
 2 image = cv2.imread(./yong.jpg)
 3 
 4 gray = cv2.cvtColor(image,code=cv2.COLOR_BGR2BGRA)
 5 # 加载算法
 6 face_detector = cv2.CascadeClassifier(./haarcascade_frontalface_default.xml)
 7 eye_detector = cv2.CascadeClassifier(./haarcascade_eye.xml)
 8 mouth_detector = cv2.CascadeClassifier(./haarcascade_mcs_mouth.xml)
 9 
10 face_zone = face_detector.detectMultiScale(gray,1.3,3,minSize=(80,80))
11 print(face_zone)
12 for x,y,w,h in face_zone:
13     cv2.rectangle(image, pt1=(x,y),pt2=(x+w,y+h), color=[0,0,255],thickness=2)
14 
15 #  人脸切分
16 h_up = int(face_zone[0,-1]*0.6)
17 x,y,w,h = face_zone.reshape(-1)
18 # 头部
19 head = gray[y:y+h,x:x+w]
20 head_up = head[0:h_up]
21 head_down = head[h_up:]
22 # 检测眼睛
23 eye_zone = eye_detector.detectMultiScale(head_up,1.3,3,minSize=(10,10))
24 for ex,ey,ew,eh in eye_zone:
25     cv2.rectangle(image, pt1=(ex + x,ey+y), pt2=(ex+ew+x,ey+eh+y),color=[0,255,0],thickness=1)
26 
27 # 检查嘴
28 mouth_zone = mouth_detector.detectMultiScale(head_down,1.3,3,minSize=(10,10))
29 for mx,my,mw,mh in mouth_zone:
30     cv2.rectangle(image, pt1=(mx + x,my+y+h_up), pt2=(mx+mw+x,my+mh+y+h_up),color=[255,0,0],thickness=1)
31 
32 
33 cv2.imshow(liyong, image)
34 cv2.waitKey(0)
35 cv2.destroyAllWindows()    

  代码第一行:    导入图片

  第二行:      灰度化处理

  第六--九行:    读取特征数据,并使用分类器对特征数据进行处理

  第十--十三行:   进行人脸识别

  第十五--二十一行: 进行人脸切分,在上部分识别眼睛;人脸下部分识别嘴的预处理

  第二十三--二十五行:  识别眼睛

  第二十八--三十行:  识别嘴 

以上是关于opencv 能识别眼睛吗的主要内容,如果未能解决你的问题,请参考以下文章

利用opencv从动物眼睛形态识别出眼睛

教你快速使用OpenCV/Python/dlib进行眨眼检测识别!

手把手教你如何用 OpenCV + Python 实现人脸识别

OpenCV3计算机视觉+Python

你好,看到你说opencv中人脸检测转换成眼睛只要替换一个分类器。请问它们程序原理一样吗?是Adaboost,矩形

OPENCV图像识别-求思路