最近在评测飞凌RK3588的人脸识别项目,我用官方的例程已经实现了人脸检测。为了完成人脸识别,决心学习人脸识别的章节。
【学习步骤】
1、认真阅读7.4节。
2、按照作者提供的程序录入程序。
3、放到发板上测试。
程序
import cv2
import os
import sys
import random
img_w = 64
img_h = 64
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
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
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))
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
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
else:
print("Finished!")
break
camera.release()
cv2.destroyAllWindows()
实验效果
通过上面的程序,成功实现了人脸的图像采集,为下一步的人脸识模型训练提供数据。
读后感
这次的程序注释非常详细,我一个一个字录入后,再次学习了摄像头的打开,文件的保存,图像的转换等。写得非常好。
问题发现与解决方案
一个一个字录入程序时发现一个小问题。是程序中没有初始化camera所以我加入了camers = cv2.VideoCapture(74)//74这个是摄像头的端口号,如果大家要找到这个编号,要通过查看摄像头的设备来定。
建议
作者在源码提供上,跟上次一样,还是有一些问题,建议代码要全面,要不有些新手会找不着北。