版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kidults/article/details/89633100
前两篇写了opencv的 编译和配置,接下来说说opencv如何打开摄像头并检测视频中的人脸
在opencv源码目录的 data文件夹下 有很多的检测模板
我们选择其中一个人脸检测的模板
CascadeClassifier ccf;
if(!ccf.load("****.xml")){ //加载检测模板
return;
}
VideoCapture capture;
std::vector<Rect> faces;
if(!capture.isOpened()){ //摄像头未打开
capture.release();
capture.open(0); //打开摄像头
// capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度
// capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度
// capture.set(CV_CAP_PROP_FPS, 30);//帧率 帧/秒
// capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1
// capture.set(CV_CAP_PROP_CONTRAST,40);//对比度 40
// capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
// capture.set(CV_CAP_PROP_HUE, 50);//色调 50
// capture.set(CV_CAP_PROP_EXPOSURE, -3);//曝光
capture.set(cv::CAP_PROP_FOURCC,VideoWriter::fourcc('M','J','P','G'));
}
Mat img,gray;
bool ret = capture.read(img); //读取摄像头
if(!ret){ //读取失败
capture.release();
}
//x,y坐标变换
// transpose(img,img);
cvtColor(img,gray,CV_BGR2GRAY); //转为灰度图
equalizeHist(gray,gray); //直方图均衡化
ccf.detectMultiScale(gray,faces,1.1,3,0,cv::Size(150,150),cv::Size(400,400)); //检测人脸
//遍历检测到的人脸
for(std::vector<Rect>::const_iterator item=faces.begin();item!=faces.end();item++)
{
Rect rectFace = Rect( item.base()->x,item.base()->y,item.base()->width,item.base()->height);
rectangle(gray,rectFace,Scalar(47,42,203),2); //opencv bgr 顺序 //标记人脸
}
//上面的代码只是做了一个实例,在正式的程序中,肯定是要写到线程中的
//imshow("face",gray);