1.首先需要下载一个cv2包,全称为Open Source Computer Vision Library,缩写为OpenCV,调用时简称cv2
win+R,输入cmd打开命令窗口,然后输入命令行:
pip install opencv-python
2.输入pip list可以查看到是否成功安装有opencv-python
3.这边opencv-python包中需要手动添加一个加载分类器haarcascade_frontalface_alt2.xml
(1)一般情况下opencv-python的默认路径为C:\Users\dell\anaconda3\Lib\site-packages\opencv_python-4.5.1.48.dist-info
(2)打开opencv_python-4.5.1.48.dist-info这个文件夹后把,加载分类器haarcascade_frontalface_alt2.xml放进这个目录里面
(3)#加载分类器haarcascade_frontalface_alt2.xml下载路径:
链接:https://pan.baidu.com/s/1flgCtnwnWFy7-1OHwkdmbg
提取码:vicu
复制这段内容后打开百度网盘手机App,操作更方便哦
4.接下来为大家分享一个小编亲测有效的opencv人脸识别算法,用的是笔记本电脑外接USB摄像头,完整代码如下:
import cv2
def getTrainingData(window_name, camera_id, path_name, max_num): # path_name是图片存储目录,max_num是需要捕捉的图片数量
cv2.namedWindow(window_name) # 创建窗口
cap = cv2.VideoCapture(camera_id) # 打开摄像头
classifier = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml') # 加载分类器
classifier.load(r'C:\Users\dell\anaconda3\Lib\site-packages\opencv_python-4.5.1.48.dist-info\haarcascade_frontalface_alt2.xml')#一定要告诉编译器文件所在的具体位置
color = (0,255,0) # 人脸矩形框的颜色
num = 0 # 记录存储的图片数量
while cap.isOpened():
ok, frame = cap.read()
if not ok:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 灰度化
faceRects=classifier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32,32))
if len(faceRects) > 0:
for faceRect in faceRects:
x,y,w,h = faceRect
# 捕捉到的图片的名字,这里用到了格式化字符串的输出
image_name = '%s%d.jpg' % (path_name, num) # 注意这里图片名一定要加上扩展名,否则后面imwrite的时候会报错:could not find a writer for the specified extension in function cv::imwrite_ 参考:https://stackoverflow.com/questions/9868963/cvimwrite-could-not-find-a-writer-for-the-specified-extension
image = frame[y:y+h, x:x+w] # 将当前帧含人脸部分保存为图片,注意这里存的还是彩色图片,前面检测时灰度化是为了降低计算量;这里访问的是从y位开始到y+h-1位
cv2.imwrite(image_name, image)
num += 1
# 超过指定最大保存数量则退出循环
if num > max_num:
break
cv2.rectangle(frame, (x,y), (x+w,y+h), color, 2) # 画出矩形框
font = cv2.FONT_HERSHEY_SIMPLEX # 获取内置字体
cv2.putText(frame, ('%d'%num), (x+30, y+30), font, 1, (255,0,255), 4) # 调用函数,对人脸坐标位置,添加一个(x+30,y+30)的矩形框用于显示当前捕捉到了多少人脸图片
if num > max_num:
break
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
break
cap.release()#释放摄像头并销毁所有窗口
cv2.destroyAllWindows()
print('Finished.')
#主函数
if __name__ =='__main__':
print ('catching your face and writting into disk...')
getTrainingData('mycamera',0,r'E:\datasets_me\training_data_me',10) # 注意这里的path_name必须是纯英文,否则读取不到存储路径;而且最后一个“\”后面是自定义的图片名称,之前的全为路径
5.这边需要注意的是
(1)# 加载分类器的路径根据自己的情况修改
(2)注意这里的path_name必须是纯英文,否则读取不到存储路径;而且最后一个“\”后面是自定义的图片名称,之前的全为路径