OpenCV实例:对实时视频做人脸检测
来源:互联网 发布:淘宝宝贝描述下载 编辑:程序博客网 时间:2024/04/26 08:33
OpenCV的人脸检测主要是调用训练好的cascade(Haar分类器)来进行模式匹配。
1. 新建项目
启动Code::Blocks,选择File->New->Project, 项目类型选择:Console Application,项目名为:MyFace,其他按默认选择。
2. 代码
打开main.cpp文件,输入以下代码:
#include <iostream>
using namespace std;
#include <videoInput.h>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
void detect_and_draw(IplImage* image);
const char* cascade_name = "haarcascade_frontalface_alt.xml";
int main(int argc, char** argv)
{
int width = 640;
int height = 400;
videoInput video;//创建视频捕获对象
video.setupDevice(0, width, height);//配置设备
//video.showSettingsWindow(0);//该语句可以显示视频设置窗口,可以去掉
IplImage* frame, *frame_copy = 0;
int optlen = strlen("--cascade=");
const char* input_name;
if(argc > 1 && strncmp(argv[1], "--cascade=", optlen) == 0)
{
cascade_name = argv[1] + optlen;
input_name = argc > 2 ? argv[2] : 0;
}
else
{
input_name = argc > 1 ? argv[1] : 0;
}
cascade = (CvHaarClassifierCascade*) cvLoad(cascade_name, 0, 0, 0);
if(!cascade)
{
fprintf(stderr, "ERROR: Could not load classifier cascade/n");
fprintf(stderr, "Usage: myface --cascade=/"<cascade_path>/" [filename]/n");
return -1;
}
storage = cvCreateMemStorage(0);
cvNamedWindow("result", 1);
frame = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 3);
for(;;)
{
if(video.isFrameNew(0))
{
video.getPixels(0, (unsigned char *)frame->imageData, false, true);//获取一帧
}
if(!frame)
break;
if(!frame_copy)
frame_copy = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, frame->nChannels);
if(frame->origin == IPL_ORIGIN_TL)
cvCopy(frame, frame_copy, 0);
else
cvFlip(frame, frame_copy, 0);
detect_and_draw(frame_copy);
if(cvWaitKey(10) >= 0)
break;
}
cvReleaseImage(&frame_copy);
cvReleaseImage(&frame);
return 0;
}
void detect_and_draw( IplImage* img )
{
static CvScalar colors[] =
{
{{0,0,255}},
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}}
};
double scale = 1.3;
IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
cvRound (img->height/scale)),
8, 1 );
int i;
cvCvtColor( img, gray, CV_BGR2GRAY );
cvResize( gray, small_img, CV_INTER_LINEAR );
cvEqualizeHist( small_img, small_img );
cvClearMemStorage( storage );
if( cascade )
{
double t = (double)cvGetTickCount();
CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(30, 30) );
t = (double)cvGetTickCount() - t;
printf( "detection time = %gms/n", t/((double)cvGetTickFrequency()*1000.) );
for( i = 0; i < (faces ? faces->total : 0); i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width*0.5)*scale);
center.y = cvRound((r->y + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
}
}
cvShowImage( "result", img );
cvReleaseImage( &gray );
cvReleaseImage( &small_img );
}
3. 设置
打开Project-〉Build Options选项卡
选择Search directories,在Compiler里Add进以下目录:
C:/OpenCV2.2/include
C:/OpenCV2.2/3rdparty/include
在Linker里Add进以下目录:
C:/OpenCV2.2/lib
C:/OpenCV2.2/3rdparty/lib
C:/Program Files/Microsoft SDKs/Windows/v7.0A/Lib
选择Linker settings,添加以下文件:
C:/OpenCV2.2/lib 此目录下的所有文件
C:/OpenCV2.2/3rdparty/lib 此目录下的所有文件
C:/Program Files/Microsoft SDKs/Windows/v7.0A/Lib 此目录下所有ole开头的文件
4. 编译
点击Build->Build编译项目。
5. 运行
将C:/OpenCV2.2/data/haarcascades目录下的haarcascade_frontalface_alt.xml复制到MyFace项目根目录下。
或者打开Project-〉Set programs‘ arguments,在Program arguments里输入haarcascade_frontalface_alt.xml的全路径地址。
点击Build-〉Run
第一次运行的时候会出现一个摄像头选择界面,点确定后就可以看到视频,如果有人脸进入画面,将被标示出来。
- OpenCV实例:对实时视频做人脸检测
- VLC for Android 基于 Opencv 对 RTSP视频 实时人脸检测
- opencv程序十五:实时视频轮廓检测
- opencv-视频处理--实时前景检测-二帧差法
- opencv-视频处理-实时前景检测--三帧差法
- Opencv对视频进行目标检测
- opencv从摄像头读取视频并实时进行人脸检测代码
- opencv-视频处理-实时的前景检测-Vibe算法
- opencv-视频处理-实时前景检测-阈值法
- opencv-视频处理-实时的前景检测-Vibe算法
- IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测
- 利用Opencv自带源码,调试摄像头做人脸检测
- 一个可以用来做人脸检测的视频帧间差分代码
- opencv实现摄像头实时人脸检测
- 视频流中实时人脸检测
- OpenCV对视频中的人脸和人眼检测(图片也可以)
- OpenCV 实践程序12——用分类器对视频进行人脸检测
- 对视频流进行边缘检测【OpenCV学习笔记6】
- C++ 二叉树的基本操作
- 韩国政府网络受“僵尸”围攻,防治Bot网络需多方合作
- JavaFX离线部署和运行,客户端浏览器可以自动检测并下载安装指定服务器的JRE
- 查询的端口 -解决端口被占用的问题
- local function definitions are illegal
- OpenCV实例:对实时视频做人脸检测
- 版本控制常用工具
- gnome 菜单
- “QT学习视频、QT资料和源代码”小菜特别推荐。
- delphi中locate查找方法
- Windows Live Writer的几种代码插件比较
- 假前感。。。。
- boj 1348 网络流,从来没有一个网络流能让我如此泪流满面,这样的建图方式,仰慕dalong
- 插件FoxTab