最近的研究要用到定位瞳孔的位置,所以上网搜了下相关的代码。总结如下:

1) 定位瞳孔可以直接使用opencv中的自带的分类器(haarcascade_eye_tree_eyeglasses.xml)来实现,以前听师兄说用opencv自带的这个方法定位瞳孔不准,但我自己做了实验后发现在正面人脸的情况下定位还是很准确的,后面有图。分析了下原因,师兄是他之前实验时感觉不准有可能是他的Opencv版本还不是很高,我这里用的是opencv2.4.4,相信opencv也在它的后续版本中不断的优化它的Machine learning中相关库以提高准确率。

当然,在复杂情况下的人眼精准定位本身就是一个热门的研究课题。所以如果是复杂情况下的精准定位,opencv可能就没那么给力了。

2)用opencv中检测人脸、眼睛、嘴巴等都是用的CascadeClassifier分类器,具体使用时可以使用C的函数,也可以使用opencv中使用C++封装好的类。下面是它们检测目标时的函数形式(从opencv官网复制的)

C: CvSeq* cvHaarDetectObjects(const CvArr* image, CvHaarClassifierCascade* cascade,CvMemStorage* storage, double scale_factor=1.1, int min_neighbors=3, int flags=0, CvSize min_size=cvSize(0,0), CvSize max_size=cvSize(0,0) )

C++: void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

    这两者最大的区别在于,用C封装的函数要自己手动分配内存,而用C++的形式则不用自己去分配内存,这就是很多同学在网上找到的代码有些要分配内存,有些又不用分配内存的原因。显然C++的形式更简洁,所以我下面的代码也是用的C++的函数。

直接上代码,注意下面的haarcascade_eye_tree_eyeglasses.xml文件在opencv安装目录下的data文件夹中。

完整的代码在http://download.csdn.net/detail/computerme/7680383

  1. <span style="font-size:14px;">#include "highgui.h"
  2. #include "cv.h"
  3. #include <iostream>
  4. #include <stdio.h>
  5. using namespace std;
  6. using namespace cv;
  7. void DetectAndDraw(IplImage* img, CascadeClassifier& cascade);
  8. //String cascadeName = "haarcascade_frontalface_alt.xml";
  9. String cascadeName = "haarcascade_eye_tree_eyeglasses.xml";//nestedCascadeName
  10. int main( )
  11. {
  12. CascadeClassifier cascade;
  13. cascade.load( cascadeName );
  14. cvNamedWindow( "result", 1 );
  15. IplImage* iplImg = cvLoadImage("1.jpg");
  16. DetectAndDraw( iplImg, cascade );
  17. cvWaitKey(0);
  18. cvDestroyWindow("result");
  19. return 0;
  20. }
  21. void DetectAndDraw(IplImage* img, CascadeClassifier& cascade)
  22. {
  23. int i = 0;
  24. double t = 0;
  25. vector<Rect> faces;
  26. const static Scalar colors[] =  { CV_RGB(0,0,255),
  27. CV_RGB(0,128,255),
  28. CV_RGB(0,255,255),
  29. CV_RGB(0,255,0),
  30. CV_RGB(255,128,0),
  31. CV_RGB(255,255,0),
  32. CV_RGB(255,0,0),
  33. CV_RGB(255,0,255)} ;
  34. IplImage* gray = cvCreateImage(cvGetSize(img),8,1);
  35. cvCvtColor( img, gray, CV_BGR2GRAY );
  36. cvEqualizeHist( gray, gray );
  37. t = (double)cvGetTickCount();
  38. cascade.detectMultiScale( gray , faces,
  39. 1.1, 2, 0
  40. //|CV_HAAR_FIND_BIGGEST_OBJECT
  41. //|CV_HAAR_DO_ROUGH_SEARCH
  42. |CV_HAAR_SCALE_IMAGE
  43. ,
  44. Size(30, 30) );
  45. t = (double)cvGetTickCount() - t;
  46. printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
  47. for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
  48. {
  49. Point center;
  50. Scalar color = colors[i%8];
  51. int radius;
  52. //center可以作为瞳孔的坐标
  53. center.x = cvRound(r->x + r->width*0.5);
  54. center.y = cvRound(r->y + r->height*0.5);
  55. //radius = (int)(cvRound(r->width + r->height)*0.25);
  56. radius =2;
  57. cvCircle( img, center, radius, color, 3, 8, 0 );
  58. cvShowImage( "result", img );
  59. }
  60. cvShowImage( "result", img );
  61. }</span>

