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. 使用bing或google来翻译网页

    google代码:在</head>之后插入 <meta name="google-translate-customization" content="4 ...

  2. OSS文件上传及OSS与ODPS之间数据连通

    场景描述        有这样一种场景,用户在自建服务器上存有一定数量级的CSV格式业务数据,某一天用户了解到阿里云的OSS服务存储性价比高(嘿嘿,颜值高),于是想将CSV数据迁移到云上OSS中,并且 ...

  3. solidity中的memory和 storage详解

    Solidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)之上.这里我会讲解一下关键字storage和memory的区别. storage的结构是在合约部署创建时,根据你的合约中状 ...

  4. ffmpeg实现mjpeg摄像头的采集-预览-拍照

    摄像头输出是mjpeg格式的,需要实现在线预览功能,然后实现拍照功能 1.可以设置采集图像的分辨率,预览分辨率为640*480,可以自定义 2.ctrl+\ 拍照,ctrl+c 退出 void tes ...

  5. maven 教程二 深入

    一:编写POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  6. VUE中关于表单提交的简单实现

    main.js import Vue from "../vue.js"; import App from "./App.js"; //启动 new Vue({ ...

  7. 使用libpcab抓包&处理包

    #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <string.h& ...

  8. 数组的引用——用作形参&返回类型时

    一.数组的引用 切入:可以将一个变量定义成数组的引用(这个变量和数组的类型要相同) 形式: int odd[5] = {1, 3, 5, 7, 9}; int (&arr)[5] = odd; ...

  9. 刷ROM必備的clockworkmod recovery

    Desire HD 手機早早就 Root,前陣子也S-OFF 變成工程版的 HBOOT(ENG S-OFF),想要刷機的朋友一定常常聽人提起 clockworkmod recovery ,接下來就是安 ...

  10. java的参数传递

    1按值传递:传递的是原始值的副本,而不是原始值的内存地址 基本数据类型是传原始值的副本 class Test02 { public static void main(String[] args) { ...