[文章]【HarmonyOS HiSpark AI Camera试用连载 】第五次续缘-基于鸿蒙系统的人脸检测

阅读量0
0
1
`

谁?
我!
是你?
是我!
你终于来了!
我终于来了!
你终究是来了?
我终究是来了!
你来干什么!
我来检测一个人脸!

本文主要是实现一张图片上的人脸检测,目前的研究也没有去深入,而且代码都很简洁,只是完成图片的检测,视频和实时摄像头的检测尚未研究,这不是本人擅长的领域,日常加强学习。
完成本代码,其中有一些波折,困难的关键不是怎么实现人脸检测,而在于鸿蒙上怎么运行opencv。这份代码参考
https://blog.csdn.net/sehanlingfeng/article/details/106880853
其实网上人脸检测的例子很多,在鸿蒙os上可以完成这个功能,确属不易。

本人能力有限,移植的opencv还有诸多问题,这份代码在鸿蒙上运行,只能运行大概十多秒,然后就要卡死,暂时还没有找到原因。移植过程也没有写详细笔记,有点乱,等理清楚了再发移植教程(或许都不能叫移植,因为我是追踪opencv源码,直接放在鸿蒙上用的,没有像qt那样还要编译,只是改的东西比较多,其实还是c和c++语法)。
  1. #include "opencv2/core.hpp"
  2. #include "opencv2/face.hpp"
  3. #include "opencv2/highgui.hpp"
  4. #include "opencv2/imgproc.hpp"
  5. #include <iostream>
  6. #include <fstream>
  7. #include <sstream>
  8. #include "Main.h"
  9. #include "opencv2/objdetect/objdetect.hpp"
  10. using namespace cv;
  11. using namespace cv::face;
  12. using namespace std;

  13. static char* FACES_MODEL = "./face.yaml";
  14. static char* FACES_TXT_PATH = "./face.txt";
  15. static char* HAARCASCADE_FRONTALFACE_ALT = "./haarcascade_frontalface_alt.xml";//人脸数据集

  16. /*
  17. *  url:传入图片路径;url2:储存到的路径
  18. */
  19. void rectface(char* url, char* url2) {
  20.         char *HARR_XML_PATH1 = HAARCASCADE_FRONTALFACE_ALT;//-配置文件 xml
  21.         string fn_haar = string(HARR_XML_PATH1);
  22.         //人脸识别算法
  23.         CascadeClassifier haar_cascade; //级联分类器检测类
  24.         haar_cascade.load(fn_haar);
  25.         vector< Rect_<int> > faces;
  26.         Mat picture = imread(url, CV_LOAD_IMAGE_COLOR);

  27.         haar_cascade.detectMultiScale(picture, faces);
  28.         for (int i = 0; i < faces.size(); i++) {
  29.                 rectangle(picture, faces[i], CV_RGB(0, 255, 0), 1);
  30.                 putText(picture, "", Point(faces[i].x, faces[i].y), FONT_HERSHEY_PLAIN, 1.0, CV_RGB(0, 255, 0), 2.0);
  31.         }
  32.         imwrite(url2, picture);
  33. }

  34. /*
  35. *   url:传入图片路径;url2:储存到的路径
  36. */
  37. int grayface(char* url, char* url2) {
  38.         char *HARR_XML_PATH1 = HAARCASCADE_FRONTALFACE_ALT;
  39.         string fn_haar = string(HARR_XML_PATH1);    //-配置文件 xml
  40.         //人脸识别算法
  41.         CascadeClassifier haar_cascade;
  42.         haar_cascade.load(fn_haar);
  43.         Mat gray;
  44.         vector< Rect_<int> > faces;
  45.         Mat picture = imread(url, CV_LOAD_IMAGE_COLOR);

  46.         if (!picture.empty()) {
  47.                 cvtColor(picture, gray, CV_BGR2GRAY);
  48.                 equalizeHist(gray, gray);    //直方图均衡化
  49.         }
  50.         //将灰度化的图片用于识别出人脸faces
  51.         haar_cascade.detectMultiScale(gray, faces);

  52.         //识别多张人脸
  53.         for (int i = 0; i < faces.size(); i++) {
  54.                 Rect face_i = faces[i];
  55.                 Mat face = gray(face_i);
  56.                 char urltext[256];
  57.                 sprintf(urltext, "%s%s%d%s", url2, "gray", i, ".png");
  58.                 imwrite(urltext, face);
  59.         }
  60.         return faces.size();
  61. }

  62. int main(int argc, const char *argv[]) {
  63.         rectface("./1.png", "./1_1.png");
  64.         //grayface("./1.png", "./");
  65.         return 0;
  66. }
复制代码
其中函数grayface执行会导致卡死,尚未找到原因。

图片往上找的,如有侵权,联系删除。`
33333333.jpg

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友