用opencv检测人眼并定位瞳孔位置
最近的研究要用到定位瞳孔的位置,所以上网搜了下相关的代码。总结如下:
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
- <span style="font-size:14px;">#include "highgui.h"
- #include "cv.h"
- #include <iostream>
- #include <stdio.h>
- using namespace std;
- using namespace cv;
- void DetectAndDraw(IplImage* img, CascadeClassifier& cascade);
- //String cascadeName = "haarcascade_frontalface_alt.xml";
- String cascadeName = "haarcascade_eye_tree_eyeglasses.xml";//nestedCascadeName
- int main( )
- {
- CascadeClassifier cascade;
- cascade.load( cascadeName );
- cvNamedWindow( "result", 1 );
- IplImage* iplImg = cvLoadImage("1.jpg");
- DetectAndDraw( iplImg, cascade );
- cvWaitKey(0);
- cvDestroyWindow("result");
- return 0;
- }
- void DetectAndDraw(IplImage* img, CascadeClassifier& cascade)
- {
- int i = 0;
- double t = 0;
- vector<Rect> faces;
- const static Scalar colors[] = { CV_RGB(0,0,255),
- CV_RGB(0,128,255),
- CV_RGB(0,255,255),
- CV_RGB(0,255,0),
- CV_RGB(255,128,0),
- CV_RGB(255,255,0),
- CV_RGB(255,0,0),
- CV_RGB(255,0,255)} ;
- IplImage* gray = cvCreateImage(cvGetSize(img),8,1);
- cvCvtColor( img, gray, CV_BGR2GRAY );
- cvEqualizeHist( gray, gray );
- t = (double)cvGetTickCount();
- cascade.detectMultiScale( gray , faces,
- 1.1, 2, 0
- //|CV_HAAR_FIND_BIGGEST_OBJECT
- //|CV_HAAR_DO_ROUGH_SEARCH
- |CV_HAAR_SCALE_IMAGE
- ,
- Size(30, 30) );
- t = (double)cvGetTickCount() - t;
- printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
- for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
- {
- Point center;
- Scalar color = colors[i%8];
- int radius;
- //center可以作为瞳孔的坐标
- center.x = cvRound(r->x + r->width*0.5);
- center.y = cvRound(r->y + r->height*0.5);
- //radius = (int)(cvRound(r->width + r->height)*0.25);
- radius =2;
- cvCircle( img, center, radius, color, 3, 8, 0 );
- cvShowImage( "result", img );
- }
- cvShowImage( "result", img );
- }</span>
运行结果:
网址:http://blog.csdn.net/computerme/article/details/38142125
用opencv检测人眼并定位瞳孔位置的更多相关文章
- iOS开发检测是否开启定位、是否允许消息推送等权限
1.iOS开发检测是否开启定位: 需要导入: #import <CoreLocation/CoreLocation.h> 代码如下: + (void)openLocationService ...
- hp小机定位网卡位置
rad已经被olrad取代 HPUX下定位网卡位置 一台HP小型机,可能配了多块网卡,在系统中以la ...
- 用 Python 和 OpenCV 检测图片上的条形码
用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问 ...
- TextArea中定位光标位置
原文:TextArea中定位光标位置 在项目中,遇到一个场景:希望能在TextArea中输入某条记录中的明细(明细较简单,没有附属信息,只用记录顺序和值即可,譬如用"+"号来作为明 ...
- 机器学习进阶-光流估计 1.cv2.goodFeaturesToTrack(找出光流估计所需要的角点) 2.cv2.calcOpticalFlowPyrLK(获得光流检测后的角点位置) 3.cv2.add(进行像素点的加和)
1.cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params) 用于获得光流估计所需要的角点参数说明:old_gray表示输入图片, ...
- linux下编译make文件报错“/bin/bash^M: 坏的解释器,使用grep快速定位代码位置
一.linux下编译make文件报错“/bin/bash^M: 坏的解释器 参考文章:http://blog.csdn.net/liuqiyao_01/article/details/41542101 ...
- oops_根据epc定位linux_kernel_panic位置
韩大卫@吉林师范大学 2014.12.10 转载请表明出处 ***************************************************** 关于内核报错 “Unable t ...
- 用 Python 和 OpenCV 检测图片上的条形码(转载)
原文地址:http://python.jobbole.com/80448/ 假设我们要检测下图中的条形码: # load the image and convert it to grayscale 1 ...
- 利用.dSYM跟.app文件准确定位Crash位置
本文转载至 http://blog.csdn.net/lvxiangan/article/details/28102629 利用.dSYM和.app文件准确定位Crash位置首先,确保 ...
随机推荐
- 将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法
在build.gradle里添加以下两句: aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false
- nutch爬取时Exception in thread “main” java.io.IOException: Job failed!
用cygwin运行nutch 1.2爬取提示IOException: $ bin/nutch crawl urls -dir crawl -depth 3 -topN 10 crawl started ...
- PyQt4开关按钮ToggleButton
PyQt4没有开关按钮部件.但是我们可以使用在特殊状态下的QPushButton部件来创建开关按钮.而所谓的开关按钮就是一个具有按下和未按下两种状态的普通赶牛.用户可以通过单击按钮来切换其开或者关的状 ...
- Android Graphviz 安装
1. Windows下使用android ADT工具dmtracedump.exe绘图在windows下使用dmtracedump绘图时,出现如下错误: 'dot' 不是内部或外部命令,也不是可运行的 ...
- sonar-scanner扫描代码出错 SonarQube svn: E170001
问题报错: Caused by: org.tmatesoft.svn.core.SVNAuthenticationException: svn: E170001: Authentication req ...
- 【BZOJ5008】方师傅的房子 三角剖分
[BZOJ5008]方师傅的房子 Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形,原点一定严格在凸多边形内部.有m个人也到 ...
- Unity3D笔记七 GUILayout
一.说到GUILayout就要提到GUI,二者的区别是什么 GUILayout是游戏界面的布局.GUI(界面)和GUILayout(界面布局)功能上面是相似的从命名中就可以看到这两个东西非常相像,但是 ...
- Nginx配置文件(nginx.conf)配置详解[转]
转自:http://blog.csdn.net/tjcyjd/article/details/50695922 重新学习,发觉这篇文章写得很详细就摘录了! Nginx的配置文件nginx.conf配置 ...
- 310实验室OTL问题
1.首先是下载OTL文件包,网址是:github.com/O-T-L,可以直接点击网页上的下载链接,也可以使用unlix命令,git clone https://github.com/O-T-L/OT ...
- 沈阳网络赛K-Supreme Number【规律】
26.89% 1000ms 131072K A prime number (or a prime) is a natural number greater than 11 that cannot be ...