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)、random和Numpy
import numpy as np
import cv2
import 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 np
import 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 np
import cv2
import 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): # 保证每一帧读取 视频正常显示
break
cv2.destroyAllWindows()
cap.release()
videoWrite.release()
实验结果:
图像识别
视频人脸识别这边就不做介绍了!
以上是关于OpenCV做图片人脸识别和视频人物识别的主要内容,如果未能解决你的问题,请参考以下文章