opencv中具有检测人体各部分的级联分类器,在opencv文件夹里面的sources/data/haarcascades里面。

这里要选择的是能够检测人体头像的还有检测眼睛的级联分类器的文件。

它们分别是:

检测头像 haarcascade_frontalface_alt.xml或者haarcascade_frontalface_alt2.xml
检测眼睛 haarcascade_eye.xml或者haarcascade_eye_tree_eyeglasses.xml

检测用的函数是:

cvHaarDetectObjects(CvArr* image,

            CvHaarClassifierCascade *cascade,

            cvMemStorage* storage,

            double scale_factor=1.1,

            int min_neighors=,

            int flags=,

            CvSize min_size=cvSize(,),

            CvSize max_size=cvSize(,)

                                );                        
 image 被检图像
cascade haar 分类器级联的内部标识形式
storage 用来存储检测到的一序列候选目标矩形框的内存区域。
可以通过cvCreateStorage(int block_size)来创建缓冲内存。
当设置block_size=0,默认分配64k的缓冲空间内存块。
 
scale_factor 在前后两次相继的扫描中,搜索窗口的比例系数。
 
min_neighbors 构成检测目标的相邻矩形的最小个数(缺省-1)。
如果组成检测目标的小矩形的个数和小于 min_neighbors-1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
这种设定值一般用在用户自定义对检测结果的组合程序上。
 
flags 操作方式。当前唯一可以定义的操作方式是 CV_HAAR_DO_CANNY_PRUNING。
如果被设定,函数利用Canny边缘检测器来排除一
些边缘很少或者很多的图像区域,因为这样的区域一般不含被检目标。
人脸检测中通过设定阈值使用了这种方法,并因此提高了检测速度。
min_size 检测窗口的最小尺寸。
 
缺省的情况下被设为分类器训练时采用的样本尺寸(人脸检测中缺省大小是~20×20)。
 #define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include"cv.h"
#include"highgui.h"
using namespace cv;
using namespace std; IplImage* Dectimg(IplImage *getimg);
//要将这两个文件的文件路径写清楚或者把他们复制到本项目文件夹里
//检测人眼
//static char *cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
//检测人脸
static char* cascade_name = "haarcascade_frontalface_alt2.xml"; CvHaarClassifierCascade *cascade = ;
int main()
{
//用cvLoad()加载级联分类器文件
cascade = (CvHaarClassifierCascade *)cvLoad(cascade_name); //打开摄像头,读入个人录像
CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY);
//定义IplImage的指针并且初始化。
IplImage * getfile = cvQueryFrame(capture);
//命名窗口
cvNamedWindow("Result");
//循环读入帧
while ((getfile = cvQueryFrame(capture)) != NULL)
{
//每次读入图像帧后进入检测函数
IplImage *picture = Dectimg(getfile); cvShowImage("Result", picture);
//间隔时间15 us,等待输入按键,如果按键为ESC(这个键的键值为27)就退出。
if (cvWaitKey() == )break;
}
cvWaitKey();
//释放图片指针
cvReleaseImage(&getfile);
//释放读入视频帧的指针
cvReleaseCapture(&capture);
//关闭所有窗口
cvDestroyAllWindows();
return ;
} //检测图片中的目标图像,并且用矩形将目标圈出来
IplImage* Dectimg(IplImage *getimg)
{
//克隆图像
IplImage *img = cvCloneImage(getimg);
double scale = 1.2;
//缩小图像,提高检测速度
IplImage *smallimg = cvCreateImage(cvSize(img->width / scale,img->height/scale),img->depth,img->nChannels);
cvResize(img, smallimg);
//创建单通道图像
IplImage *grayimg = cvCreateImage(cvGetSize(smallimg),smallimg->depth,);
//转换成灰度图像
cvCvtColor(smallimg,grayimg,CV_RGB2GRAY);
//创建缓存
CvMemStorage *storage = ;
storage = cvCreateMemStorage();
//将图像均衡化
cvEqualizeHist(grayimg,grayimg);
cvClearMemStorage(storage);
//检测图像,将会得到目标区域的矩形
CvSeq *objects = cvHaarDetectObjects(grayimg,cascade,storage,scale,,,cvSize(,));
if (objects->total > )
{
/*
for (int i = 0; i < objects->total; i++)
{
CvPoint center;
int radius;
CvRect *rect = (CvRect*)cvGetSeqElem(objects,i);
center.x = (rect->x + rect->width / 2)*scale;
center.y = (rect->y + rect->height / 2)*scale
;
radius = cvRound((rect->width+rect->height)*0.26*scale);
cvCircle(getimg, center, radius, cvScalar(14, 45, 73), 4);
}
*/
for (int i = ; i < objects->total; i++)
{
CvRect *rect = (CvRect*)cvGetSeqElem(objects,i);
cvRectangle(getimg,
cvPoint(cvRound( rect->x*scale),cvRound( rect->y*scale)),
cvPoint(cvRound(1.2*(rect->x+rect->width)),
cvRound(1.2*(rect->y+rect->height))),
cvScalar(,,),);
}
}
else
return NULL;//如果没有检测到目标图像就返回空指针
return getimg;
}

