opencv3.0中,自带的示例程序,人脸识别,摄像头不显示图像。什么原因。

opencv3.0中,自带的示例程序,人脸识别,摄像头不显示图像。什么原因。,第1张

换一个表达,,我之前也是这样,,换一个就好了;;;用

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/ml/ml.hpp"

using namespace std

using namespace cv

int main(int argc,char *argv[])

{

int cameraNumber=0

if (argc>1)

cameraNumber =atoi(argv[1])

VideoCapture camera

camera.open (cameraNumber )

if (!camera .isOpened ())

{

cerr<<"ERROPR"<<endl

exit(1)

}

while(true)

{

Mat cameraFrame

camera >>cameraFrame

if (cameraFrame .empty ())

{

cerr<<"ERROR1"<<endl

exit(1)

}

imshow("woqu",cameraFrame )

char key=cv::waitKey (1000)

if (key==27)

{

break

}

}

}

看这个,,然后改例程

1.1.介绍Introduction

从OpenCV2.4开始,加入了新的类FaceRecognizer,我们可以使用它便捷地进行人脸识别实验。本文既介绍代码使用,又介绍算法原理。(他写的源代码,我们可以在OpenCV的opencv\modules\contrib\doc\facerec\src下找到,当然也可以在他的github中找到,如果你想研究源码,自然可以去看看,不复杂)

目前支持的算法有

Eigenfaces特征脸createEigenFaceRecognizer()

Fisherfaces createFisherFaceRecognizer()

LocalBinary Patterns Histograms局部二值直方图 createLBPHFaceRecognizer()

下面所有的例子中的代码在OpenCV安装目录下的samples/cpp下面都能找到,所有的代码商用或者学习都是免费的。

1.2.人脸识别Face Recognition

对人类来说,人脸识别很容易。文献[Tu06]告诉我们,仅仅是才三天的婴儿已经可以区分周围熟悉的人脸了。那么对于计算机来说,到底有多难?其实,迄今为止,我们对于人类自己为何可以区分不同的人所知甚少。是人脸内部特征(眼睛、鼻子、嘴巴)还是外部特征(头型、发际线)对于人类识别更有效?我们怎么分析一张图像,大脑是如何对它编码的?David Hubel和TorstenWiesel向我们展示,我们的大脑针对不同的场景,如线、边、角或者运动这些局部特征有专门的神经细胞作出反应。显然我们没有把世界看成零散的块块,我们的视觉皮层必须以某种方式把不同的信息来源转化成有用的模式。自动人脸识别就是如何从一幅图像中提取有意义的特征,把它们放入一种有用的表示方式,然后对他们进行一些分类。基于几何特征的人脸的人脸识别可能是最直观的方法来识别人脸。第一个自动人脸识别系统在[Kanade73]中又描述:标记点(眼睛、耳朵、鼻子等的位置)用来构造一个特征向量(点与点之间的距离、角度等)。通过计算测试和训练图像的特征向量的欧氏距离来进行识别。这样的方法对于光照变化很稳健,但也有巨大的缺点:标记点的确定是很复杂的,即使是使用最先进的算法。一些几何特征人脸识别近期工作在文献[Bru92]中有描述。一个22维的特征向量被用在一个大数据库上,单靠几何特征不能提供足够的信息用于人脸识别。

特征脸方法在文献[TP91]中有描述,他描述了一个全面的方法来识别人脸:面部图像是一个点,这个点是从高维图像空间找到它在低维空间的表示,这样分类变得很简单。低维子空间低维是使用主元分析(Principal Component Analysis,PCA)找到的,它可以找拥有最大方差的那个轴。虽然这样的转换是从最佳重建角度考虑的,但是他没有把标签问题考虑进去。[gm:读懂这段需要一些机器学习知识]。想象一个情况,如果变化是基于外部来源,比如光照。轴的最大方差不一定包含任何有鉴别性的信息,因此此时的分类是不可能的。因此,一个使用线性鉴别(Linear Discriminant Analysis,LDA)的特定类投影方法被提出来解决人脸识别问题[BHK97]。其中一个基本的想法就是,使类内方差最小的同时,使类外方差最大。

