新仙剑奇侠传逍遥等级:转:Java使用OpenCV进行人脸识别

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 14:48:44

转:Java使用OpenCV进行人脸识别

    博客分类:
  • Java
JavaXMLC#C++C 原帖地址:http://www.docslib.com/html/JAVAwendang/2009/0703/28.html


遇到opencv,使用后,列一下。
(当然据说目前挺火的 绿*霸 用的就是这个)
opencv是个图形函数库,内容丰富。是Intel资助的开源计算机视觉库。
由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV 对非商业应用和商业应用都是免费(FREE)的。
相关网站:
http://www.opencv.org.cn
http://sourceforge.net/projects/opencvlibrary/
http://tech.groups.yahoo.com/group/OpenCV/

下载下来后,例子直接运行。
有些情况,比如提供的例子运行出错,需要重新编译。
windows下,vc6,重编译时有错误,是源程序里有个注释写错了位置,改了可以了,编译有顺序,一般提示...d文件找不到,顺藤摸瓜的找到源文件,编译就可以。

有个face检测的程序有意思:
可以检测人脸。
直接调用人脸检测函数。非常简单


人脸检测是2002年的论文?后来加入了侧脸检测?
C++代码  
  1. #include "cv.h"  
  2. #include "highgui.h"  
  3.   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13.   
  14. #ifdef _EiC  
  15. #define WIN32  
  16. #endif  
  17.   
  18. static CvMemStorage* storage = 0;  
  19. static CvHaarClassifierCascade* cascade = 0;  
  20. static CvHaarClassifierCascade* nested_cascade = 0;  
  21. int use_nested_cascade = 0;  
  22.   
  23. void detect_and_draw( IplImage* image );  
  24.   
  25. const char* cascade_name ="1.xml";  
  26.    // "../../data/haarcascades/haarcascade_frontalface_alt_tree.xml";  
  27. /*    "";haarcascade_profileface.xml*/  
  28. const char* nested_cascade_name ="2.xml";  
  29.  //   "../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";  
  30. //    "../../data/haarcascades/";  
  31. double scale = 1;  
  32.   
  33. int main( int argc, char** argv )  
  34. {  
  35.     CvCapture* capture = 0;  
  36.     IplImage *frame, *frame_copy = 0;  
  37.     IplImage *image = 0;  
  38.     const char* scale_opt = "--scale=";  
  39.     int scale_opt_len = (int)strlen(scale_opt);  
  40.     const char* cascade_opt = "--cascade=";  
  41.     int cascade_opt_len = (int)strlen(cascade_opt);  
  42.     const char* nested_cascade_opt = "--nested-cascade";  
  43.     int nested_cascade_opt_len = (int)strlen(nested_cascade_opt);  
  44.     int i;  
  45.     const char* input_name = 0;  
  46.   
  47.   
  48.             input_name = argv[1];  
  49.      
  50.   
  51.     cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );  
  52.   
  53.     if( !cascade )  
  54.     {  
  55.         fprintf( stderr, "ERROR: Could not load classifier cascade\n" );  
  56.         fprintf( stderr,  
  57.         "Usage: facedetect [--cascade=\"\"]\n"  
  58.         "   [--nested-cascade[=\"nested_cascade_path\"]]\n"  
  59.         "   [--scale[=\n"  
  60.         "   [filename|camera_index]\n" );  
  61.         return -1;  
  62.     }  
  63.       
  64.     if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )  
  65.         capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );  
  66.     else if( input_name )  
  67.     {  
  68.   
  69.     storage = cvCreateMemStorage(0);        image = cvLoadImage( input_name, 1 );  
  70.         if( !image )  
  71.             capture = cvCaptureFromAVI( input_name );  
  72.     }  
  73.     else  
  74.         image = cvLoadImage( "lena.jpg", 1 );  
  75.   
  76.     cvNamedWindow( "result", 1 );  
  77.   
  78.     if( capture )  
  79.     {  
  80.         for(;;)  
  81.         {  
  82.             if( !cvGrabFrame( capture ))  
  83.                 break;  
  84.             frame = cvRetrieveFrame( capture );  
  85.             if( !frame )  
  86.                 break;  
  87.             if( !frame_copy )  
  88.                 frame_copy = cvCreateImage( cvSize(frame->width,frame->height),  
  89.                                             IPL_DEPTH_8U, frame->nChannels );  
  90.             if( frame->origin == IPL_ORIGIN_TL )  
  91.                 cvCopy( frame, frame_copy, 0 );  
  92.             else  
  93.                 cvFlip( frame, frame_copy, 0 );  
  94.               
  95.             detect_and_draw( frame_copy );  
  96.   
  97.             if( cvWaitKey( 10 ) >= 0 )  
  98.                 goto _cleanup_;  
  99.         }  
  100.   
  101.         cvWaitKey(0);  
  102. _cleanup_:  
  103.         cvReleaseImage( &frame_copy );  
  104.         cvReleaseCapture( &capture );  
  105.     }  
  106.     else  
  107.     {  
  108.         if( image )  
  109.         {  
  110.     
  111.             detect_and_draw( image );  
  112.            cvShowImage( "result", image );  
  113.             cvWaitKey(0);  
  114.             cvReleaseImage( &image );  
  115.         }  
  116.         else if( input_name )  
  117.         {  
  118.             /* assume it is a text file containing the 
  119.                list of the image filenames to be processed - one per line */  
  120.             FILE* f = fopen( input_name, "rt" );  
  121.             if( f )  
  122.             {  
  123.                 char buf[1000+1];  
  124.                 while( fgets( buf, 1000, f ) )  
  125.                 {  
  126.                     int len = (int)strlen(buf), c;  
  127.                     while( len > 0 && isspace(buf[len-1]) )  
  128.                         len--;  
  129.                     buf[len] = '\0';  
  130.                     printf( "file %s\n", buf );   
  131.                     image = cvLoadImage( buf, 1 );  
  132.                     if( image )  
  133.                     {  
  134.                         detect_and_draw( image );  
  135.                         c = cvWaitKey(0);  
  136.                         if( c == 27 || c == 'q' || c == 'Q' )  
  137.                             break;  
  138.                         cvReleaseImage( &image );  
  139.                     }  
  140.                 }  
  141.                 fclose(f);  
  142.             }  
  143.         }  
  144.     }  
  145.       
  146.     cvDestroyWindow("result");  
  147.   
  148.     return 0;  
  149. }  
  150.   
  151. void detect_and_draw( IplImage* img )  
  152. {  
  153.     static CvScalar colors[] =   
  154.     {  
  155.         {{0,0,255}},  
  156.         {{0,128,255}},  
  157.         {{0,255,255}},  
  158.         {{0,255,0}},  
  159.         {{255,128,0}},  
  160.         {{255,255,0}},  
  161.         {{255,0,0}},  
  162.         {{255,0,255}}  
  163.     };  
  164.   
  165.     IplImage *gray, *small_img;  
  166.     int i, j;  
  167.   
  168.     gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );  
  169.     small_img = cvCreateImage( cvSize( cvRound (img->width/scale),  
  170.                          cvRound (img->height/scale)), 8, 1 );  
  171.   
  172.     cvCvtColor( img, gray, CV_BGR2GRAY );  
  173.     cvResize( gray, small_img, CV_INTER_LINEAR );  
  174.     cvEqualizeHist( small_img, small_img );  
  175.     cvClearMemStorage( storage );  
  176.   
  177.     if( cascade )  
  178.     {  
  179.         double t = (double)cvGetTickCount();  
  180.         CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,  
  181.                                             1.1, 2, 0  
  182.                                             //|CV_HAAR_FIND_BIGGEST_OBJECT  
  183.                                             //|CV_HAAR_DO_ROUGH_SEARCH  
  184.                                             |CV_HAAR_DO_CANNY_PRUNING  
  185.                                             //|CV_HAAR_SCALE_IMAGE  
  186.                                             ,  
  187.                                             cvSize(30, 30) );  
  188.         t = (double)cvGetTickCount() - t;  
  189.         printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );  
  190.         for( i = 0; i < (faces ? faces->total : 0); i++ )  
  191.         {  
  192.             CvRect* r = (CvRect*)cvGetSeqElem( faces, i );  
  193.             CvMat small_img_roi;  
  194.             CvSeq* nested_objects;  
  195.             CvPoint center;  
  196.             CvScalar color = colors[i%8];  
  197.             int radius;  
  198.             center.x = cvRound((r->x + r->width*0.5)*scale);  
  199.             center.y = cvRound((r->y + r->height*0.5)*scale);  
  200.             radius = cvRound((r->width + r->height)*0.25*scale);  
  201.     
  202.             cvCircle( img, center, radius, color, 3, 8, 0 );  
  203.      
  204.   
  205.             if( !nested_cascade )  
  206.                 continue;  
  207.             cvGetSubRect( small_img, &small_img_roi, *r );  
  208.             nested_objects = cvHaarDetectObjects( &small_img_roi, nested_cascade, storage,  
  209.                                         1.1, 2, 0  
  210.                                         //|CV_HAAR_FIND_BIGGEST_OBJECT  
  211.                                         //|CV_HAAR_DO_ROUGH_SEARCH  
  212.                                         //|CV_HAAR_DO_CANNY_PRUNING  
  213.                                         //|CV_HAAR_SCALE_IMAGE  
  214.                                         ,  
  215.                                         cvSize(0, 0) );  
  216.             for( j = 0; j < (nested_objects ? nested_objects->total : 0); j++ )  
  217.             {  
  218.                 CvRect* nr = (CvRect*)cvGetSeqElem( nested_objects, j );  
  219.                 center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);  
  220.                 center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);  
  221.                 radius = cvRound((nr->width + nr->height)*0.25*scale);  
  222.                 cvCircle( img, center, radius, color, 3, 8, 0 );  
  223.   
  224.             }  
  225.         }  
  226.     }  
  227.   
  228.     cvShowImage( "result", img );  
  229.     cvReleaseImage( &gray );  
  230.     cvReleaseImage( &small_img );  
  231. }  


