【2024 DigiKey 创意大赛】基于树莓派的“相面算命”神器
本帖最后由 吾妻思萌 于 2024-10-31 22:21 编辑<h3>一、作品简介</h3>
<p>本设计是使用树莓派搭配摄像头(活动)和内存卡(活动)屏幕(活动)一同搭建的一个设备,用于在体验人脸识别的同时兼具“算命”的神奇功能。</p>
<p>清单:</p>
<ul>
<li>树莓派3B----可用德捷电子的Pi400代替</li>
<li>内存卡32G----用于烧录镜像</li>
<li>摄像头----图像识别必备</li>
<li>显示屏----可选,可用电脑显示器和小的显示屏</li>
</ul>
<p>核心思路:树莓派捕捉图像传到百度智能云API,并在API中设置好识别的面部区域和特征,然后返回模型识别结果,最后输出。</p>
<h3>二、系统框图</h3>
<p>大体基本和常见的智能家居项目相似,捕捉图像-传输数据-远程识别-返回结果等。</p>
<p> </p>
<p>模型采用百度智能云,可以自定义配置人脸关键点的属性。</p>
<p> </p>
<h3>三、功能说明</h3>
<p>采用opencv的人脸识别方式</p>
<pre>
<code class="language-python">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
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()</code></pre>
<p>识别结果</p>
<p> </p>
<p>采用API识别并返回描述</p>
<pre>
<code class="language-python">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)
</code></pre>
<h3><strong>结果展示</strong></h3>
<p> </p>
<h3>四、演示图</h3>
<p> 第一版本的部分演示图</p>
<p> </p>
<p> </p>
<h3>五、总结</h3>
<p>简单尝试了树莓派的图像识别,由于代码和硬件配置原因,图像捕捉大帧率始终上不去,后来经过优化帧率提升到15帧左右,摄像头识别较为清楚,调用API可以自主搭配,通过本次搭建了一套识别和调用API的方法,寓教于乐。</p>
<p><span style="font-size:16px;"><strong>六、演示视频</strong></span></p>
<div>233ba4ad7eef02b8c26ed2476ae8f4bf</div>
<div><span style="font-size:16px;"><strong>七、附件</strong></span></div>
<div></div>
<p> </p>
<div></div>
<p> </p>
<p>面相结果是怎么出来的。</p>
面相结果是怎么出来的。
识别到了我返回一句假话,本来是想用识别额头点位,眼睛点位等参数,然后写些逻辑判断,后来发现图像太糊了。。。。 吾妻思萌 发表于 2024-10-30 10:07
识别到了我返回一句假话,本来是想用识别额头点位,眼睛点位等参数,然后写些逻辑判断,后来发现图像太糊 ...
<p>像素不高呗,那确实不好识别。而且这个面向要AI识别,还得训练不少人脸吧</p>
吾妻思萌 发表于 2024-10-30 10:07
识别到了我返回一句假话,本来是想用识别额头点位,眼睛点位等参数,然后写些逻辑判断,后来发现图像太糊 ...
<p>看来还需要增加了一个模块,做图像增强功能,解决图像太糊状况<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loveliness.gif" width="48" /></p>
hellokitty_bean 发表于 2024-10-30 13:53
看来还需要增加了一个模块,做图像增强功能,解决图像太糊状况
<p>试了下 增强的话变成了本来的我了</p>
<p>皮一下很开心.jpg</p>
<p> </p>
hellokitty_bean 发表于 2024-10-30 13:53
看来还需要增加了一个模块,做图像增强功能,解决图像太糊状况
<p>彦祖附体。。。。。。。。。厉害呀,。。。。。<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loveliness.gif" width="48" /></p>
页:
[1]