opencv训练⼝罩识别级联分类器
opencv训练⼝罩识别级联分类器
数据预处理
将照⽚的命名统⼀格式
将照⽚的正样本和负样本分开,存⼊各⾃的⽂件夹中,⽤cmd命令⾏进⼊该⽬录,输⼊以下命令,⽣成,⽂件中包含⽬录下所有⽂件的路径。
dir/b/s/p/w *.jpg >
将⽂件中的路径复制到excel表格中,并在表格最上⽅第⼀⽅输⼊names
对正样本图⽚进⾏统⼀灰度处理和裁剪处理(负样本⼀样,只是不进⾏⼤⼩裁剪)
import pandas as pd
import cv2
ad_excel('data\\imgName.xlsx')['names']# 读取所有照⽚名字
i=100000#⽤于重新命名
for imagepath in names:
#读取图⽚
img = cv2.imread(imagepath)
# print(imagepath)
# print(img)
#转成灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#⼈脸识别器
detector = cv2.CascadeClassifier('haarcascades\\haarcascade_l')
#获取⼈脸位置
#print(gray)
faces = detector.detectMultiScale(gray,1.1,5)
for(x, y, w, h)in faces:
#裁减图⽚
gray = gray[y:y+h,x:x+w]# 裁剪坐标为[y0:y1, x0:x1]
#如果⼈脸不为空
try:
# 保存裁减后的灰度图
cv2.imwrite('C:\\Users\\admin\\PycharmProjects\\Dg\\face\\face\\GraduationProject\\mask\\gray1'+str(i)+'.jpg', gray)
# cv2.waitKey(3000)
i +=1
except:
print()
import pandas as pd
import cv2
for n in range(100000,102853):
path ='C:\\Users\\admin\\PycharmProjects\\Dg\\face\\face\\GraduationProject\\mask\\gray1'+str(n)+'.jpg'
# 读取图⽚
img = cv2.imread(path)
# print(img.shape)
if img is None:
#遇到第⼀步识别有问题的图⽚,则跳过
continue
img = size(img,(20,20))
cv2.imwrite('C:\\Users\\admin\\PycharmProjects\\Dg\\face\\face\\GraduationProject\\mask1\\gray1'+str(n)+'.jpg', img)
rectangle函数opencvn +=1
在正样本的⽂件后⾯增加⼤⼩描述
1 0 0 20 20
获取供训练⽤的vec⽂件
到OpenCV\build\x64\vc14\bin⽬录下的
到OpenCV\build\x64\vc14\bin⽬录下的。复制 和 到该⽬录下:然后cmd进⼊该⽬录 -vec pos.vec - -num 353-w 20-h 20
说明:
-info,指样本说明⽂件
-vec,样本描述⽂件的名字及路径
-num,总共⼏个样本,要注意,这⾥的样本数是指标定后的20x20的样本数,⽽不是⼤图的数⽬,其实就是样本说明⽂件第2列的所有数字累加
-w -h指明想让样本缩放到什么尺⼨。
开始训练样本
新建⽂件traincascade.bat
新建⽂件traincascade.bat,把
-data xml -vec pos.vec - -numPos 500 -numNeg 656 -numStages 20 -w 20 -h 20 -mode ALL
pause写⼊其中保存,把之前修改的的后⾯的1 0 0 20 20删去变回原样。在⽬录下新建xml的⽂件夹,然后运⾏traincascade.bat 即可得到模型xml⽂件。
测试模型
import cv2
detector= cv2.CascadeClassifier('haarcascades\\haarcascade_l') mask_detector=cv2.CascadeClassifier('data\\l')
cap = cv2.VideoCapture(0)
while True:
ret, img = ad()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector.detectMultiScale(gray,1.1,3)
for(x, y, w, h)in faces:
#参数分别为图⽚、左上⾓坐标,右下⾓坐标,颜⾊,厚度
face=img[y:y+h,x:x+w]# 裁剪坐标为[y0:y1, x0:x1]
mask_face=mask_detector.detectMultiScale(gray,1.1,5)
for(x2,y2,w2,h2)in mask_face:
cv2.imshow('Cheney', img)
cv2.waitKey(3)
cv2.destroyAllWindows()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。