2104浏览
查看: 2104|回复: 6

坐姿智能提醒器

[复制链接]
【设计意图】 ThuAugust-202208048064..png
坐姿不正确,是儿童和青少年在学习和工作中经常出现一种情况,坐姿不正确,可以引起一系列的后果,通常会引起以下后果:

1、脊柱侧弯:儿童、青少年处于生理发育期,脊柱的关节、韧带没有完全成形或者处于比较薄弱的时期,由于长期的坐姿不良,会导致发育的异常,从而出现脊柱的侧弯;
2、颈椎病:由于坐姿不良,尤其是长时间的低头、伏案工作、看手机、看电脑,容易出现颈椎的退行改变,颈椎的生理曲度会变直或者消失,严重的会反弓。从而引起颈椎周围的韧带和关节退行改变,严重椎间盘突出或者颈椎不稳,压迫了周围的血管或神经,出现一系列症状;
3、腰背部肌肉劳损:由于慢性疲劳、坐姿不良等,造成肌肉的长期高强度、高张力状态,引起局部的缺血、损伤,出现严重的改变,就是腰肌劳损;
4、视力异常:没有放在一个正常的位置看东西,可能出现近视或者出现屈光不正等异常情况。



【作品功能】
ThuAugust-202208041624..png

ThuAugust-202208046555..png

1、通过摄像头采集坐姿,通过人工智能算法进行实时判断人体姿态

2、对不正确坐姿进行语音、灯光提醒,如低头趴桌、左右歪头、长时间不活动。

【制作元器件与材料】
1.LattePanda 拿铁熊猫
ThuAugust-202208044197..png
LattePanda是市面上首款Win 10开发板,运行完整版Windows 10操作系统。板载一颗英特尔4核处理器,最高1.92GHz运行频率,内置蓝牙和WiFi模组,支持USB 3.0接口、HDMI视频输出、3.5mm音频接口,100Mbps以太网口,以及额外的MicroSD扩展卡槽。您完全可以把它作为一台mini小电脑来看待,并且开发板集成一块Arduino Leonardo单片机,可以外拓各种传感器模块。

2.LattePanda 拿铁熊猫 IPS显示屏
ThuAugust-202208042334..png
LattePanda 7寸屏幕,IPS屏幕技术和1024 * 600高分辨率带来完美的视觉体验,精致小巧的显示屏与您的“小熊猫”完美配套!无需单独供电,连上LattePanda即可使用。搭配触摸屏,为您的项目提供可视化的用户界面。

3.高低音调节数字蓝牙功放板
ThuAugust-202208047664..png

这是一款可独立控制高音和低音的数字蓝牙功放板,它具有AM干扰抑制和滤波功能,确保即使长时间大功率操作,音质更加清澈圆润。工作电压范围DC9-24V,AUX+蓝牙5.0输入,输出功率50W,带有3个调节旋钮可进行电源开关和主音量控制、高音和低音独立控制,适用于4-8Ω、15W-100W无源扬声器。可连接拿铁熊猫、树莓派、手机以及其它带有蓝牙的主控板使用,可以DIY出自己喜欢的音箱。

【电路图】
ThuAugust-202208045395..png
【实物图】
ThuAugust-202208044735..png

【制作元器件与材料】
1.旧物利用——喇叭
ThuAugust-202208049727..png

从旧Mp3播放器上拆下两个喇叭
ThuAugust-202208049795..png

将两个喇叭与蓝牙功放连接
2.安装摄像头
ThuAugust-202208045743..png
摄像头安装在装置顶端,使用热熔胶固定,数据线通过盒子上的孔穿回盒内。
3.安装喇叭与灯带
ThuAugust-202208046808..png
喇叭与灯带安装在装置底端
4.安装蓝牙功放
ThuAugust-202208042654..png
将盒子侧面开孔,将蓝牙功能的三个旋钮引出。
5.安装熊猫板与显示屏
ThuAugust-202208049586..png

