关闭

用opencv检测人眼并定位瞳孔位置

标签: opencv人眼检测瞳孔检测人眼定位瞳孔定位
8779人阅读 评论(6) 收藏 举报
分类:

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

        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>

运行结果:


4
0
查看评论

[opencv]识别人脸和眼睛

本文的目标是实现本地打开一张图片并对其中的人脸和眼睛进行识别。代码如下: #include "stdafx.h" #include <iostream> #include <stdio.h> #include "opencv2/objdetect...
  • android_ruben
  • android_ruben
  • 2016-05-17 00:56
  • 1304

OpenCV之人脸,眼睛,鼻子,嘴巴的识别

  • 2017-12-19 10:02
  • 1.73MB
  • 下载

人脸与人眼识别 opencv自带例子

所做的工作就是新建了一个VS2010工程,win32控制台应用程序,空工程。 只新建了一个cpp文件 拷贝以下代码(百度来的,感谢网友。。。) // face_detect.cpp : 定义控制台应用程序的入口点。 // //#include "stdafx.h" #incl...
  • hahawhyha
  • hahawhyha
  • 2014-01-15 19:46
  • 18039

opencv-人眼检测,人眼跟踪

#include #include #include using namespace cv; CascadeClassifier face_cascade; CascadeClassifier eye_cascade; // 人眼检测 int detectEye(cv::Mat& ...
  • hb707934728
  • hb707934728
  • 2016-07-21 10:09
  • 2883

基于模板匹配和遗传算法的人眼定位

基于模板匹配和遗传算法的人眼定位
  • gdut2015go
  • gdut2015go
  • 2015-11-19 12:47
  • 1683

用opencv检测人眼并定位瞳孔位置

最近的研究要用到定位瞳孔的位置,所以上网搜了下相关的代码。总结如下:         1) 定位瞳孔可以直接使用opencv中的自带的分类器(haarcascade_eye_tree_eyeglasses.xml)来实现,以前听师兄说用opencv自带的...
  • yansmile1
  • yansmile1
  • 2015-12-08 16:34
  • 5765

浅谈眼球识别

摘要:数字图像处理技术越来越被广泛地应用到计算机视觉、模式识别、人工智能等领域,眼球作为人体生物特征的一部分,包含着丰富的内容和信息,许多基于眼球识别的实用系统也如雨后春笋般涌现,目前已经应用于生物识别,医疗辅助,人机交互等领域。本文对眼球识别的技术实现和应用场景进行了基本的阐述。 关键词:计算机...
  • u013531497
  • u013531497
  • 2014-10-24 17:06
  • 1562

opencv2实现人脸及人眼检测_相当稳定

//opencv2检测人脸人眼的方法有很多,我试了集中,下面的程序得到的结果最准确。人可以随意动,只要摄像头可以,就没有问题。   [cpp] view plaincopyprint? /* */   &...
  • hanshuning
  • hanshuning
  • 2014-12-11 13:25
  • 2084

OPENCV之人眼检测

本篇博客主要是对前段时间数字图像课程大作业-疲劳检测所做工作的一次总结整理。主要涉及到的内容有1、基于图片的人脸、人眼检测;2、利用OPENCV实现本地视频与图片帧之间的相互转换;3、基于本地视频的人脸、人眼检测;4、操作笔记本摄像头,实现人脸、人眼检测。 1、基于图片的人脸、人眼检测 ...
  • u011345885
  • u011345885
  • 2016-02-25 22:41
  • 2089

【OpenCV】检测人脸、眼睛、鼻子、耳朵、嘴

Opencv中有训练好的Haar特征分类器(.xml文件),位于“/opencv-2.4.11/data/haarcascades/”文件夹中,调用起来非常简单。举个例子,我们想检测图片中的眼睛,就可以使用“haarcascade_eye.xml”这个分类器来做检测,代码如下:#include &l...
  • cfan927
  • cfan927
  • 2017-05-20 20:31
  • 2305
    个人资料
    • 访问:197534次
    • 积分:2911
    • 等级:
    • 排名:第14402名
    • 原创:86篇
    • 转载:6篇
    • 译文:0篇
    • 评论:75条
    文章分类
    最新评论