opencv学习---打开摄像头检测个人头像的更多相关文章

  1. 如何使用 OpenCV 打开摄像头获取图像数据?

    OpenCV 如何打开摄像头获取图像数据? 代码运行环境:Qt 5.9.1 msvc2015 32bit OpenCV 3.3.0 #include "include/opencv2/ope ...

  2. OpenCV学习记录(一):使用haar分类器进行人脸识别 标签: opencv脸部识别c++ 2017-07-03 15:59 26人阅读

    OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).OpenCV2之后的C++接口除了Haar特征 ...

  3. OpenCV 学习笔记 05 人脸检测和识别

    本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个  Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...

  4. OpenCV学习 4:摄像头视频读写与边缘检测

    原创文章,欢迎转载,转载请注明出处 想实现人脸识别,车辆识别,车牌识别.一般我们可不是读硬盘里面的视频文件的,都是直接从摄像头读取视频流然后直接识别的.所以读取摄像头的视频流这是基础...OpenCV ...

  5. OpenCV学习1-----打开摄像头并在画面上添加水印

    一直对视频或者图像添加水印很感兴趣,查找资料后用OpenCV尝试了一下. 记录下来. 1.首先是打开摄像头. 找到OpenCV官方文档给出的例子. 例子中实现的是,打开摄像头,并对画面进行高斯滤波,使 ...

  6. 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. OpenCV Open Camera 打开摄像头

    这是一个用OpenCV2.4.10打开摄像头的一个例子,参见代码如下: #include <iostream> #include <stdio.h> #include < ...

  8. OpenCV x64 vs2010 下打开摄像头录制视频写成avi(代码为转载)

    首先参照下面这里进行opencv x64位机器下面的配置 http://wiki.opencv.org.cn/index.php/VC_2010%E4%B8%8B%E5%AE%89%E8%A3%85O ...

  9. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

随机推荐

  1. 【转】MMO即时战斗:地图角色同步管理和防作弊实现

    ---转自CSDN 一.前言 无论是端游.页游.手游如果是采用了MMO即时战斗游戏模式,基本都会遇到同屏多角色实时移动.释放技能.战斗等场景,于是自然也需要实现如何管理同屏内各种角色的信息同步:例如角 ...

  2. 如何借助windows的VHD引导特性实现VHD多windows系统共存

    近期,由于一些需要,需要运行3个windows系统,具体需要如何此处略去,现将实现方式共享如下. 测试环境: HP 820 G2, 4G内存, 500G SSD硬盘 windows 7 企业版 win ...

  3. Linux中常用的关机和重新启动命令

    hutdown.halt.reboot以及init,它们都可以达到关机和重新启动的目的,但是每个命令的内部工作过程是不同的,下面将逐一进行介绍. 一.shutdown shutdown命令用于安全关闭 ...

  4. 自测之Lesson9:时钟与信号

    题目一:编写一个获取当前时间的程序,并将其以“year-mon-day time”的形式输出. 程序代码: #include <stdio.h> #include <time.h&g ...

  5. c#基类继承

    [ 塔 · 第 三 条 约 定 ] 编写一个多边形作为基类(成员:定点数)抽象方法(子类实现):体积.边长 正三角形类:成员 边长 长方形类:成员 长宽 using System; using Sys ...

  6. ajax的一些实用技巧

    1.尽量优先采用ajax获取html文件,然后再操作dom把数据填充到里面 在实际项目中,如果前端开发人员没有把页面给切分开,那么有如下两种办法可供选择:其一是,在各种点击事件中,用js去拼接并在拼接 ...

  7. iOS- <项目笔记> UIApplication常见属性与方法总结

    UIApplication 1.简介 1> 整个应用程序的象征,一个应用程序就一个UIApplication对象,使用了单例设计模式 2> 通过[UIApplication sharedA ...

  8. Python使用ElementTree美化XML格式

    Python中使用ElementTree可以很方便的处理XML,但是产生的XML文件内容会合并在一行,难以看清楚. 如下格式: <root><aa>aatext<cc&g ...

  9. 【bzoj1096】[ZJOI2007]仓库建设 斜率优化dp

    题目描述 L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L ...

  10. BZOJ4868 Shoi2017期末考试(三分+贪心)

    容易想到枚举最晚发布成绩的课哪天发布,这样与ti和C有关的贡献固定.每门课要么贡献一些调节次数,要么需要一些调节次数,剩下的算贡献也非常显然.这样就能做到平方级别了. 然后大胆猜想这是一个凸函数三分就 ...