近年来,各种局部特征提取方法出现。为了避免输入的图像的高维数据,仅仅使用的局部特征描述图像的方法被提出,提取的特征(很有希望的)对于局部遮挡、光照变化、小样本等情况更强健。有关局部特征提取的方法有盖伯小波(Gabor Waelets)([Wiskott97]),离散傅立叶变换(DiscreteCosinus Transform,DCT)([Messer06]),局部二值模式(LocalBinary Patterns,LBP)([AHP04])。使用什么方法来提取时域空间的局部特征依旧是一个开放性的研究问题,因为空间信息是潜在有用的信息。

1.3.人脸库Face Database

我们先获取一些数据来进行实验吧。我不想在这里做一个幼稚的例子。我们在研究人脸识别,所以我们需要一个真的人脸图像!你可以自己创建自己的数据集,也可以从这里(http://face-rec.org/databases/)下载一个。

AT&TFacedatabase又称ORL人脸数据库,40个人,每人10张照片。照片在不同时间、不同光照、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集。所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有有轻微旋转)。

YaleFacedatabase A ORL数据库对于初始化测试比较适合,但它是一个简单的数据库,特征脸已经可以达到97%的识别率,所以你使用其他方法很难得到更好的提升。Yale人脸数据库是一个对于初始实验更好的数据库,因为识别问题更复杂。这个数据库包括15个人(14个男人,1个女人),每一个都有11个灰度图像,大小是320*243像素。数据库中有光照变化(中心光照、左侧光照、右侧光照)、表情变化(开心、正常、悲伤、瞌睡、惊讶、眨眼)、眼镜(戴眼镜或者没戴)。

坏消息是它不可以公开下载,可能因为原来的服务器坏了。但我们可以找到一些镜像(比如 theMIT)但我不能保证它的完整性。如果你需要自己剪裁和校准图像,可以阅读我的笔记(bytefish.de/blog/fisherfaces)。

ExtendedYale Facedatabase B 此数据库包含38个人的2414张图片,并且是剪裁好的。这个数据库重点是测试特征提取是否对光照变化强健,因为图像的表情、遮挡等都没变化。我认为这个数据库太大,不适合这篇文章的实验,我建议使用ORL数据库。

1.3.1. 准备数据

我们从网上下了数据,下了我们需要在程序中读取它,我决定使用CSV文件读取它。一个CSV文件包含文件名,紧跟一个标签。

/path/to/image.ext0

假设/path/to/image.ext是图像,就像你在windows下的c:/faces/person0/image0.jpg。最后我们给它一个标签0。这个标签类似代表这个人的名字,所以同一个人的照片的标签都一样。我们对下载的ORL数据库进行标识,可以获取到如下结果:

./at/s1/1.pgm0

./at/s1/2.pgm0

...

./at/s2/1.pgm1

./at/s2/2.pgm1

...

./at/s40/1.pgm39

./at/s40/2.pgm39

想象我已经把图像解压缩在D:/data/at下面,而CSV文件在D:/data/at.txt。下面你根据自己的情况修改替换即可。一旦你成功建立CSV文件,就可以像这样运行示例程序:

facerec_demo.exe D:/data/at.txt

1.3.2 Creating the CSV File

你不需要手工来创建一个CSV文件,我已经写了一个Python程序来做这事。

[gm:说一个我实现的方法

如果你会cmd命令,或者称DOS命令,那么你打开命令控制台。假设我们的图片放在J:下的Faces文件夹下,可以输入如下语句:

J:\Faces\ORL>dir /b/s *.bmp >at.txt

然后你打开at.txt文件可能看到如下内容(后面的0,1..标签是自己加的):

。。。。

J:\Faces\ORL\s1\1.bmp0

J:\Faces\ORL\s1\10.bmp0

J:\Faces\ORL\s1\2.bmp0

J:\Faces\ORL\s1\3.bmp0

J:\Faces\ORL\s1\4.bmp0

J:\Faces\ORL\s1\5.bmp0

J:\Faces\ORL\s1\6.bmp0

J:\Faces\ORL\s1\7.bmp0

J:\Faces\ORL\s1\8.bmp0

J:\Faces\ORL\s1\9.bmp0

J:\Faces\ORL\s10\1.bmp1

J:\Faces\ORL\s10\10.bmp1

J:\Faces\ORL\s10\2.bmp1

J:\Faces\ORL\s10\3.bmp1

J:\Faces\ORL\s10\4.bmp1

J:\Faces\ORL\s10\5.bmp1

J:\Faces\ORL\s10\6.bmp1

。。。。

自然还有c++编程等方法可以做得更好,看这篇文章反响,如果很多人需要,我就把这部分的代码写出来。(遍历多个文件夹,标上标签)

]

