zoukankan      html  css  js  c++  java
  • 人眼定位和基于人眼的人脸姿态矫正_转载

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

  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10680631.html
Copyright © 2011-2022 走看看