基于open cv的人脸检测功能 (大自然的搬运工)

open cv 拍照检测:  https://www.cnblogs.com/yyagrt/p/7260586.html

 

配置open cv 环境  : https://blog.csdn.net/qq_41175905/article/details/80560429

 

包含目录:
***\opencv\build\include;

***\opencv\build\include\opencv;

***\opencv\build\include\opencv2;

库目录:
***\opencv\build\x64\vc14\lib;

链接器->输入->附加依赖项:
opencv_world341d.lib

 

出现bored():has been called;         大为内存泄露、指针指向不可预料的内存

 1 #include <opencv2/opencv.hpp>
 2 #include <opencv2/core.hpp>
 3 #include <opencv2//highgui/highgui.hpp>
 4 #include "opencv2/core/cuda.hpp"
 5 #include <string>
 6 #include <opencv2/core/core.hpp>
 7 #include <iostream>
 8 
 9 using namespace cv;
10 using namespace std;
11 
12 string xmlPath = "./haarcascade_frontalface_default.xml";
13 string path = "./picture.jpg";
14 
15 void detectAndDisplay(Mat image);
16 int main() {
17     VideoCapture cap;
18     // 读取摄像头
19     cap.open(0);
20     // 判断摄像头是否打开
21     if (!cap.isOpened()) {
22         std::cerr << "Could't open capture" << std::endl;
23         return -1;
24     }
25     cv::Mat frame;
26     //摄像头拍照储存照片的名字
27     std::string imgName = "picture.jpg";
28     cap >> frame;
29     if (frame.empty()) {
30         return 0;
31     }
32     cv::imwrite(imgName, frame);
33     frame.release();
34 
35     //命名一个窗口,path为文件路径
36     Mat image = imread(path);               
37 
38     CascadeClassifier a;     //创建脸部对象
39     if (!a.load(xmlPath))    
40     {
41         cout << "无法加载xml文件" << endl;
42         return 0;
43     }
44     detectAndDisplay(image);// 检测人脸
45     cvWaitKey(0);  
46 
47     return 0;
48 }
49 void detectAndDisplay(Mat image)
50 {
51     CascadeClassifier ccf;      //创建脸部对象
52     ccf.load(xmlPath);           //导入opencv自带检测的文件
53     vector<Rect> faces;
54     Mat gray;
55     cvtColor(image, gray, CV_BGR2GRAY);        //图像中不同的色彩空间进行转换
56     equalizeHist(gray, gray);  //直方图均衡化,用于提高图像的质量
57 
58 /*
59     人脸检测是采用滑动窗口的方式,使一张图片可能出现人脸的地方全部检测到,
60     
61     窗口大小存在调整,这样造成多个窗口标记同一张脸情况,为了解决这种问题,又引进比分策略
62     比分最高的窗口留下,其他舍去。
63 
64     为了找到最优解,图片也存在等比例缩放,然后再次进行窗口滑动检测,因此人脸检测是十分消耗资源的工作。
65 
66     ccf.detectMultiScale(gray, faces, 1.1, 3, 0, Size(50, 50), Size(500, 500))中
67     gray    为输入的图片
68     faces    为检测到的人脸序列
69     1.1        为每次图像尺寸减小的比例
70     3        多次检测,检测3次
71     0        //未知
72     剩下两个的窗口的最大尺寸与最小尺寸
73 */
74     ccf.detectMultiScale(gray, faces, 1.1, 3, 0, Size(50, 50), Size(500, 500));
75     for (vector<Rect>::const_iterator iter = faces.begin(); iter != faces.end(); iter++)
76     {
77         rectangle(image, *iter, Scalar(0, 0, 255), 2, 8); //画出脸部矩形
78     }
79 
80     imshow("1", image);
81     cvWaitKey(0);
82 
83 }

 

posted @ 2021-03-07 18:31  生活待我如初恋  阅读(319)  评论(0编辑  收藏  举报