OpenCV—PythonCascadeClassifier(级联分类器)
⽂章⽬录
级联分类器包括两个:训练和检测;
⼀、CascadeClassifier的简介:
CascadeClassifier是opencv下objdetect模块中⽤来做⽬标检测的级联分类器的⼀个类;简⽽⾔之是滑动窗⼝机制+级联分类器的⽅式;早期opencv版本仅⽀持haar特征的⽬标检测,分别在opencv2.2和2.4之后开始⽀持LBP和HOG特征的⽬标检测。
Haar特征:
类Haar-like特征描述如下图:
在所有缩放尺度下,这些特征组成了boosting分类器使⽤的全部“原材料”。他们从原始灰度图像的积分图中快速计算得出。
LBP特征:
LBP是⼀种描述图像局部纹理特征的算⼦,被⽤于Viola-Jones检测器,回想Haar⼩波,它是在⼀⼩块邻域上通过⼩波变换的特征向量,⽽LBP在构造特征向量与此不同,在⼀个长宽都为3的倍数的矩形上,将它分割成不相重叠的3X3的⼩块,在每⼀个⼩块上,⽤积分图计算像素和,然后将中⼼点像素与周围8个像素点⽐较得到⼀个8位的特征值,若周围像素值⼤于中⼼像素值,则该像素点的位置被标记为1,否则为0。这样,3X3邻域内的8个点经⽐较可产⽣8位⼆进制数(通常转换为⼗进制数即LBP码,共256种),即得到该窗⼝中⼼像素点的LBP 值,并⽤这个值来反映该区域的纹理信息。如下图所⽰:
HOG特征:
⼆、检测步骤(视频取帧)
检测框的尺⼨必须⽐训练样本的尺⼨⼤
1.load()加载xml级联分类器
2.从视频中取帧,导出image;
3.图像灰度化;
4.图像resize;
5.调⽤detectMultiScale()实现多尺度检测:
g_cascade.detectMultiScale(InputArray image, //输⼊图像
CV_OUT std::vector<Rect>& 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() //能检测的最⼤尺⼨
);
import numpy as np
import cv2
def mosaic(ROI_image, nsize=15):
rows, cols = ROI_image.shape
dist = py()
for y in range(0, rows, nsize):
for x in range(0, cols, nsize):
dist[y:y+nsize, x:x+nsize]= np.mean(ROI_image[y:y+nsize, x:x+nsize])
return dist
def VideoCapture_frame(save_path):
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(save_path, fourcc,20.0,(640,480))
face_cascade = cv2.CascadeClassifier('haarcascade_l')
rectangle函数opencveye_cascade = cv2.CascadeClassifier('l')
cap = cv2.VideoCapture(0)
while cap.isOpened():
read, frame = ad()
if not read:
break
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
Rects = face_cascade.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32,32)) if len(Rects)>0:
for(x, y, w, h)in Rects:
roi_color = frame[y: y + h, x: x + w]
roiImg = grey[y:y + h, x:x + w]
#=============马赛克===============
result = mosaic(roiImg, nsize=15)
grey[y:y+h, x:x+w]= result
#=================================
eyes = eye_cascade.detectMultiScale(roiImg)
for(ex, ey, ew, eh)in eyes:
#cv2.imshow("grey", grey) # 显⽰马赛克效果
cv2.imshow("CaptureFace", frame)
if cv2.waitKey(5)&0xFF==ord('q'):
break
out.write(frame)
cv2.destroyAllWindows()
if __name__ =='__main__':
save_path ='./face_cascade.avi'
VideoCapture_frame(save_path)
代码⽰例(使⽤图⽚):
# encoding:utf-8
import cv2
import numpy as np
# 运⾏之前,检查cascade⽂件路径是否在相应的⽬录下
face_cascade = cv2.CascadeClassifier('haarcascade_l')
eye_cascade = cv2.CascadeClassifier('l')
# 读取图像并检测脸部
img =cv2.imread('timg.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30,30),flags=cv2.CASCADE_SCALE_IMAGE)
print('Detected ',len(faces)," face")
for(x, y, w, h)in faces:
img = angle(img,(x, y),(x + w, y + h),(255,0,0),2)
roi_gray = gray[y: y + h, x: x + w]
roi_color = img[y: y + h, x: x + w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for(ex, ey, ew, eh)in eyes:
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
训练
注意事项
1、正样本要resize成统⼀⼤⼩,负样本不需要resize
2、负样本的数量最好要超过正样本的数据
3、opencv_createsamples从正样本集创建训练样本时,-w和-h的参数代表要检测的滑动窗⼝⼤⼩,不⼀定是正样本的图像⼤⼩。
4、-w和-h两个参数对最后训练得到的xml的检测效果有较⼤的影响。因此实验时-w和-h两个参数的值可以多尝试。
5、有些⼈可能需要⽤HOG特征,但OpenCV 3.x以上的cascade版本不⽀持HOG特征检测,如果要⽤HOG特征,可以采⽤2.4.x的版本。
6、对于车辆检测,LBP的效果不⽐HAAR的差,⽽且训练速度快。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论