特征脸Eigenfaces

我们讲过,图像表示的问题是他的高维问题。二维灰度图像p*q大小,是一个m=qp维的向量空间,所以一个100*100像素大小的图像就是10,000维的图像空间。问题是,是不是所有的维数空间对我们来说都有用?我们可以做一个决定,如果数据有任何差异,我们可以通过寻找主元来知道主要信息。主成分分析(Principal Component Analysis,PCA)是KarlPearson (1901)独立发表的,而 Harold Hotelling (1933)把一些可能相关的变量转换成一个更小的不相关的子集。想法是,一个高维数据集经常被相关变量表示,因此只有一些的维上数据才是有意义的,包含最多的信息。PCA方法寻找数据中拥有最大方差的方向,被称为主成分。

算法描述Algorithmic Description

令 表示一个随机特征,其中 .

计算均值向量

计算协方差矩阵 S

计算 的特征值和对应的特征向量

对特征值进行递减排序,特征向量和它顺序一致. K个主成分也就是k个最大的特征值对应的特征向量。

x的K个主成份:

其中 .

PCA基的重构:

其中 .

然后特征脸通过下面的方式进行人脸识别:

A. 把所有的训练数据投影到PCA子空间

B. 把待识别图像投影到PCA子空间

C. 找到训练数据投影后的向量和待识别图像投影后的向量最近的那个。

还有一个问题有待解决。比如我们有400张图片,每张100*100像素大小,那么PCA需要解决协方差矩阵 的求解,而X的大小是10000*400,那么我们会得到10000*10000大小的矩阵,这需要大概0.8GB的内存。解决这个问题不容易,所以我们需要另一个计策。就是转置一下再求,特征向量不变化。文献 [Duda01]中有描述。

[gm:这个PCA还是自己搜着看吧,这里的讲的不清楚,不适合初学者看]

OpenCV中使用特征脸Eigenfaces in OpenCV

给出示例程序源代码

#include "opencv2/core/core.hpp"

#include "opencv2/contrib/contrib.hpp"

#include "opencv2/highgui/highgui.hpp"

#include <iostream>

#include <fstream>

#include <sstream>

usingnamespace cv

usingnamespace std

static Mat norm_0_255(InputArray _src) {

Mat src = _src.getMat()

// 创建和返回一个归一化后的图像矩阵:

Mat dst

switch(src.channels()) {

case1:

cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC1)

break

case3:

cv::normalize(_src, dst, 0,255, NORM_MINMAX, CV_8UC3)

break

default:

src.copyTo(dst)

break

}

return dst

}

//使用CSV文件去读图像和标签,主要使用stringstream和getline方法

staticvoid read_csv(const string&filename, vector<Mat>&images, vector<int>&labels, char separator ='') {

std::ifstream file(filename.c_str(), ifstream::in)

if (!file) {

string error_message ="No valid input file was given, please check the given filename."

CV_Error(CV_StsBadArg, error_message)

}

string line, path, classlabel

while (getline(file, line)) {

stringstream liness(line)

getline(liness, path, separator)

getline(liness, classlabel)

if(!path.empty()&&!classlabel.empty()) {

images.push_back(imread(path, 0))

labels.push_back(atoi(classlabel.c_str()))

}

}

}

