opencv 鼠标画线,opencv识别眼睛
本文主要介绍了中文版实现眼睛控制鼠标的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方法。在此项目中,每次单击鼠标时,我们都会编写代码来裁剪你们的眼睛图像。使用这些数据,我们可以反向训练模型,从你们您的眼睛预测鼠标的位置。在开始项目之前,我们需要引入第三方库。
#用于监控网络摄像头和执行图像填充
导入cv2
#用于执行数组操作
将数组作为铭牌导入
#用于创建和删除目录
导入操作系统
导入技能
#用于识别和执行鼠标按压动作
从pynput.mouse导入监听器
首先让我们了解一下Pynput的听众工作原理pynput.mouse.Listener创建一个后台线程,该线程记录鼠标的移动和鼠标的点击。这是一个简化代码,当你们按下鼠标时,它会打印鼠标的坐标:
从pynput.mouse导入监听器
定义on_click(x,y,按钮,按下):
Args:
鼠标的x坐标
y:鼠标的y坐标
一或0,取决于右键单击或左键单击
按下: 1或0,鼠标是按下还是松开
如果按下:
打印(x,y)
使用监听器(点击=点击)作为监听器:
listener.join()
现在,为了实现我们的目的,让我们扩展这个框架。但是,我们首先需要编写裁剪眼睛边界框的代码。我们稍后将在点击时函数内部调用此函数。我们使用[气]哈雾(苏格兰东部、英格兰东北部一种湿冷海雾)级联对象检测来确定用户眼睛的边界框。你们可以在此处下载检测器文件,让我们做一个简单的演示来展示它是如何工作的:
导入cv2
#加载级联分类器检测对象
级联=cv2 .级联分类器( Haar cascade _ eye。XML’)
#打开网络摄像头
视频_捕捉=cv2 .视频捕获(0)
#从网络摄像头读取数据(获取帧)
_,frame=video_capture.read()
#将图像转换为灰度
gray=cv2.cvtColor(帧,cv2 .COLOR_BGR2GRAY)
#预测眼睛的边界框
方框=级联。检测多尺度(灰色,1.3,10)
#过滤掉从错误角度拍摄的图像
#我们要确保两只眼睛都被检测到,别无其他
if len(box)=2:
眼睛=[]
对于箱:中的箱子
#获取检测到的眼睛的矩形参数
x,y,w,h=框
#从框架中裁剪边界框
eye=frame[y:y h,x:x w]
#将裁剪尺寸调整为32x32
eye=cv2.resize(eye,(32,32))
#正常化
眼=(眼-眼。min())/(眼。max()-eye。min())
#进一步修剪至眼球周围
眼睛=眼睛[10:-10,5:-5]
#在[0,255]之间缩放并转换为(同Internationalorganizations)国际组织数据类型
蛋黄
e = (eye * 255).astype(np.uint8)
# Add the current eye to the list of 2 eyes
eyes.append(eye)
# Concatenate the two eye images into one
eyes = np.hstack(eyes)
现在,让我们使用此知识来编写用于裁剪眼睛图像的函数。首先,我们需要一个辅助函数来进行标准化:
def normalize(x):
这是我们的眼睛裁剪功能。如果发现眼睛,它将返回图像。否则,它返回None:
def scan(image_size=(32, 32)):
现在,让我们来编写我们的自动化,该自动化将在每次按下鼠标按钮时运行。(假设我们之前已经root在代码中将变量定义为我们要存储图像的目录):
def on_click(x, y, button, pressed):
现在,我们可以回忆起pynput的实现Listener,并进行完整的代码实现:
import cv2
运行此命令时,每次单击鼠标(如果两只眼睛都在视线中),它将自动裁剪网络摄像头并将图像保存到适当的目录中。图像的文件名将包含鼠标坐标信息,以及它是右击还是左击。
这是一个示例图像。在此图像中,我在分辨率为2560x1440的监视器上在坐标(385,686)上单击鼠标左键:
级联分类器非常准确,到目前为止,我尚未在自己的数据目录中看到任何错误。现在,让我们编写用于训练神经网络的代码,以给定你们的眼睛图像来预测鼠标的位置。
import numpy as np
现在,让我们添加级联分类器:
cascade = cv2.CascadeClassifier("haarcascade_eye.xml")
正常化:
def normalize(x):
捕捉眼睛:
def scan(image_size=(32, 32)):
让我们定义显示器的尺寸。你们必须根据自己的计算机屏幕的分辨率更改以下参数:
# Note that there are actually 2560x1440 pixels on my screen
现在,让我们加载数据(同样,假设你们已经定义了root)。我们并不在乎是单击鼠标右键还是单击鼠标左键,因为我们的目标只是预测鼠标的位置:
filepaths = os.listdir(root)
让我们定义我们的模型架构:
model = Sequential()
这是我们的摘要:
接下来的任务是训练模型。我们将在图像数据中添加一些噪点:
epochs = 200
现在让我们使用我们的模型来实时移动鼠标。请注意,这需要大量数据才能正常工作。但是,作为概念证明,你们会注意到,实际上只有200张图像,它确实将鼠标移到了你们要查看的常规区域。当然,除非你们拥有更多的数据,否则这是不可控的。
while True:
这是一个概念证明的例子。请注意,在进行此屏幕录像之前,我们只训练了很少的数据。这是我们的鼠标根据眼睛自动移动到终端应用程序窗口的视频。就像我说的那样,这很容易,因为数据很少。有了更多的数据,它有望稳定到足以以更高的特异性进行控制。仅用几百张图像,你们就只能将其移动到注视的整个区域内。另外,如果在整个数据收集过程中,你们在屏幕的特定区域(例如边缘)都没有拍摄任何图像,则该模型不太可能在该区域内进行预测。
到此这篇关于Opencv实现眼睛控制鼠标的实践的文章就介绍到这了,更多相关Opencv 眼睛控制鼠标内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。