最近的研究要用到定位瞳孔的位置,所以上网搜了下相关的代码。总结如下:
        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文件夹中。        完整的代码在

1 <span style="font-size:14px;">#include "highgui.h"
2
3 #include "cv.h"
4
5 #include <iostream>
6
7 #include <stdio.h>
8
9
10
11 using namespace std;
12
13 using namespace cv;
14
15
16
17
18
19 void DetectAndDraw(IplImage* img, CascadeClassifier& cascade);
20
21
22
23 //String cascadeName = "haarcascade_frontalface_alt.xml";
24
25 String cascadeName = "haarcascade_eye_tree_eyeglasses.xml";//nestedCascadeName
26
27
28
29 int main( )
30
31 {
32
33 CascadeClassifier cascade;
34
35 cascade.load( cascadeName );
36
37 cvNamedWindow( "result", 1 );
38
39
40
41 IplImage* iplImg = cvLoadImage("1.jpg");
42
43
44
45 DetectAndDraw( iplImg, cascade );
46
47
48
49 cvWaitKey(0);
50
51
52
53 cvDestroyWindow("result");
54
55
56
57 return 0;
58
59 }
60
61
62
63
64
65 void DetectAndDraw(IplImage* img, CascadeClassifier& cascade)
66
67 {
68
69 int i = 0;
70
71 double t = 0;
72
73 vector<Rect> faces;
74
75 const static Scalar colors[] = { CV_RGB(0,0,255),
76
77 CV_RGB(0,128,255),
78
79 CV_RGB(0,255,255),
80
81 CV_RGB(0,255,0),
82
83 CV_RGB(255,128,0),
84
85 CV_RGB(255,255,0),
86
87 CV_RGB(255,0,0),
88
89 CV_RGB(255,0,255)} ;
90
91 IplImage* gray = cvCreateImage(cvGetSize(img),8,1);
92
93 cvCvtColor( img, gray, CV_BGR2GRAY );
94
95 cvEqualizeHist( gray, gray );
96
97
98
99 t = (double)cvGetTickCount();
100
101 cascade.detectMultiScale( gray , faces,
102
103 1.1, 2, 0
104
105 //|CV_HAAR_FIND_BIGGEST_OBJECT
106
107 //|CV_HAAR_DO_ROUGH_SEARCH
108
109 |CV_HAAR_SCALE_IMAGE
110
111 ,
112
113 Size(30, 30) );
114
115 t = (double)cvGetTickCount() - t;
116
117 printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
118
119
120
121 for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
122
123 {
124
125 Point center;
126
127 Scalar color = colors[i%8];
128
129 int radius;
130
131 //center可以作为瞳孔的坐标
132
133 center.x = cvRound(r->x + r->width*0.5);
134
135 center.y = cvRound(r->y + r->height*0.5);
136
137 //radius = (int)(cvRound(r->width + r->height)*0.25);
138
139 radius =2;
140
141 cvCircle( img, center, radius, color, 3, 8, 0 );
142
143 cvShowImage( "result", img );
144
145 }
146
147
148
149 cvShowImage( "result", img );
150
151 }</span>

人眼定位和基于人眼的人脸姿态矫正_#include

 

作者:你的雷哥

本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。