最近在评测飞凌RK3588的人脸识别项目,我用官方的例程已经实现了人脸检测。为了完成人脸识别,决心学习人脸识别的章节。
1、认真阅读7.4节。
2、按照作者提供的程序录入程序。
3、放到发板上测试。
# _*_ coding:utf-8 _*_
import cv2
import os
import sys
import random
# 图片宽高
img_w = 64
img_h = 64
# 最多采集500张人脸图片
MAX_NUM = 500
data_dir = './data/'
my_dir = './data/my_faces/'
camera = cv2.VideoCapture(74)
# 改变图片的高度与对比度
def relight(img, light=1, bias=0):
w = img.shape[1]
h = img.shape[0]
for i in range(0, w):
for j in range(0, h):
for c in range(3):
tmp = int(img[j, i, c] * light + bias)
if tmp > 255:
tmp = 255
elif tmp < 0:
tmp = 0
img[j, i, c] = tmp
return img
if __name__ == '__main__':
# 采集照片存放目录
output_dir = my_dir
# 判断目录是否存在,若不存在则创建
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print("save faces pictures to", output_dir)
# 获取分类器
haar = cv2.CascadeClassifier('./static/haarcascade_frontalface_alt2.xml')
# 打开摄像头是否已经打开
if not camera:
print("Camera open error! Please check camera!")
sys.exit(1)
index = 1
while True:
if index <= MAX_NUM:
print("Processing picture %s" % index)
# 从摄像头读取图像
ret, img = camera.read()
if ret == False:
print("Camera read picture error! Please check camera")
break
# 将图片从从BGR转为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 开始检测人险, 每次缩小图像的比例为1.3,周围矩形框的数目达到5时才算匹配成功
faces = haar.detectMultiScale(gray_img, 1.3, 5)
for f_x, f_y, f_w, f_h, in faces:
face = img[f_y:f_y + f_h, f_x:f_x + f_w]
# 调整图片的对比度与亮度, 对比度与亮度值都取随机数,这样能增加样本的多样性
face = relight(face, random.uniform(0.8, 1.2), random.randint(-20, 20))
# 将图片调整成我们需要的尺寸
face = cv2.resize(face, (img_w, img_h))
# 设置OpenCV显示窗口信息
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 256, 256)
# 保存图像文件
str_dir = output_dir + str(index) + '.jpg'
cv2.imwrite(str_dir, face)
cv2.moveWindow('image', 200, 200)
cv2.imshow('image', face)
index += 1
# 检测是否按下q键, 若按下则结束人脸照片采集
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
else:
print("Finished!")
break
# 释放摄像对资源
camera.release()
# 销毁所有的窗口
cv2.destroyAllWindows()
通过上面的程序,成功实现了人脸的图像采集,为下一步的人脸识模型训练提供数据。
这次的程序注释非常详细,我一个一个字录入后,再次学习了摄像头的打开,文件的保存,图像的转换等。写得非常好。
一个一个字录入程序时发现一个小问题。是程序中没有初始化camera所以我加入了camers = cv2.VideoCapture(74)//74这个是摄像头的端口号,如果大家要找到这个编号,要通过查看摄像头的设备来定。
作者在源码提供上,跟上次一样,还是有一些问题,建议代码要全面,要不有些新手会找不着北。
更多回帖