int main(int argc, constchar*argv[]) {

// 检测合法的命令,显示用法

// 如果没有参数输入则退出!.

if (argc <2) {

cout <<"usage: "<<argv[0]<<" <csv.ext><output_folder>"<<endl

exit(1)

}

string output_folder

if (argc ==3) {

output_folder = string(argv[2])

}

//读取你的CSV文件路径.

string fn_csv = string(argv[1])

// 2个容器来存放图像数据和对应的标签

vector<Mat>images

vector<int>labels

// 读取数据. 如果文件不合法就会出错

// 输入的文件名已经有了.

try {

read_csv(fn_csv, images, labels)

} catch (cv::Exception&e) {

cerr <<"Error opening file \""<<fn_csv <<"\". Reason: "<<e.msg <<endl

// 文件有问题,我们啥也做不了了,退出了

exit(1)

}

// 如果没有读取到足够图片,我们也得退出.

if(images.size()<=1) {

string error_message ="This demo needs at least 2 images to work. Please add more images to your data set!"

CV_Error(CV_StsError, error_message)

}

// 得到第一张照片的高度. 在下面对图像

// 变形到他们原始大小时需要

int height = images[0].rows

// 下面的几行代码仅仅是从你的数据集中移除最后一张图片

//[gm:自然这里需要根据自己的需要修改,他这里简化了很多问题]

Mat testSample = images[images.size() -1]

int testLabel = labels[labels.size() -1]

images.pop_back()

labels.pop_back()

// 下面几行创建了一个特征脸模型用于人脸识别,

// 通过CSV文件读取的图像和标签训练它。

// T这里是一个完整的PCA变换

//如果你只想保留10个主成分,使用如下代码

// cv::createEigenFaceRecognizer(10)

//

// 如果你还希望使用置信度阈值来初始化,使用以下语句:

// cv::createEigenFaceRecognizer(10, 123.0)

//

// 如果你使用所有特征并且使用一个阈值,使用以下语句:

// cv::createEigenFaceRecognizer(0, 123.0)

//

Ptr<FaceRecognizer>model = createEigenFaceRecognizer()

model->train(images, labels)

// 下面对测试图像进行预测,predictedLabel是预测标签结果

int predictedLabel = model->predict(testSample)

//

// 还有一种调用方式,可以获取结果同时得到阈值:

// int predictedLabel = -1

// double confidence = 0.0

// model->predict(testSample, predictedLabel, confidence)

//

string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel)

cout <<result_message <<endl

// 这里是如何获取特征脸模型的特征值的例子,使用了getMat方法:

Mat eigenvalues = model->getMat("eigenvalues")

// 同样可以获取特征向量:

Mat W = model->getMat("eigenvectors")

// 得到训练图像的均值向量

Mat mean = model->getMat("mean")

// 现实还是保存:

if(argc==2) {

imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)))

} else {

imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)))

}

// 现实还是保存特征脸:

for (int i =0i <min(10, W.cols)i++) {

string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i))

cout <<msg <<endl

// 得到第 #i个特征

Mat ev = W.col(i).clone()

//把它变成原始大小,为了把数据显示归一化到0~255.

Mat grayscale = norm_0_255(ev.reshape(1, height))

// 使用伪彩色来显示结果,为了更好的感受.

Mat cgrayscale

applyColorMap(grayscale, cgrayscale, COLORMAP_JET)

// 显示或者保存:

if(argc==2) {

imshow(format("eigenface_%d", i), cgrayscale)

} else {

imwrite(format("%s/eigenface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale))

}

}

// 在一些预测过程中,显示还是保存重建后的图像:

for(int num_components =10num_components <300num_components+=15) {

// 从模型中的特征向量截取一部分

Mat evs = Mat(W, Range::all(), Range(0, num_components))

Mat projection = subspaceProject(evs, mean, images[0].reshape(1,1))

Mat reconstruction = subspaceReconstruct(evs, mean, projection)

// 归一化结果,为了显示:

reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows))

// 显示或者保存:

if(argc==2) {

imshow(format("eigenface_reconstruction_%d", num_components), reconstruction)

} else {

imwrite(format("%s/eigenface_reconstruction_%d.png", output_folder.c_str(), num_components), reconstruction)

}

}

// 如果我们不是存放到文件中,就显示他,这里使用了暂定等待键盘输入:

if(argc==2) {

waitKey(0)

}

return0

}

我使用了伪彩色图像,所以你可以看到在特征脸中灰度值是如何分布的。你可以看到特征脸不但对人脸特征进行编码,还对这些图像中的光照进行编码。(看第四张图像是左侧的光照,而第五张是右侧的光照)[gm:PCA对光照变化图像识别效果很差,自然有一些改进方法,有后再谈]

