云天 发表于 2022-8-4 14:53:37

坐姿智能提醒器

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

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



【作品功能】




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

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

【制作元器件与材料】
1.LattePanda 拿铁熊猫

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

2.LattePanda 拿铁熊猫 IPS显示屏

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

3.高低音调节数字蓝牙功放板


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

【电路图】

【实物图】


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


从旧Mp3播放器上拆下两个喇叭


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

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

因人像在摄像头中会出现近大远不的现象,所以只使用两点间距离阈值来判断姿态是不准确的。


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



from cvzone.PoseModule import PoseDetector
import cv2
cap = cv2.VideoCapture(0)
detector = PoseDetector()
ang=180
while True:
      success, img = cap.read()
      img = detector.findPose(img)
      lmList, bboxInfo = detector.findPosition(img, bboxWithHands=False)
      if bboxInfo:
            center = bboxInfo["center"]
            cv2.circle(img, center, 5, (255, 0, 255), cv2.FILLED)
      cv2.imshow("Image", img)
      cv2.waitKey(1)
cap.release()



5.修改开源库cvzone中PoseDetector中findDistance函数

    def findDistance(self,p1, p2, img,dismid=False,p0=0,draw=True, r=15, t=3):
      x1, y1,z1= self.lmList
      x2, y2,z2= self.lmList
      if draw:
          if dismid==False:
            cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), t)
            cv2.circle(img, (x1, y1), r, (0, 255, 0), cv2.FILLED)
            cv2.circle(img, (x2, y2), r, (0, 255, 0), cv2.FILLED)
      if dismid:
         x0, y0,z0= self.lmList
         cx, cy= (x1 + x2) // 2, (y1 + y2) // 2
         cv2.line(img, (x0, y0), (cx, cy), (0, 255, 0), t)
         cv2.circle(img, (x0, y0), r, (0, 255, 0), cv2.FILLED)
         cv2.circle(img, (cx, cy), r, (0, 255, 0), cv2.FILLED)
         length = math.hypot(cx - x0,cy - y0)
      else:
         length = math.hypot(x2 - x1, y2 - y1)
      return length



6.计算判断低头的HAR

#计算判断低头的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阈值

使用print(Har)语句,经过不断测试,查看低头与抬头中间的阈值,最终确定阈值为0.45,当Har小于0.45认定过于低头。



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

8.确定左右歪头的阈值

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


#计算倾斜角度,以判断是否向左或向右歪头
angR=detector.findAngle(img,7,11,23)
if angR>225:
    send('a')
    if (not pygame.mixer.get_busy()):
      right.play()
else:
    angL=detector.findAngle(img,8,12,24)
    if angL<135:
      if (not pygame.mixer.get_busy()):
      left.play()

9.控制灯带闪烁提醒
将Arduino程序提前下载到,Lattepanda集成的Leonardo板中,接收Mind+程序通过串口传来的指令,控制Arduino GPIO,驱动灯带。

#include <Adafruit_NeoPixel.h>
#define PIN      9
#define NUMPIXELS 7
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 500
char restr='c';
void setup() {
   pixels.begin();
   pixels.clear();
   pixels.show();
   Serial.begin(115200);
}
void loop() {

if (Serial.available())
   {
   restr=Serial.read();
   if ( restr== 'a')
   {
       for(int i=0; i<NUMPIXELS; i++) {
       pixels.setPixelColor(i, pixels.Color(0, 150, 0));
       pixels.show();
       delay(DELAYVAL);
      }
   }
      if ( restr== 'b')
   {
       pixels.clear();
       pixels.show();   
   }
}
}





【演示视频】https://www.bilibili.com/video/BV1sS4y147YZ?share_source=copy_web&vd_source=98855d5b99ff76982639c5ca6ff6f528
【制作反思】

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

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

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


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

玩的很高级了。。。。

木子呢 发表于 2022-8-8 10:12:17

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

白凡 发表于 2022-8-8 20:17:49

学习学习!!!{:6_215:}

俺是胡胡 发表于 2022-8-9 11:25:48

握草,流批

俺是胡胡 发表于 2022-8-13 09:31:32

{:6_203:}         

俺是胡胡 发表于 2022-8-13 09:32:43

{:6_202:}                     

rzegkly 发表于 2022-8-18 06:55:28

很实用的案例

发表于 2022-8-18 12:13:33

这个很有意义又很实用

小企鹅 发表于 2022-8-27 09:36:16

厉害厉害

罗卡 发表于 2022-9-2 21:23:20

這項發明很有意義

CPY 发表于 2022-9-24 11:47:49

高级,而且还实用,就是难度有点高。

花生编程 发表于 2023-7-26 22:53:42

厉害厉害!!

花生编程 发表于 2023-7-26 22:54:52

这个真的好实用啊!!!赞!!

三春牛-创客 发表于 2023-7-27 22:04:44

厉害厉害

三春牛-创客 发表于 2023-7-27 22:06:41

好棒的作品!!赞赞赞!{:6_215:}{:6_209:}{:6_209:}
页: [1]
查看完整版本: 坐姿智能提醒器