ThuAugust-202208044364..png
熊猫板固定在屏幕的背面
ThuAugust-202208043279..png

ThuAugust-202208049251..png

【技术实现过程】
1.Mediapipe
ThuAugust-202208049562..png
Mediapipe是google的一个开源项目,支持跨平台的常用ML方案。
我们使用到其中人体姿态估计:可以给出33个关键点的3D坐标
ThuAugust-202208043052..png
33个关键点的3D坐标

2.配置环境
程序运行在python 3.8.0环境下:
(1)安装opencv-python 计算机视觉库。
pip install opencv-python
(2)安装Numpy  开源的数值计算扩展,功能是科学计算,数据分析与处理。
pip install Numpy
(3)安装Scipy  距离计算库。
pip install Scipy
(4)安装pinpong  是一套控制开源硬件主控板的 Pyhton 库。
pip install pinpong
(5)安装Mediapipe 人工智能姿态识别开源库
pip install mediapipe
(6)安装cvzone  一个计算机视觉工具包,可方便的图像处理和实现视觉AI功能。核心是使用OpenCV和Mediapipe库。
pip install cvzone

3.HAR判断低头开源算法(head aspect ratio)
ThuAugust-202208049429..png
因人像在摄像头中会出现近大远不的现象,所以只使用两点间距离阈值来判断姿态是不准确的。

ThuAugust-202208047443..png
HAR判断低头开源算法:
在头部选择鼻子、两肩、两肩中点,四个点,具体如右图。
根据这四个点我们便可以表示低头和抬头的状态。当抬头的时候,上图中竖着的黄色箭头会变得比较高,而低头(不正确姿势)这个箭头就会变矮。但是由于近大远小的原因,单纯用高度来表示状态缺少参考比较,因此提出如下公式表示状态:
4.利用Mediapipe 获取人体姿态坐标点

ThuAugust-202208047235..png
  1. from cvzone.PoseModule import PoseDetector
  2. import cv2
  3. cap = cv2.VideoCapture(0)
  4. detector = PoseDetector()
  5. ang=180
  6. while True:
  7.         success, img = cap.read()
  8.         img = detector.findPose(img)
  9.         lmList, bboxInfo = detector.findPosition(img, bboxWithHands=False)
  10.         if bboxInfo:
  11.             center = bboxInfo["center"]
  12.             cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)
  13.         cv2.imshow("Image", img)
  14.         cv2.waitKey(1)
  15. cap.release()
复制代码


5.修改开源库cvzone中PoseDetector中findDistance函数
  1.     def findDistance(self,p1, p2, img,dismid=False,p0=0,draw=True, r=15, t=3):
  2.         x1, y1,z1= self.lmList[p1][1:]
  3.         x2, y2,z2= self.lmList[p2][1:]
  4.         if draw:
  5.           if dismid==False:
  6.             cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), t)
  7.             cv2.circle(img, (x1, y1), r, (0, 255, 0), cv2.FILLED)
  8.             cv2.circle(img, (x2, y2), r, (0, 255, 0), cv2.FILLED)
  9.         if dismid:
  10.            x0, y0,z0= self.lmList[p0][1:]
  11.            cx, cy= (x1 + x2) // 2, (y1 + y2) // 2
  12.            cv2.line(img, (x0, y0), (cx, cy), (0, 255, 0), t)
  13.            cv2.circle(img, (x0, y0), r, (0, 255, 0), cv2.FILLED)
  14.            cv2.circle(img, (cx, cy), r, (0, 255, 0), cv2.FILLED)
  15.            length = math.hypot(cx - x0,cy - y0)
  16.         else:
  17.            length = math.hypot(x2 - x1, y2 - y1)
  18.         return length
复制代码


6.计算判断低头的HAR ThuAugust-202208049371..png

#计算判断低头的HAR
        disp0pmid=detector.findDistance(11,12,img,dismid=True,p0=0)#计算鼻子与两肩中点的距离
        disp11p12=detector.findDistance(11,12,img)#计算两肩的距离
