训练
级联分类器训练用户指南:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
训练过程:https://blog.csdn.net/qq_32502511/article/details/79010509
训练结果:
N是训练层级,HR(hit rate) 是正样本输入后输出结果正确率;FA(fault alarm)是负样本输入后输出结果错误率。
理想是希望HR接近1,FA接近0。训练过程是层级递进,直到达到设置要求。
训练很慢,根据样本数量不同,可能会几天。舌头位置识别,这个例子效果就不是很好,不过训练过程可以借鉴。
其实这种方式已经不太常用,因为即使训练出来准确率也不是很高,更何况训练过程很慢。
当然也有些训练的效果不错,这也说明图像识别不一定非要用deep learning,只不过用神经网络更好效果更好
opencv官网提供了一些已经训练好的分类器,可以直接使用:
https://download.csdn.net/download/lusics/11003803
检测
以人脸识别为例,采用摄像头收集到的图像。
代码中,根据实际分类器.xml位置更改load路径即可。
import cv2
# 加载opencv自带的人脸分类器
faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
faceCascade.load(r'C:\workspace\python\opencvTongueDetect\haarcascades\haarcascade_frontalface_alt2.xml')
cap = cv2.VideoCapture(0)
flag = 0
timeF = 10
while True:
flag+=1
ret, frame = cap.read()
img = frame.copy()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
rect = faceCascade.detectMultiScale(
gray,
scaleFactor=1.15,
minNeighbors=3,
minSize=(3,3),
flags = cv2.IMREAD_GRAYSCALE
)
#cv2.rectangle(frame, (20, 40), (30, 50), (0, 255, 0), 2)
for (x, y, w, h) in rect:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
#识别到物体后进行裁剪保存
#jiequ = img[x:(x+w), y:(y+h)]
#cv2.imwrite('E://tools//python//eclipse//work//pythonTest//demo//0202//img//save//'+str(flag) + '.jpg',jiequ) #save as jpg
#读取到保存图片
# if(flag%timeF==0):
# cv2.imwrite('E://tools//python//eclipse//work//pythonTest//demo//0202//img//save//'+str(flag) + '.jpg',frame) #save as jpg
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()