一、找自己运行环境的cv2
- 找cv2的包haarcascade_frontalface_default.xml
一般都在所运行虚拟环境下的,控制台输入命令pip show opencv-python
pip show opencv-python
就是在这个路径下的cv2文件夹里,不要去opencv-python文件夹了。。。
haarcascade_frontalface_default.xml就在这里了,替换代码的这个路径
二、查找人脸
这里需要不断根据自己的数据集去调参scaleFactor、minNeighbors、minSize
输出的图片是可以设置的固定像素值
具体参数含义可以百度,如果有些自己看着很明显他裁剪不出来,那就保存下来重新调参再剪一次,即第二次就可以用Nohave文件夹下的作为输入文件夹,如此反复,节约数据
import cv2
import os
import glob
size_m = 512
size_n = 512
def detect(img, cascade):
rects = cascade.detectMultiScale(img, scaleFactor=1.45, minNeighbors=3, minSize=(30, 80), flags=cv2.CASCADE_SCALE_IMAGE)
if len(rects) == 0:
return []
rects[:, 2:] += rects[:, :2]
return rects
cascade = cv2.CascadeClassifier("D:\software_learning\deeplearning\Anaconda\Anaconda3.7\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml") # 注意查看自己的包路径,如何找cv2看前面
imglist = glob.glob(r"E:\people_face\test_pic\new_pic\*") # 待处理数据集路径new_pic下面全是png或者jpg
#新图像存
for list in imglist:
# print(list)
img = cv2.imread(list)
dst = img
rects = detect(dst, cascade)
path = list.split("\\")
if len(rects): # rects不为空则检测到人脸
for x1, y1, x2, y2 in rects:
roi = dst[y1:y2,x1:x2] # 剪切
img_roi = roi
re_roi = cv2.resize(img_roi, (size_m, size_n)) # 重新定义大小512*512
reslut_path = r"E:\people_face\test_pic\res_pic\\" # 处理后的图片存在的路径下
# print(path[4][:-4]) # 截取到原图片名(也可以自定义个数字累和计算),因为路径是第五个块,根据自己路径换,不清楚可以打印
cv2.imwrite(reslut_path+path[4][:-4]+".png",re_roi)
else: # 没有切的人脸选出来,放另一个文件夹
os.rename(list, r"E:\people_face\Nohave\\"+path[4][:-4]+'.png') # 换路径 src,dist路径