【2024 DigiKey 创意大赛】基于树莓派的“相面算命”神器
[复制链接]
本帖最后由 吾妻思萌 于 2024-10-31 22:21 编辑
一、作品简介
本设计是使用树莓派搭配摄像头(活动)和内存卡(活动)屏幕(活动)一同搭建的一个设备,用于在体验人脸识别的同时兼具“算命”的神奇功能。
清单:
- 树莓派3B----可用德捷电子的Pi400代替
- 内存卡32G----用于烧录镜像
- 摄像头----图像识别必备
- 显示屏----可选,可用电脑显示器和小的显示屏
核心思路:树莓派捕捉图像传到百度智能云API,并在API中设置好识别的面部区域和特征,然后返回模型识别结果,最后输出。
二、系统框图
大体基本和常见的智能家居项目相似,捕捉图像-传输数据-远程识别-返回结果等。
模型采用百度智能云,可以自定义配置人脸关键点的属性。
三、功能说明
采用opencv的人脸识别方式
import cv2
#选择此代码目录下的某个图片文件
img = cv2.imread('image2.jpg',1)
# 导入人脸级联分类器,'.xml'文件里包含训练出来的人脸特征
face_engine = cv2.CascadeClassifier('/home/pi/Downloads/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_default.xml')
# 检测设置,将图片放大1.1倍(一般设1.1倍,看效果而定)
# 重复检测的次数为5次(检测次数越多,速度越慢,检测也越严格,准确率可能有所提升)
faces = face_engine.detectMultiScale(img,scaleFactor=1.1,minNeighbors=5)
# 对图片进行人脸检测,之后得到人脸的坐标(一个矩形框),再用蓝色框框出,线宽为2
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # (255,0,0)=(B,G,R)
# 显示图片
cv2.imshow('img',img)
# 检测是否有按键按下
cv2.waitKey(0)
# 关闭窗口,释放占用的资源
cv2.destroyAllWindows()
--------------------------------------------------------------------
--------------------------------------------------------------------
--------------------------------------------------------------------
import cv2
# 导入人脸级联分类器,'.xml'文件里包含训练出来的人脸特征
face_engine = cv2.CascadeClassifier('/home/pi/Downloads/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_default.xml')
# 导入人眼级联分类器,'.xml'文件里包含训练出来的人眼特征
eye_cascade = cv2.CascadeClassifier('/home/pi/Downloads/opencv-3.4.0/data/haarcascades/haarcascade_eye.xml')
# 调用摄像头摄像头
cap = cv2.VideoCapture(0)
while(True):
# 获取摄像头拍摄到的画面
# 会得到两个参数,一个为存放是否捕捉到图像(True/False),另一个为存放每帧的图像
ret, frame = cap.read()
# 每帧图像放大1.1倍,重复检测10次
faces = face_engine.detectMultiScale(frame,1.1, 10)
img = frame
for (x,y,w,h) in faces:
# 画出人脸框,蓝色,画笔宽度为2
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源
face_area = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(face_area,1.1,5)
# 用人眼级联分类器在人脸区域进行人眼识别,返回的eyes为眼睛坐标列表
for (ex,ey,ew,eh) in eyes:
#画出人眼框,绿色,画笔宽度为1
cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)
# 实时展示效果画面
cv2.imshow('frame2',img)
# 每5毫秒监听一次键盘动作
if cv2.waitKey(5) & 0xFF == ord('a'): #当按下“a”键时退出人脸检测
break
# 最后,关闭所有窗口
cap.release()
cv2.destroyAllWindows()
识别结果
采用API识别并返回描述
import requests
import base64
from picamera import PiCamera
import time
# 初始化摄像头
camera = PiCamera()
camera.resolution = (1024, 768)
# 让相机预热
time.sleep(2)
# 捕获图片
image_path = 'image.jpg'
camera.capture(image_path)
# 图片转base64编码
with open(image_path, 'rb') as f:
image_data = f.read()
image_base64 = base64.b64encode(image_data).decode()
# 获取百度AI的Access Token
def get_access_token(api_key, secret_key):
url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}".format(api_key, secret_key)
response = requests.get(url)
return response.json().get('access_token')
# 使用百度AI API识别图片
def recognize_image(access_token, image_base64):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/general"
params = {"image": image_base64}
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
return response.json()
# 设置API Key和Secret Key
api_key = 'xxx'
secret_key = 'xxx'
# 获取Access Token
access_token = get_access_token(api_key, secret_key)
# 调用API识别图片
result = recognize_image(access_token, image_base64)
# 打印识别结果
print(result)
结果展示
四、演示图
第一版本的部分演示图
五、总结
简单尝试了树莓派的图像识别,由于代码和硬件配置原因,图像捕捉大帧率始终上不去,后来经过优化帧率提升到15帧左右,摄像头识别较为清楚,调用API可以自主搭配,通过本次搭建了一套识别和调用API的方法,寓教于乐。
六、演示视频
七、附件
|