运行结果:

 

网址:http://blog.csdn.net/computerme/article/details/38142125

用opencv检测人眼并定位瞳孔位置的更多相关文章

  1. iOS开发检测是否开启定位、是否允许消息推送等权限

    1.iOS开发检测是否开启定位: 需要导入: #import <CoreLocation/CoreLocation.h> 代码如下: + (void)openLocationService ...

  2. hp小机定位网卡位置

    rad已经被olrad取代 HPUX下定位网卡位置                                                   一台HP小型机,可能配了多块网卡,在系统中以la ...

  3. 用 Python 和 OpenCV 检测图片上的条形码

      用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问 ...

  4. TextArea中定位光标位置

    原文:TextArea中定位光标位置 在项目中,遇到一个场景:希望能在TextArea中输入某条记录中的明细(明细较简单,没有附属信息,只用记录顺序和值即可,譬如用"+"号来作为明 ...

  5. 机器学习进阶-光流估计 1.cv2.goodFeaturesToTrack(找出光流估计所需要的角点) 2.cv2.calcOpticalFlowPyrLK(获得光流检测后的角点位置) 3.cv2.add(进行像素点的加和)

    1.cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)  用于获得光流估计所需要的角点参数说明:old_gray表示输入图片, ...

  6. linux下编译make文件报错“/bin/bash^M: 坏的解释器,使用grep快速定位代码位置

    一.linux下编译make文件报错“/bin/bash^M: 坏的解释器 参考文章:http://blog.csdn.net/liuqiyao_01/article/details/41542101 ...

  7. oops_根据epc定位linux_kernel_panic位置

    韩大卫@吉林师范大学 2014.12.10 转载请表明出处 ***************************************************** 关于内核报错 “Unable t ...

  8. 用 Python 和 OpenCV 检测图片上的条形码(转载)

    原文地址:http://python.jobbole.com/80448/ 假设我们要检测下图中的条形码: # load the image and convert it to grayscale 1 ...

  9. 利用.dSYM跟.app文件准确定位Crash位置

     本文转载至  http://blog.csdn.net/lvxiangan/article/details/28102629       利用.dSYM和.app文件准确定位Crash位置首先,确保 ...

随机推荐

  1. iOS - 布局重绘机制相关方法的研究

    iOS View布局重绘机制相关方法 布局 - (void)layoutSubviews - (void)layoutIfNeeded- (void)setNeedsLayout —————————— ...

  2. Hadoop DBOutputFormat的使用

    最近在研究数据在HDFS和关系型数据库之间的迁移,主要使用了两种方式:一是,按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入:二是采用JDBC的方式进行导入.MapReduce默认 ...

  3. java高级---->Thread之Exchanger的使用

    Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.今天我们就通过实例来学习一下Exchanger的用法. Exchanger的简单实例 Exchanger是 ...

  4. java基础---->java多线程之Join(二)

    如果主线程想等待子线程执行完成之后再结束,就可以使用join方法了.它的使用是等待线程对象销毁.今天我们就通过实例来学习一下多线程中join方法的使用.草在结它的种子,风在摇它的叶子.我们站着,不说话 ...

  5. java基础---->java中变参函数的使用

    Java的变参函数实现实际上参数是一个数组,今天我们就简单的学习一下它的用法. java中的变参函数 一.它的使用方法如下: public class VariableParam { private ...

  6. Linux学习(四)档案与目录管理

    1. 目录与路径  1.1 相对路径与绝对路径  1.2 目录的相关操作: cd, pwd, mkdir, rmdir  1.3 关于执行文件路径的变量: $PATH2. 档案与目录管理  2.1 档 ...

  7. 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay

    [BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作, ...

  8. 【BZOJ4429】[Nwerc2015] Elementary Math小学数学 最大流

    [BZOJ4429][Nwerc2015] Elementary Math小学数学 Description Ellen给她的学生教小学数学.期末考试已经来临了.考试有n个题目,每一个题目学生们都要对一 ...

  9. 【BZOJ1787】[Ahoi2008]Meet 紧急集合 LCA

    [BZOJ1787][Ahoi2008]Meet 紧急集合 Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 ...

  10. mybatis的<choose>和<when>、<otherwise>标签

    SELECT<choose> <when test='timeType=="yy"'> TO_CHAR(REPORT_TIME,'yyyy') </w ...