相关数据:
haarcascade_frontalface_alt1.xml等
是人脸检测用的人的眼睛,鼻子等数据。
当然可以改名或使用你自己的。

java使用opencv
用JNI2OpenCV.dll:

FaceDetection.java

Java代码  
  1. class JNIOpenCV {  
  2.     static {  
  3.         System.loadLibrary("JNI2OpenCV");  
  4.     }  
  5.     public native int[] detectFace(int minFaceWidth, int minFaceHeight, String cascade, String filename);  
  6. }  
  7.   
  8. public class FaceDetection {  
  9.  private JNIOpenCV myJNIOpenCV;  
  10.  private FaceDetection myFaceDetection;  
  11.    
  12.  public FaceDetection() {  
  13.   myJNIOpenCV = new JNIOpenCV();  
  14.   String filename = "5.jpg";  
  15.   String cascade = "haarcascade_frontalface_default.xml";  
  16.     
  17.     int[] detectedFaces = myJNIOpenCV.detectFace(40, 40, cascade, filename);  
  18.     int numFaces = detectedFaces.length / 4;  
  19.       
  20.      System.out.println("numFaces = " + numFaces);  
  21.      for (int i = 0; i < numFaces; i++) {  
  22.       System.out.println("Face " + i + ": " + detectedFaces[4 * i + 0] + " " + detectedFaces[4 * i + 1] + " " + detectedFaces[4 * i + 2] + " " + detectedFaces[4 * i + 3]);  
  23.      }  
  24.  }  
  25.       
  26.     public static void main(String args[]) {  
  27.         FaceDetection myFaceDetection = new FaceDetection();     
  28.     }  
  29. }  


就可以在java中实现人脸识别了。
第一副图是c语言的人脸识别效果。

第二幅图是java版的效果。



相关文件备份:
http://www.namipan.com/d/a0d6b376810bf6b02c977435be95fb9d55a95fe4540d3c00

有运行不了的情况,是要重编译opencv
题外话:(当然据说目前挺火的绿*霸用的就是这个)
“从XFImage.xml可观察到,绿*霸使用了OpenCV的haar分类器进行人脸检测。绿*霸附带的cximage.dll、 CImage.dll、xcore.dll和Xcv.dll也来自OpenCV的库文件。都反映出绿*霸主要使用了OpenCV来进行图像方面的处理。绿*霸 也无视了OpenCV的BSD许可证。”
http://www.docslib.com/uploads/soft/200907/1_03181303.rar
(已上传的文件:Java调OpenCV.rar)
  • Java调OpenCV.rar (3.8 MB)
  • 下载次数: 228
  • 大小: 6.5 KB
  • 大小: 276.3 KB