转自:http://hi.baidu.com/andyzcj/blog/item/3b9575fc63c3201f09244d9a.html可能遇到的问题:1.如果跑到某一个分类器时,几个小时也没有反应,而且显示不出训练百分比,这是因为你的负样本数量太少,或者负样本的尺寸太小,所有的负样本在这个分类器都被reject了,程序进入不了下一个循环,果断放弃吧。解决方法:负样本尽量要大一些,比如我的正样本是40*15,共300个,负样本是640*480,共500个。2.读取样本时报错:NegativeortoolargeargumentofCvAllocfunction,网上说这个错误是因为opencv规定单幅iplimage的内存分配不能超过10000,可是我的每个负样本都不会超过这个大小,具体原因不明。后来我把负样本的数量减少,尺寸加大,这个问题就解决了。最近要做一个性别识别的项目,在人脸检测与五官定位上我采用OPENCV的haartraining进行定位,这里介绍下这两天我学习的如何用opencv训练自己的分类器。在这两天的学习里,我遇到了不少问题,不过我遇到了几个好心的大侠帮我解决了不少问题,特别是无忌,在这里我再次感谢他的帮助。一、简介目标检测方法最初由PaulViola[Viola01]提出,并由RainerLienhart[Lienhart02]对这一方法进行了改善。该方法的基本步骤为:首先,利用样本(大约几百幅样本图片)的harr特征进行分类器训练,得到一个级联的boosted分类器。分类器中的"级联"是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。分类器训练完以后,就可以应用于输入图像中的感兴趣区域的检测。检测到目标区域分类器输出为1,否则输出为0。为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。所以,为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。目前支持这种分类器的boosting技术有四种:DiscreteAdaboost,RealAdaboost,GentleAdaboostandLogitboost。"boosted"即指级联分类器的每一层都可以从中选取一个boosting算法(权重投票),并利用基础分类器的自我训练得到。根据上面的分析,目标检测分为三个步骤:1、样本的创建2、训练分类器3、利用训练好的分类器进行目标检测。二、样本创建训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本,反例样本指其它任意图片。负样本负样本可以来自于任意的图片,但这些图片不能包含目标特征。负样本由背景描述文件来描述。背景描述文件是一个文本文件,每一行包含了一个负样本图片的文件名(基于描述文件的相对路径)。该文件创建方法如下:采用Dos命令生成样本描述文件。具体方法是在Dos下的进入你的图片目录,比如我的图片放在D:\face\posdata下,则:按Ctrl+R打开Windows运行程序,输入cmd打开DOS命令窗口,输入d:回车,再输入cdD:\face\negdata进入图片路径,再次输入dir/b>negdata.dat,则会图片路径下生成一个negdata.dat文件,打开该文件将最后一行的negdata.dat删除,这样就生成了负样本描述文件。dos命令窗口结果如下图:正样本对于正样本,通常的做法是先把所有正样本裁切好,并对尺寸做规整(即缩放至指定大小),如下图所示:由于HaarTraining训练时输入的正样本是vec文件,所以需要使用OpenCV自带的CreateSamples程序(在你所按照的opencv\bin下,如果没有需要编译opencv\apps\HaarTraining\make下的.dsw文件,注意要编译release版的)将准备好的正样本转换为vec文件。转换的步骤如下:1)制作一个正样本描述文件,用于描述正样本文件名(包括绝对路径或相对路径),正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:posdata/1(10).bmp1112323posdata/1(11).bmp1112323posdata/1(12).bmp1112323不过你可以把描述文件放在你的posdata路径(即正样本路径)下,这样你就不需要加前面的相对路径了。同样它的生成方式可以用负样本描述文件的生成方法,最后用txt的替换工具将“bmp”全部替换成“bmp1112323”就可以了,如果你的样本图片多,用txt替换会导致程序未响应,你可以将内容拷到word下替换,然后再拷回来。bmp后面那五个数字分别表示图片个数,目标的起始位置及其宽高。这样就生成了正样本描述文件posdata.dat。2)运行CreateSamples程序。如果直接在VC环境下运行,可以在Project\Settings\Debug属性页的Programarguments栏设置运行参数。下面是一个运行参数示例:-infoD:\face\posdata\posdata.dat-vecD:\face\pos.vec-num50-w20-h20表示有50个样本,样本宽20,高20,正样本描述文件为posdata.dat,结果输出到pos.vec。或者在dos下输入:"D:\ProgramFiles\OpenCV\bin\createsamples.exe"-info"posdata\posdata.dat"-vecdata\pos.vec-num50-w20-h20运行完了会d:\face\data下生成一个*.vec的文件。该文件包含正样本数目,宽高以及所有样本图像数据。结果入下图:Createsamples程序的命令行参数:命令行参数:-vec训练好的正样本的输出文件名。-img源目标图片(例如:一个公司图标)-bg背景描述文件。-num要产生的正样本的数量,和正样本图片数目相同。-bgcolor背景色(假定当前图片为灰度图)。背景色制定了透明色。对于压缩图片,颜色方差量由bgthresh参数来指定。则在bgcolor-bgthresh和bgcolor+bgthresh中间的像素被认为是透明的。-bgthresh-inv如果指定,颜色会反色-randinv如果指定,颜色会任意反色-maxidev背景色最大的偏离度。-maxangel-maxangle,-maxzangle最大旋转角度,以弧度为单位。-show如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程继续。这是个有用的debug选项。-w输出样本的宽度(以像素为单位)-h《sample_height》输出样本的高度,以像素为单位。到此第一步样本训练就完成了。恭喜你,你已经学会训练分类器的五成功力了,我自己学这个的时候花了我一天的时间,估计你几分钟就学会了吧。三、训练分类器样本创建之后,接下来要训练分类器,这个过程是由haartraining程序来实现的。该程序源码由OpenCV自带,且可执行程序在OpenCV安装目录的bin目录下。Haartraining的命令行参数如下:-data存放训练好的分类器的路径名。-vec正样本文件名(由trainingssamples程序或者由其他的方法创建的)-bg背景描述文件。-npos,-nneg用来训练每一个分类器阶段的正/负样本。合理的值是:nPos=7000nNeg=3000-nstages训练的阶段数。-nsplits决定用于阶段分类器的弱分类器。如果1,则一个简单的stumpclassifier被使用。如果是2或者,则带有number_of_splits个内部节点的CART分类器被使用。-mem预先计算的以MB为单位的可用内存。内存越大则训练的速度越快。-sym(default)-nonsym指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对称的。-minhitrate《min_hit_rate》每个阶段分类器需要的最小的命中率。总的命中率为min_hit_rate的number_of_stages次方。-maxfalsealarm没有阶段分类器的最大错误报警率。总的错误警告率为max_false_alarm_rate的number_of_stages次方。-weighttrimming指定是否使用权修正和使用多大的权修正。一个基本的选择是0.9-eqw-mode选择用来训练的haar特征集的种类。basic仅仅使用垂直特征。all使用垂直和45度角旋转特征。-w《sample_width》-h《sample_height》训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。一个训练分类器的例子:"D:\ProgramFiles\OpenCV\bin\haartraining.exe"-datadata\cascade-vecdata\pos.vec-bgnegdata\negdata.dat-npos49-nneg49-mem200-modeALL-w20-h20训练结束后,会在目录data下生成一些子目录,即为训练好的分类器。训练结果如下:恭喜你,你已经学会训练分类器的九成功力了。四:利用训练好的分类器进行目标检测。这一步需要用到performance.exe,该程序源码由OpenCV自带,且可执行程序在OpenCV安装目录的bin目录下。performance.exe-datadata/cascade-infoposdata/test.dat-w20-h20-rs30performance的命令行参数如下:Usage:./performance-data-info[-maxSizeDiff][-maxPosDiff][-sf][-ni][-nos][-rs][-w][-h]也可以用opencv的cvHaarDetectObjects函数进行检测:CvSeq*faces=cvHaarDetectObjects(img,cascade,storage,1.1,2,CV_HAAR_DO_CANNY_PRUNING,cvSize(40,40))//3.检测人脸


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11139375.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存