OpenCV做图片人脸识别和视频人物识别

Posted 灰黑控

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV做图片人脸识别和视频人物识别相关的知识,希望对你有一定的参考价值。

 图片人脸识别,视频人脸识别,调用本机摄像头录制视频,并保存文件!

01



OpenCV图片人脸识别



使用import cv2   装好了之后名字为cv2 读取图片 cv2.imread(图片路径)


cv2.imshow(窗口名,数据文件) 直接使用会报错 需要添加等待键盘输入


 cv2.waitKey(时间) 里面的时间单位是毫秒 如果里面是0那么表示无限等待还需要执行


 如果要让用户输入字符或者什么那么在前面加上 ord() == cv2.waitKey()


 cv2.destroyAllWindows() 释放内存

 cv2.cvtColor(文件名,code=cv2.COLOR_BGR2GRAY) #转换为黑白的图片

 cv2读取图片颜色通道是BGR PIL读取图片是RGB通到


 cv2.imwrite(保存路径,数据文件)保存图片


 cv2.resize(文件名, dsize = (宽,高 与shape展示出来的数据相反))设置图片大小


开始操作


一共用到了三个个库分别是cv2(OpenCV)、randomNumpy


import numpy as npimport cv2import random


读取数据内容:

sun = cv2.imread('E:/python/picture/sun.jpg')    # 括号内容为图片绝对路径

级联分类器,这里需要已经训练好的特征数据集

haarcascade_frontalface_default.xml

特征数据集的话可以在Github里面下载,也可以在公众内恢复【特征】获取!

detector = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') # 识别人脸 导入人脸识别数据face_zone = detector.detectMultiScale(sun, scaleFactor=1.2, minNeighbors=5) # 人脸区域

对人脸区域框进行设置

 x,y是坐标 w,h宽高for x, y, w, h in face_zone: color = np.random.randint(0, 256, size=3)

有两种选区方式,圆形和方形

# 方形 cv2.rectangle(sun, pt1=(x, y), pt2=(x + w, y + w), color=color.tolist()) # 将识别出来的图片标记出来正方形# 圆形 cv2.circle(sun, center=(x+w//2, y+h//2), radius=w//2, color=color.tolist(), thickness=2)


展示(开头也有介绍,不多详细说了)

cv2.imshow('sun', sun)

直到用户输入q退出

 while True:
if ord('q') == cv2.waitKey(30000): break cv2.destroyAllWindows()


完整代码

import numpy as npimport cv2
sun = cv2.imread('E:/python/picture/sun.jpg')
sun = cv2.resize(sun, dsize=(617, 800))# 级联分类器detector = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') # 识别人脸 导入人脸识别数据face_zone = detector.detectMultiScale(sun, scaleFactor=1.2, minNeighbors=5) # 人脸区域
# x,y是坐标 w,h宽高for x, y, w, h in face_zone: color = np.random.randint(0, 256, size=3)# 方形 cv2.rectangle(sun, pt1=(x, y), pt2=(x + w, y + w), color=color.tolist()) # 将识别出来的图片标记出来正方形# 圆形 cv2.circle(sun, center=(x+w//2, y+h//2), radius=w//2, color=color.tolist(), thickness=2) cv2.imshow('sun', sun) while True:
if ord('q') == cv2.waitKey(30000): break cv2.destroyAllWindows()  




02



视频人脸识别

视频和人脸差不多,这里就不多介绍了,每行都有注释,大家自行参透

import numpy as npimport cv2import random

cap = cv2.VideoCapture('E:/python/video/2011.mp4') # 读取视频数据# cap = cv2.VideoCapture(0) # 参数为0 那么会调用摄像头.flag, frame = cap.read() # 读取视频中的其中一张照片cv2.waitKey(0)cv2.destroyAllWindows()# cap.get(propId=cv2.CAP_PROP_FPS) # 调试部分 获取视频的每秒多少帧 保证原视频的数据不变# cap.get(propId=cv2.CAP_PROP_FOURCC) # 编码格式# cap.get(propId=cv2.CAP_PROP_FRAME_COUNT) # 获取帧数量# cap.get(propId=cv2.CAP_PROP_FRAME_HEIGHT) # 获取图片高度# cap.get(propId=cv2.CAP_PROP_FRAME_WIDTH) # 获取图片宽度
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))+1 # 获取图片高度 可大不可小w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))+1 # 获取图片宽度# 保存视频 四个参数 第一个是文件名 第二个视频编码 第三个是视频帧数 第四个是视频帧尺寸videoWrite = cv2.VideoWriter('E:/python/video/{}.mp4 '.format(random.random()), cv2.VideoWriter_fourcc('M', 'P', '4', 'v'), 24, (w, h))detector = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml') # 导入人脸识别数据while cap.isOpened(): flag, frame = cap.read() if not flag: break
gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY) face_zone = detector.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=4) # img_png = cv2.imread('E:/python/picture/11.jpg') # img_png = cv2.resize(img_png, (w, h)) for x, y, w, h in face_zone: # gray[y:y+w, x:x+h] = img_png color = np.random.randint(0, 256, size=3) # 圆形标记 cv2.circle(frame, center=(x+w//2, y+h//2), radius=w//2, color=[0, 0, 255], thickness=2) # 方形标记 cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + w), color=color.tolist()) videoWrite.write(frame) if not flag: break cv2.imshow('role', frame) if ord('q') == cv2.waitKey(1): # 保证每一帧读取 视频正常显示 breakcv2.destroyAllWindows()cap.release()videoWrite.release()


实验结果:

图像识别

视频人脸识别这边就不做介绍了!