Har=disp0pmid/disp11p12#计算Har
print(Har)
    if Har<0.45:#Har小于0.45认定过于低头
           engine.say("请不要过于低头")
           engine.runAndWait()
7.确定Har阈值
ThuAugust-202208044225..png
使用print(Har)语句,经过不断测试,查看低头与抬头中间的阈值,最终确定阈值为0.45,当Har小于0.45认定过于低头。

ThuAugust-202208044166..png
ThuAugust-202208046154..png
使用print(near)语句,经过不断测试,离桌远近的判断阈值,最终确定阈值为,当Har大于220认定离桌过近。

8.确定左右歪头的阈值
ThuAugust-202208042301..png
经过不断测试,确定左右歪头的阈值,最终向右阈值为225,如大于225为向右歪头,向右阈值为135,如小于135为向左歪头。并使用语音合成进行语音提醒。

  1. #计算倾斜角度,以判断是否向左或向右歪头
  2. angR=detector.findAngle(img,7,11,23)
  3. if angR>225:
  4.     send('a')
  5.     if (not pygame.mixer.get_busy()):
  6.         right.play()
  7. else:
  8.     angL=detector.findAngle(img,8,12,24)
  9.     if angL<135:
  10.         if (not pygame.mixer.get_busy()):
  11.         left.play()
复制代码
9.控制灯带闪烁提醒 ThuAugust-202208049037..png
将Arduino程序提前下载到,Lattepanda集成的Leonardo板中,接收Mind+程序通过串口传来的指令,控制Arduino GPIO,驱动灯带。
  1. #include <Adafruit_NeoPixel.h>
  2. #define PIN        9
  3. #define NUMPIXELS 7
  4. Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
  5. #define DELAYVAL 500
  6. char restr='c';
  7. void setup() {
  8.    pixels.begin();
  9.    pixels.clear();
  10.    pixels.show();
  11.    Serial.begin(115200);
  12. }
  13. void loop() {
  14.   
  15. if (Serial.available())
  16.    {
  17.      restr=Serial.read();
  18.      if ( restr== 'a')
  19.      {
  20.        for(int i=0; i<NUMPIXELS; i++) {
  21.        pixels.setPixelColor(i, pixels.Color(0, 150, 0));
  22.        pixels.show();  
  23.        delay(DELAYVAL);
  24.       }
  25.      }
  26.       if ( restr== 'b')
  27.      {
  28.        pixels.clear();
  29.        pixels.show();     
  30.      }
  31. }
  32. }
复制代码
下载.jpg

下载 (1).jpg

【演示视频】
【制作反思】

本项目作品虽实现部分不正确坐姿的判断,但还有多种不正确坐姿未能实现有效识别,有改进的空间。
1、装置放在正前方,由于学习课桌的遮挡,无法识别腰部以下姿态关键点,所以不能判断如翘二郎腿等不正确坐姿,所迭代作品考虑增加从侧面检测功能,以识别翘二郎腿不良坐姿进行提醒。

2、因不同年龄,不同性别等原因,在头肩横纵比上会有一定差异,所以迭代作品,会增加预识别,根据实际使用者进行阈值设定功能

3、未能实现对于人体姿态动态的识别,如抖腿等不正确坐姿,可以使用连续时间段内,腿的高度变化频率来进行判断。


R2D2  NPC

发表于 2022-8-6 20:10:36

玩的很高级了。。。。
回复

使用道具 举报

木子呢  NPC

发表于 7 天前

宋老师的作品越来越高级了!!!
回复

使用道具 举报

白凡  高级技师

发表于 7 天前

学习学习!!!
回复

使用道具 举报

俺是胡胡  初级技师

发表于 6 天前

握草,流批
回复

使用道具 举报

俺是胡胡  初级技师

发表于 前天 09:31

           
回复

使用道具 举报

俺是胡胡  初级技师

发表于 前天 09:32

                     
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail