standard microsystems Corp.应该就是我们的设备了。
接下来,打开树莓派的编程IDE开发软件programming中Thonny用代码来测试和开发CV调用安森美USb双目摄像头,
2我们来测试软硬件是否都准备好了。
读取摄像头实时画面代码如下。
#opencvtest.py
import cv2
import datetime
cap = cv2.VideoCapture(0)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
while(cap.isOpened()):
ret, frame =cap.read()
if ret == True:
font = cv2.FONT_HERSHEY_SIMPLEX
text ='Width: '+ str(cap.get(3)) + ' Height:' + str(cap.get(4))
datet =str(datetime.datetime.now())
frame =cv2.putText(frame, text, (10, 50), font, 1,
(255, 255, 255), 2, cv2.LINE_AA)
frame =cv2.putText(frame, datet, (10, 100), font, 1,
(255, 255, 255), 2, cv2.LINE_AA)
cv2.imshow('frame', frame)
ifcv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
opencv通过摄像头图像调取成功,接下来进行人脸识别。
3这里需要安装两个库来支持人脸识别
pip3 install dlib
pip3 install face_recognition
速度太慢可以直接下载whl文件进行本地安装。真的的有点慢好几小时的感觉。
另外,安装完opencv及这些依赖库之后最好,重启一遍树莓派再进行下一步测试。
人脸识别这些之前在pc的w10环境下已经测试过,直接拿代码过来测试,调试就行。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH) + 0.5)
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT) + 0.5)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (width,height))
while(cap.isOpened()):
ret, frame =cap.read()
if ret == True:
out.write(frame)
gray =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)
cv2.imshow('My Camera',frame)
if(cv2.waitKey(1) & 0xFF) == ord('q'):
break
else:
break
out.release()
cap.release()
cv2.destroyAllWindows()
在树莓派的编程软件Thonny中 保存运行程序
程序会调用出来两个视频图形框,一个彩色的一个灰白的,
测试完退出的时候先点选图像框按ESC 再stop程序运行。
三通过尚安森美USB双目摄像头识别人脸并训练opencv数据
人脸识别出后,我们要进行项目的一个关键功能就是,通过opencv和摄像头,学习并训练识别家庭成员所需的数据图片和参数。
1首先要注意,haarvascade_frontalface_default.xml这个用来识别人脸的文件在opencv的安装目录/opencv-contrib-python-3.4.11.45/opencv/data/haarcascades文件夹中代码中一定要引用正确,也可以把这个文件直接放在代码所在的文件夹下。
2然后新建一个存放数据的dataset目录,用来存放,opencv获取的人脸数据。
数据采集代码:
import cv2
import os
cam = cv2.VideoCapture(0)
cam.set(3, 640) # setvideo width
cam.set(4, 480) # setvideo height
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# For each person,enter one numeric face id
face_id = input('
enter user id end press ==> ')
print("
[INFO]Initializing face capture. Look the camera and wait ...")
# Initializeindividual sampling face count
count = 0
while(True):
ret,img = cam.read()
img= cv2.flip(img, -1) #flip video image vertically
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces= face_detector.detectMultiScale(gray,1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y), (x+w,y+h), (255,0,0), 2)
count+= 1
#Save the captured image into the datasets folder
cv2.imwrite("dataset/User." + str(face_id)+ '.' + str(count)+ ".jpg",gray[y:y+h,x:x+w])
cv2.imshow('image',img)
k= cv2.waitKey(100)& 0xff # Press 'ESC' forexiting video
if k == 27:
break
elif count >= 30: # Take 30 face sample and stop video
break
# Do a bit of cleanup
print("
[INFO]Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()
3新建一个存放训练后的训练参数文件目录trainer目录,该目录中训练后会有一个trainer.yml的训练参数文件。
训练代码如下:
import cv2
import numpy as np
from PIL import Image
import os
# Path for face image database
path = 'dataset'
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector =cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
# function to get the images and label data
def getImagesAndLabels(path):
imagePaths =[os.path.join(path,f) for f in os.listdir(path)]
faceSamples=[]
ids = []
for imagePathin imagePaths:
PIL_img =Image.open(imagePath).convert('L') # convert it to grayscale
img_numpy =np.array(PIL_img,'uint8')
id =int(os.path.split(imagePath)[-1].split(".")[1])
faces =detector.detectMultiScale(img_numpy)
for(x,y,w,h) in faces:
faceSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
returnfaceSamples,ids
print ("
[INFO] Training faces. It will take a fewseconds. Wait ...")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
# Save the model into trainer/trainer.yml
recognizer.write('trainer/trainer.yml') #recognizer.save() worked on Mac, but not on Pi
# Print the numer of faces trained and end program
print("
[INFO] {0} faces trained. ExitingProgram".format(len(np.unique(ids))))
运行程序后,shell 输出框会提示输入ID ,这里的ID一定要用数字,
数字输入后,会提示等待开启摄像头,我们要对准摄像头等待采集,把准备好的照片或其他成员轮流运行程序和输入对应数字ID进行数据采集,摄像头采集完毕后,会自动关闭,我们停止程序即可。
至此,我们在dataset目录中会发现大量的不同成员的大量照片。
在trainer目录中会产生一个文件。
这个文件我们将在之后的项目测试中用到,作为识别关键成员和家庭成员的数据依据。
`