`
谁?
我!
是你?
是我!
你终于来了!
我终于来了!
你终究是来了?
我终究是来了!
你来干什么!
我来检测一个人脸!
本文主要是实现一张图片上的人脸检测,目前的研究也没有去深入,而且代码都很简洁,只是完成图片的检测,视频和实时摄像头的检测尚未研究,这不是本人擅长的领域,日常加强学习。
完成本代码,其中有一些波折,困难的关键不是怎么实现人脸检测,而在于鸿蒙上怎么运行opencv。这份代码参考
https://blog.csdn.net/sehanlingfeng/article/details/106880853
其实网上人脸检测的例子很多,在鸿蒙os上可以完成这个功能,确属不易。
本人能力有限,移植的opencv还有诸多问题,这份代码在鸿蒙上运行,只能运行大概十多秒,然后就要卡死,暂时还没有找到原因。移植过程也没有写详细笔记,有点乱,等理清楚了再发移植教程(或许都不能叫移植,因为我是追踪opencv源码,直接放在鸿蒙上用的,没有像qt那样还要编译,只是改的东西比较多,其实还是c和c++语法)。
- #include "opencv2/core.hpp"
- #include "opencv2/face.hpp"
- #include "opencv2/highgui.hpp"
- #include "opencv2/imgproc.hpp"
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include "Main.h"
- #include "opencv2/objdetect/objdetect.hpp"
- using namespace cv;
- using namespace cv::face;
- using namespace std;
- static char* FACES_MODEL = "./face.yaml";
- static char* FACES_TXT_PATH = "./face.txt";
- static char* HAARCASCADE_FRONTALFACE_ALT = "./haarcascade_frontalface_alt.xml";//人脸数据集
- /*
- * url:传入图片路径;url2:储存到的路径
- */
- void rectface(char* url, char* url2) {
- char *HARR_XML_PATH1 = HAARCASCADE_FRONTALFACE_ALT;//-配置文件 xml
- string fn_haar = string(HARR_XML_PATH1);
- //人脸识别算法
- CascadeClassifier haar_cascade; //级联分类器检测类
- haar_cascade.load(fn_haar);
- vector< Rect_<int> > faces;
- Mat picture = imread(url, CV_LOAD_IMAGE_COLOR);
- haar_cascade.detectMultiScale(picture, faces);
- for (int i = 0; i < faces.size(); i++) {
- rectangle(picture, faces[i], CV_RGB(0, 255, 0), 1);
- putText(picture, "", Point(faces[i].x, faces[i].y), FONT_HERSHEY_PLAIN, 1.0, CV_RGB(0, 255, 0), 2.0);
- }
- imwrite(url2, picture);
- }
- /*
- * url:传入图片路径;url2:储存到的路径
- */
- int grayface(char* url, char* url2) {
- char *HARR_XML_PATH1 = HAARCASCADE_FRONTALFACE_ALT;
- string fn_haar = string(HARR_XML_PATH1); //-配置文件 xml
- //人脸识别算法
- CascadeClassifier haar_cascade;
- haar_cascade.load(fn_haar);
- Mat gray;
- vector< Rect_<int> > faces;
- Mat picture = imread(url, CV_LOAD_IMAGE_COLOR);
- if (!picture.empty()) {
- cvtColor(picture, gray, CV_BGR2GRAY);
- equalizeHist(gray, gray); //直方图均衡化
- }
- //将灰度化的图片用于识别出人脸faces
- haar_cascade.detectMultiScale(gray, faces);
- //识别多张人脸
- for (int i = 0; i < faces.size(); i++) {
- Rect face_i = faces[i];
- Mat face = gray(face_i);
- char urltext[256];
- sprintf(urltext, "%s%s%d%s", url2, "gray", i, ".png");
- imwrite(urltext, face);
- }
- return faces.size();
- }
- int main(int argc, const char *argv[]) {
- rectface("./1.png", "./1_1.png");
- //grayface("./1.png", "./");
- return 0;
- }
复制代码其中函数grayface执行会导致卡死,尚未找到原因。
图片往上找的,如有侵权,联系删除。`