/face_ping_pong

程序员颈椎病克星,人脸识别打乒乓球,快来一起运动吧

Primary LanguagePython

作为一个程序猿,我是这样找回我的春天的...

啊啊啊啊啊啊啊,一起开发回春神器

程序猿和程序媛朋友们,你们有脖子疼过吗?

上个月我的脖子就开始偶尔作痛,我想每个人每个月都会有那么几天不舒服,脖子痛,肚子痛这不都是小毛病吗,过几天就好了。

所以偶尔的疼痛根本就没有干扰到我用心写bug,可是我万万没想到,脖子痛的time.sleep()的时间越来越短,时不时的还头晕目眩,眼睛昏花,小手发麻

亚里士多德说过,身体不舒服千万别去问百度,否则你会丧失继续活下去的信心!

我偏偏不信。

百度之后,感觉自己的症状就是眼压升高,弄不好年纪轻轻有失明的危险。

赶紧挂个号去眼科看看吧。

见到了资深的眼科医生,医生说根据他多年的经验,你的眼没事,去拍个颈椎的片子吧。

这个表你看看。自己对照一下级别。

1级 抬头脖子痛
2级 背酸,僵硬
3级 容易落枕
4级 胳膊无力,容易麻木
5级 走路发飘,容易跑偏
6级 握笔不稳,字体变化
7级 无法拿稳筷子
8级 走路一脚深,一脚浅
9级 大小便失禁,有一些难言之隐
10级 瘫痪了,下不了床

我好像是四级....(好像还有得救哎)

瑟瑟发抖,有木有!!

DR片子证实了医生的判断。

程序猿进阶之路我是知道的,

python语言入门 —> python语言应用实践 —> python 语言高阶编程 —> python语言的科学与艺术 —> 编程之美 —> 编程之道 —> 编程之禅—>颈椎病康复指南,

现在我直接从Python语言入门,一步跨越到了最终阶段。

1603284485648

医生看了片子之后,诡异一笑,你是个程序猿吧。

没错,我是个程序猿,可是我还没到这么高的级别呀。 o(╥﹏╥)o

医生说:你这种情况我见的多了,现在的程序猿996,每天都要坐在工位上不断写bug,而这么一坐就是一天,有时候还要加班到凌晨,没有颈椎病才怪!!

我问:你有药吗?

医生说:无药可医,不过你这个病少看电脑,多打网球,羽毛球和游泳,或者经常练习抬头,慢慢就好了。

我是行动派,回到公司,我就在某平台上找到了羽毛球和游泳馆,并查询了详细价格。

1603284385041

1603284485648

1603285239076

看了价格后。 我毅然的选择了,自己动手治自己的病,

根据颈椎病的原理,我们只需要开发出来一款要需要大量控制脸部运动的程序即可。

颈椎病康复理疗器程序正式立项!

1603284485648

图像识别python稍微方便一点, 先把python给装上,双击下一步,一路双击老铁666,python就安装好了。

1603284485648

opencv是个好用的图像识别的库,那装一下把,pip install opencv-python

1603284485648 好了写个代码,打开摄像头,这样就能看到画了,嘻嘻我躲在摄像头的旁边。

import cv2
cap=cv2.VideoCapture(0)
while(cap.isOpened()):
    ret_flag, frame = cap.read()
    cv2.imshow('itheima', frame)
    k=cv2.waitKey(1)
    if k==ord('q'):
        break
cap.release()
cv2.destoryAllWindows()

1603284485648

第二步识别出来我的小脸,正好opencv带有人脸的特征文件

import cv2
# 加载人脸xml的特征文件
face_classifier = cv2.CascadeClassifier("./haarcascade_frontalface_default.xml")
cap=cv2.VideoCapture(0)
while(cap.isOpened()):
    ret_flag, frame = cap.read()
    # 将彩图转成灰度图
    frame_gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
	# 调用人脸识别的api             
    faces = face_classifier.detectMultiScale(frame_gray,1.3,3);
    for x,y,w,h in faces:
        cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)

    cv2.imshow("itheima",frame)
    k=cv2.waitKey(1)
    if k==ord('q'):
        break
cap.release()
cv2.destoryAllWindows()

一运行效果惨不忍睹,一方面是经常找不到我的脸,一方面是经常把不相干的东西当成脸识别出来。

1603293873394

没办法opencv自带的模型太差,听说mobilenet效果还行,那就用深度学习自己训练一个人脸识别的模型吧,

python tensorflow/examples/image_retraining/retrain.py \
    --image_dir ~/ml/face/data/ \
    --learning_rate=0.0001 \
    --testing_percentage=20 \
    --validation_percentage=20 \
    --train_batch_size=32 \
    --validation_batch_size=-1 \
    --flip_left_right True \
    --random_scale=30 \
    --random_brightness=30 \
    --eval_step_interval=100 \
    --how_many_training_steps=600 \
    --architecture mobilenet_2.0_224

1603284485648

嗯,看训练趋势感觉效果还可以。测试一下吧。

1603284485648 嗯,效果还行,很小的头都能识别出来了,你能看出来他俩是谁吗?

好了,那用pygame做个用头控制的打乒乓球的游戏吧。

导入pygame包,再写一些简单的逻辑代码~

pygame主要是个循环,在while里面写逻辑就可以了。

import pygame, sys #导包
from pygame.locals import * # 全局常量

# 初始化
pygame.init()

# 屏幕对象
screen = pygame.display.set_mode((400,270)) # 尺寸

# Surface对象
surf = pygame.Surface((50,50)) # 长、宽
surf.fill((255,255,255)) # 背景颜色

# Surface对象的矩形区域
rect = surf.get_rect()


# 窗口主循环
while True:
    # 遍历事件队列    
    for event in pygame.event.get():
       if event.type == KEYDOWN:           
            if event.key == K_ESCAPE: # 按下'ESC'键,终止主循环
                pygame.quit()
                sys.exit()                
    
    # 放置Surface对象
    screen.blit(surf, ((400-50)//2, (270-50)//2)) # 窗口正中
    #screen.blit(surf, rect)                      # surf的左上角
    
    # 重绘界面
    pygame.display.flip()

这点代码有点多,那我抽取出来面向对象吧,再完善一点小细节。

1603349515763

大功告成!

1603284485648

1603284485648 pingpong

工作之余,运动后果然神清气爽,感觉我的春天回来了。可以继续高效的写bug了。O(∩_∩)O哈哈~

另外想不想学opencv和python,自己动手把上面的东西写出来, star本项目,或者请留下你的联系方式。

等我们录好课程会联系你的!

img