void datectFace(Mat& frame, CascadeClassifier cascade, double scale, vector<string> faceLabels) { //灰度化处理,节省内存 Mat gray; cvtColor(frame, gray, COLOR_RGB2GRAY); //级联分类器比帧差法还更慢,因此,需要再将灰度图大小压缩一半左右 行列压缩 Mat smalling(cvRound(frame.rows / scale), cvRound(frame.cols / scale), CV_8UC1); //按存储大小计算 压缩方式采用线性压缩 resize(gray, smalling, smalling.size(), 0, 0, INTER_LINEAR); //直方图均值化 让灰度图经过直方图函数处理 黑白分明 equalizeHist(smalling, smalling); //imshow("smalling",smalling); //调用级联分类器进行模型匹配并进行框选识别 使用模型去进行每一个像素点的遍历 vector<Rect>faces; //使用CASCADE_SCALE_IMAGE算法 图像甄别 cascade.detectMultiScale(smalling, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
时间: 2024-02-26 15:54:05 浏览: 138
这段代码是函数`datectFace`的实现部分,函数接受四个参数:
- `Mat& frame`:输入的图像帧,使用Mat类表示。
- `CascadeClassifier cascade`:级联分类器,使用CascadeClassifier类表示,用于人脸检测。
- `double scale`:缩放比例,用于压缩输入图像,节省计算资源。
- `vector<string> faceLabels`:人脸标签,用于对检测到的人脸进行标记。
具体来说:
- `Mat gray; cvtColor(frame, gray, COLOR_RGB2GRAY);`:将输入图像帧转换为灰度图像,以节省内存空间。
- `Mat smalling(cvRound(frame.rows / scale), cvRound(frame.cols / scale), CV_8UC1); resize(gray, smalling, smalling.size(), 0, 0, INTER_LINEAR);`:按照指定的缩放比例对灰度图像进行线性压缩,将图像大小压缩到原来的1/scale倍,节省计算资源。
- `equalizeHist(smalling, smalling);`:对压缩后的灰度图像进行直方图均衡化,增强图像的对比度,使得人脸更容易被检测出来。
- `cascade.detectMultiScale(smalling, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));`:使用级联分类器进行人脸检测,检测到的人脸位置将存储在`faces`数组中。函数的参数含义依次为:输入的图像、检测到的人脸位置、每次缩放图像大小的比例因子、每个人脸检测所需要的邻居数、检测方法、最小人脸尺寸。
阅读全文