最近开始学习Opencv以及相关的代码,看了一些网上的解释,总结一下CascadeClassifier()这个函数,方便以后加深印象。
CascadeClassifier,是Opencv中做人脸检测的时候的一个级联分类器。并且既可以使用Haar,也可以使用LBP特征。
Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑白两种矩形框组合成特征模板,在特征模板内用 黑色矩形像素和 减去 白色矩形像素和来表示这个模版的特征值。例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。这样就可以进行区分人脸。
LBP特征原理:http://www.360doc.com/content/18/0202/11/18306241_727150014.shtml
这是我从github上下载的一部分示例代码:
def getfacefromcamera(outdir):
createdir(outdir)
#获取摄像头
camera = cv2.VideoCapture(0)
#要检测cascade文件是否在路径下,最后一般使用绝对路径。
haar = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
n = 1
while 1:
if (n <= 200):
print('It`s processing %s image.' % n)
# 读帧(从摄像头当中读取照片)
success, img = camera.read()
# 将图片进行转灰
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = haar.detectMultiScale(gray_img, 1.3, 5)
for f_x, f_y, f_w, f_h in faces:
face = img[f_y:f_y+f_h, f_x:f_x+f_w]
face = cv2.resize(face, (IMGSIZE, IMGSIZE))
#could deal with face to train
face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50))
cv2.imwrite(os.path.join(outdir, str(n)+'.jpg'), face)
cv2.putText(img, 'haha', (f_x, f_y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2) #显示名字
img = cv2.rectangle(img, (f_x, f_y), (f_x + f_w, f_y + f_h), (255, 0, 0), 2)
n+=1
cv2.imshow('img', img)
key = cv2.waitKey(30) & 0xff
if key == 27:
break
else:
break
camera.release()
cv2.destroyAllWindows()
子函数detectMultiScale()介绍
void detectMultiScale(
const Mat& image, //待检测图像
CV_OUT vector& objects, //被检测物体的矩形框向量
double scaleFactor = 1.1, //前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10%
int minNeighbors = 3, //构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于minneighbors - 1 都会被排除
//如果minneighbors为0 则函数不做任何操作就返回所有被检候选矩形框
int flags = 0, //若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域
Size minSize = Size(),
Size maxSize = Size() //最后两个参数用来限制得到的目标区域的范围
);
对于flags
,有以下取值:CV_HAAR_DO_CANNY_PRUNING
:利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域;CV_HAAR_SCALE_IMAGE
:按比例正常检测;CV_HAAR_FIND_BIGGEST_OBJECT
:只检测最大的物体;CV_HAAR_DO_ROUGH_SEARCH
:只做初略检测。