基于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 }