版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiyaozhe/article/details/81083496
先放代码,在一一解释
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
VideoCapture capture(0); //调用本地摄像头
String cascadeFilePath = "E:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml"; //opencv训练好的分类模型
CascadeClassifier face_cascade; //实例化分类器
if (!face_cascade.load(cascadeFilePath)) // 用load函数加载XML分类器文件
{
printf("could not load the haar data...\n");
return -1;
}
Mat src_img, gray_img;
while (true)
{
//src_img = imread("E:/123.jpg"); //图片测试
//imshow("原图", src_img);
capture >> src_img;
cvtColor(src_img, gray_img, COLOR_BGR2GRAY); //将原图转化为灰度图
equalizeHist(gray_img, gray_img); //直方图均衡化
vector<Rect> faces; // faces是一个容器,用来接收检测到的人脸
face_cascade.detectMultiScale(gray_img, faces, 1.1, 3, 0); //用分类器寻找人脸
for (auto t = 0; t < faces.size(); ++t)
{
rectangle(src_img, faces[t], Scalar(0, 0, 255), 2, 8, 0); // 用红色矩形框出人脸
}
imshow("results", src_img);
waitKey(10); //延时10
}
return 0;
}
一、 VideoCapture 类读取视频或调用本地摄像头
- 读取视屏
VideoCapture capture(“1.avi”);
- 调用摄像头
VideoCapture capture(0);
显示视频或摄像头:
视频或摄像头内容读取到VideoCapture类对象之后,用一个循环将每一帧显示出来
while(1)
{
Mat frame;
capture>>frame;
imshow("results",frame);
waitkey(10);
}
二、分类模型
opencv 已经内置了训练好的模型,放置在 etc 文件夹下。分别是用haar特征和lbp特征训练的分类模型,两种特征具体信息可以百度。
三、detectMultiScale(InputArray image, CV_OUT std::vector& objects, double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size() )
其参数解释如下:
- image:待检测图片,一般为灰度图像以加快检测速度;
- objects:vector类型,为输出量,表示被检测物体的矩形框向量组;
- scaleFactor:表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;一般设置为1.1
- minNeighbor:表示构成检测目标的相邻矩形的最小个数( 默认值为3)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
- flags:要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;
- minSize和maxSize:用来限制得到的目标区域的范围。
detectMultiscale函数为多尺度多目标检测,多尺度:通常搜索目标的模板尺寸大小是固定的,但是不同图片大小不同,所以目标对象的大小也是不定的,所以多尺度即不断缩放图片大小(缩放到与模板匹配),通过模板滑动窗函数搜索匹配;同一副图片可能在不同尺度下都得到匹配值,所以多尺度检测函数detectMultiscale是多尺度合并的结果。 多目标:通过检测符合模板匹配对象,可得到多个目标,均输出到objects向量里面。