前言
不知道大家有多久没有对那些身边一直陪伴支持你的人、照顾你的人说一句 “I LOVE YOU”。可能慢慢相处都会把对方对你的付出当作理所应当,忘了最开始时挂在嘴边的那些甜言蜜语。又或者正在追求幸福的朋友们,可能已经在网上学到了各种土味情话、撩妹套路,但是却忽视了行动。今天,我们就一起为那个他/她动手打出这句"I LOVE YOU"吧。
实现
实现思路
首先去GitHub上查看cvzone,这是一个基于opencv和Mediapipe制作的图像处理以及一些人工智能功能的cv库。
查看它的示例代码,其中含有识别手部行为以及手指距离等等功能,这和我们今天想做的正好合适
准备阶段
安装好opencv、cvzone、mediapipe等库,有可能用清华源下载会出错,这里我用的是豆瓣源进行安装,以mediapipe为例,安装代码为pip install mediapipe -i https://pypi.douban.com/simple/
安装好之后,分析github中给出的示例代码
从上面的代码可以看到,我们可以通过HandDetector得到手部动作,并且还能得到两根手指之间的距离。距离是一个非常重要的问题,涉及到后面识别点击动作的灵敏度
开始动手
import cv2
from cvzone.HandTrackingModule import HandDetector
from pynput.keyboard import Controller
import time
cap=cv2.VideoCapture(0)
cap.set(3,1280)
cap.set(4,720)
detector=HandDetector(detectionCon=0.8)
keys=[
["Q","W","E","R","T","Y","U","I","O","P"],
["A","S","D","F","G","H","J","K","L",";"],
["Z","X","C","V","B","N","M",",",".","/"]
]
keyboard=Controller()
def drawall(img,buttons):
for button in buttons:
x, y = button.pos
w, h = button.size
cv2.rectangle(img, button.pos, (x + w, y + h), (255, 0, 255), cv2.FILLED)
cv2.putText(img,button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
return img
class Button():
def __init__(self,pos,text,size=[85,85]):
self.pos=pos
self.size=size
self.text=text
button_list=[]
for i in range(len(keys)):
for j,key in enumerate(keys[i]):
button_list.append(Button([100*j+50,100*i+50],key))
Text=""
while True:
sucess,img=cap.read()
img=detector.findHands(img)
lmlist,bboxInfo=detector.findPosition(img)
img=drawall(img,button_list)
if lmlist:
for button in button_list:
x,y=button.pos
w,h=button.size
if x<lmlist[8][0]<x+w and y<lmlist[8][1]<y+h:
cv2.rectangle(img, button.pos, (x + w, y + h), (175,0,175), cv2.FILLED)
cv2.putText(img, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
l,_,_=detector.findDistance(8,12,img,draw=False)
if l<45:
keyboard.press(button.text)
cv2.rectangle(img, button.pos, (x + w, y + h), (0,255,0), cv2.FILLED)
cv2.putText(img, button.text, (x + 20, y + 65), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
Text+=button.text
time.sleep(0.2)
cv2.rectangle(img, (50,350), (700, 450), (175, 0,175), cv2.FILLED)
cv2.putText(img, Text, (60,430), cv2.FONT_HERSHEY_PLAIN, 5, (255, 255, 255), 5)
cv2.imshow("Image",img)
cv2.waitKey(1)
结果
首先食指选择到按键,然后合拢食指中指作为点击行为
结束
第一次玩这个,需要慢慢掌握距离,简单的"I LOVE YOU"可能要打上十几分钟,手酸是很正常的。但是更多的时候我们需要思考对那些所值得的人是否存在一些亏欠?或者说太多只停留于嘴边,从来没去试着完成那些承诺。对所爱所值得的人,今后多用行为表达love吧。
|