人工智能
直播中

moonyuan

13年用户 157经验值
擅长:可编程逻辑 嵌入式技术 接口/总线/驱动 控制/MCU
私信 关注

【Toybrick RK3399Pro AI开发板试用体验】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 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
  32. ", t*1000/getTickFrequency());
  33.     for ( size_t i = 0; i < faces.size(); i++ )
  34.     {
  35.         Rect r = faces[i];
  36.         Mat smallImgROI;
  37.         vector nestedObjects;
  38.         Point center;
  39.         Scalar color = colors[i%8];
  40.         int radius;

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


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



QQ截图20190825231641.png

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

换一张人多的

QQ截图20190825232133.png

能够一个不漏检测到
` 无标题.png

回帖(1)

低调de炫耀爱

2019-8-28 13:38:39
够强劲
举报

更多回帖

发帖
×
20
完善资料,
赚取积分