发 帖  
原厂入驻New
【Toybrick RK3399Pro AI开发板试用体验】opencv 人脸识别
2019-8-25 23:22:35  590 人脸识别 OpenCV
分享
opencv 可以实现的功能有很多,这次就试试人脸识别
省心的opencv在example中已经提供了 分类器的级联分类器的文件,省去重复造轮子,haarcascade_eye_tree_eyeglasses.xml,haarcascade_frontalface_alt.xml

程序加载分类器,和 梅西的照片

  1. int main(){
  2.     Mat image;
  3.     CascadeClassIFier cascade, nestedCascade;

  4.     if(!nestedCascade.load("./haarcascade_eye_tree_eyeglasses.xml")){
  5.         cerr << "WARNING: Could not load classifier cascade for nested objects" << endl;
  6.     }

  7.     if(!cascade.load("./haarcascade_frontalface_alt.xml")){
  8.         cerr << "ERROR: Could not load classifier cascade" << endl;
  9.         return -1;
  10.     }

  11.     image = imread("messi.jpg");

  12.     detectAndDraw( image, cascade, nestedCascade, 1);
  13.     waitKey(0);
  14.     return 0;
  15. }
复制代码

  1. void detectAndDraw( Mat& img, CascadeClassifier& cascade,
  2.                     CascadeClassifier& nestedCascade,
  3.                     double scale)
  4. {
  5.     double t = 0;
  6.     vector<Rect> faces, faces2;
  7.     const static Scalar colors[] =
  8.     {
  9.         Scalar(255,0,0),
  10.         Scalar(255,128,0),
  11.         Scalar(255,255,0),
  12.         Scalar(0,255,0),
  13.         Scalar(0,128,255),
  14.         Scalar(0,255,255),
  15.         Scalar(0,0,255),
  16.         Scalar(255,0,255)
  17.     };
  18.     Mat gray, smallImg;

  19.     cvtColor( img, gray, COLOR_BGR2GRAY );
  20.     double fx = 1 / scale;
  21.     resize( gray, smallImg, Size(), fx, fx, INTER_linear_EXACT );
  22.     equalizeHist( smallImg, smallImg );

  23.     t = (double)getTickCount();
  24.     cascade.detectMultiScale( smallImg, faces,
  25.         1.1, 2, 0
  26.         //|CASCADE_FIND_BIGGEST_OBJECT
  27.         //|CASCADE_DO_ROUGH_SEARCH
  28.         |CASCADE_SCALE_IMAGE,
  29.         Size(30, 30) );

  30.     t = (double)getTickCount() - t;
  31.     printf( "detection time = %g ms\n", t*1000/getTickFrequency());
  32.     for ( size_t i = 0; i < faces.size(); i++ )
  33.     {
  34.         Rect r = faces[i];
  35.         Mat smallImgROI;
  36.         vector<Rect> nestedObjects;
  37.         Point center;
  38.         Scalar color = colors[i%8];
  39.         int radius;

  40.         double aspect_ratio = (double)r.width/r.height;
  41.         if( 0.75 < aspect_ratio && aspect_ratio < 1.3 )
  42.         {
  43.             center.x = cvRound((r.x + r.width*0.5)*scale);
  44.             center.y = cvRound((r.y + r.height*0.5)*scale);
  45.             radius = cvRound((r.width + r.height)*0.25*scale);
  46.             circle( img, center, radius, color, 3, 8, 0 );
  47.         }
  48.         else
  49.             rectangle( img, Point(cvRound(r.x*scale), cvRound(r.y*scale)),
  50.                        Point(cvRound((r.x + r.width-1)*scale), cvRound((r.y + r.height-1)*scale)),
  51.                        color, 3, 8, 0);
  52.         if( nestedCascade.empty() )
  53.             continue;
  54.         smallImgROI = smallImg( r );
  55.         nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
  56.             1.1, 2, 0
  57.             |CASCADE_SCALE_IMAGE,
  58.             Size(30, 30) );
  59.         for ( size_t j = 0; j < nestedObjects.size(); j++ )
  60.         {
  61.             Rect nr = nestedObjects[j];
  62.             center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale);
  63.             center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale);
  64.             radius = cvRound((nr.width + nr.height)*0.25*scale);
  65.             circle( img, center, radius, color, 3, 8, 0 );
  66.         }
  67.     }
  68.     imshow( "result", img );
  69. }
复制代码


通过不断比较 能够正确识别

无标题.png

QQ截图20190825231641.png

得益于rk3399pro的强劲,1296*729 速度还是很快的

换一张人多的

QQ截图20190825232133.png

能够一个不漏检测到
0
2019-8-25 23:22:35   评论 分享淘帖
1 个讨论
够强劲

只有小组成员才能发言,加入小组>>

176个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表