返回顶部
首页 > 资讯 > 后端开发 > Python >Opencv实现眼睛控制鼠标的实践
  • 315
分享到

Opencv实现眼睛控制鼠标的实践

2024-04-02 19:04:59 315人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方法。在此项目中,每次单击鼠标时,我们都会编写代码来裁剪你们的眼睛图像。使用这些数据,我们可以反向训练模型,从你们您的

如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方法。在此项目中,每次单击鼠标时,我们都会编写代码来裁剪你们的眼睛图像。使用这些数据,我们可以反向训练模型,从你们您的眼睛预测鼠标的位置。在开始项目之前,我们需要引入第三方库。

# For monitoring WEB camera and perfORMing image minipulations
import cv2
# For performing array operations
import numpy as np
# For creating and removing directories
import os
import shutil
# For recognizing and performing actions on mouse presses
from pynput.mouse import Listener

首先让我们了解一下Pynput的Listener工作原理。pynput.mouse.Listener创建一个后台线程,该线程记录鼠标的移动和鼠标的点击。这是一个简化代码,当你们按下鼠标时,它会打印鼠标的坐标:

from pynput.mouse import Listener
def on_click(x, y, button, pressed):
"""
  Args:
    x: the x-coordinate of the mouse
    y: the y-coordinate of the mouse
    button: 1 or 0, depending on right-click or left-click
    pressed: 1 or 0, whether the mouse was pressed or released
  """
if pressed:
print (x, y)
with Listener(on_click = on_click) as listener:
  listener.join()

现在,为了实现我们的目的,让我们扩展这个框架。但是,我们首先需要编写裁剪眼睛边界框的代码。我们稍后将在on_click函数内部调用此函数。我们使用Haar级联对象检测来确定用户眼睛的边界框。你们可以在此处下载检测器文件,让我们做一个简单的演示来展示它是如何工作的:

import cv2
# Load the cascade classifier detection object
cascade = cv2.CascadeClassifier("haarcascade_eye.xml")
# Turn on the web camera
video_capture = cv2.VideoCapture(0)
# Read data from the web camera (get the frame)
_, frame = video_capture.read()
# Convert the image to grayscale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Predict the bounding box of the eyes
boxes = cascade.detectMultiScale(gray, 1.3, 10)
# Filter out images taken from a bad angle with errors
# We want to make sure both eyes were detected, and nothing else
if len(boxes) == 2:
eyes = []
for box in boxes:
    # Get the rectangle parameters for the detected eye
x, y, w, h = box
    # Crop the bounding box from the frame
eye = frame[y:y + h, x:x + w]
    # Resize the crop to 32x32
eye = cv2.resize(eye, (32, 32))
    # Normalize
eye = (eye - eye.min()) / (eye.max() - eye.min())
    # Further crop to just around the eyeball
eye = eye[10:-10, 5:-5]
    # Scale between [0, 255] and convert to int datatype
eye = (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):
  minn, maxx = x.min(), x.max()
return (x - minn) / (maxx - minn)

这是我们的眼睛裁剪功能。如果发现眼睛,它将返回图像。否则,它返回None:

def scan(image_size=(32, 32)):
_, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
boxes = cascade.detectMultiScale(gray, 1.3, 10)
if len(boxes) == 2:
eyes = []
for box in boxes:
x, y, w, h = box
eye = frame[y:y + h, x:x + w]
eye = cv2.resize(eye, image_size)
eye = normalize(eye)
eye = eye[10:-10, 5:-5]
eyes.append(eye)
return (np.hstack(eyes) * 255).astype(np.uint8)
else:
return None

现在,让我们来编写我们的自动化,该自动化将在每次按下鼠标按钮时运行。(假设我们之前已经root在代码中将变量定义为我们要存储图像的目录):

def on_click(x, y, button, pressed):
# If the action was a mouse PRESS (not a RELEASE)
if pressed:
# Crop the eyes
    eyes = scan()
# If the function returned None, something went wrong
if not eyes is None:
# Save the image
      filename = root + "{} {} {}.jpeg".format(x, y, button)
      cv2.imwrite(filename, eyes)

现在,我们可以回忆起pynput的实现Listener,并进行完整的代码实现:

import cv2
import numpy as np
import os
import shutil
from pynput.mouse import Listener
 
 
root = input("Enter the directory to store the images: ")
if os.path.isdir(root):
  resp = ""
while not resp in ["Y", "N"]:
    resp = input("This directory already exists. If you continue, the contents of the existing directory will be deleted. If you would still like to proceed, enter [Y]. Otherwise, enter [N]: ")
if resp == "Y": 
    shutil.rmtree(root)
else:
    exit()
os.mkdir(root)
 
 
# Normalization helper function
def normalize(x):
  minn, maxx = x.min(), x.max()
return (x - minn) / (maxx - minn)
 
 
# Eye cropping function
def scan(image_size=(32, 32)):
  _, frame = video_capture.read()
  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  boxes = cascade.detectMultiScale(gray, 1.3, 10)
if len(boxes) == 2:
    eyes = []
for box in boxes:
      x, y, w, h = box
      eye = frame[y:y + h, x:x + w]
      eye = cv2.resize(eye, image_size)
      eye = normalize(eye)
      eye = eye[10:-10, 5:-5]
      eyes.append(eye)
return (np.hstack(eyes) * 255).astype(np.uint8)
else:
return None
 
 
def on_click(x, y, button, pressed):
# If the action was a mouse PRESS (not a RELEASE)
if pressed:
# Crop the eyes
    eyes = scan()
# If the function returned None, something went wrong
if not eyes is None:
# Save the image
      filename = root + "{} {} {}.jpeg".format(x, y, button)
      cv2.imwrite(filename, eyes)
 
 
cascade = cv2.CascadeClassifier("haarcascade_eye.xml")
video_capture = cv2.VideoCapture(0)
 
 
with Listener(on_click = on_click) as listener:
  listener.join()

运行此命令时,每次单击鼠标(如果两只眼睛都在视线中),它将自动裁剪网络摄像头并将图像保存到适当的目录中。图像的文件名将包含鼠标坐标信息,以及它是右击还是左击。

这是一个示例图像。在此图像中,我在分辨率为2560x1440的监视器上在坐标(385,686)上单击鼠标左键:

a9de52a07fcd0f39f7483521acf1c9a4.png

级联分类器非常准确,到目前为止,我尚未在自己的数据目录中看到任何错误。现在,让我们编写用于训练神经网络的代码,以给定你们的眼睛图像来预测鼠标的位置。

import numpy as np
import os
import cv2
import pyautogui
from Tensorflow.keras.models import *
from tensorflow.keras.layers import *
from tensorflow.keras.optimizers import *

现在,让我们添加级联分类器:

cascade = cv2.CascadeClassifier("haarcascade_eye.xml")
video_capture = cv2.VideoCapture(0)

正常化:

def normalize(x):
  minn, maxx = x.min(), x.max()
return (x - minn) / (maxx - minn)

捕捉眼睛:

def scan(image_size=(32, 32)):
_, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
boxes = cascade.detectMultiScale(gray, 1.3, 10)
if len(boxes) == 2:
eyes = []
for box in boxes:
x, y, w, h = box
eye = frame[y:y + h, x:x + w]
eye = cv2.resize(eye, image_size)
eye = normalize(eye)
eye = eye[10:-10, 5:-5]
eyes.append(eye)
return (np.hstack(eyes) * 255).astype(np.uint8)
else:
return None

让我们定义显示器的尺寸。你们必须根据自己的计算机屏幕的分辨率更改以下参数:

# Note that there are actually 2560x1440 pixels on my screen
# I am simply recording one less, so that when we divide by these
# numbers, we will normalize between 0 and 1. Note that mouse
# coordinates are reported starting at (0, 0), not (1, 1)
width, height = 2559, 1439

现在,让我们加载数据(同样,假设你们已经定义了root)。我们并不在乎是单击鼠标右键还是单击鼠标左键,因为我们的目标只是预测鼠标的位置:

filepaths = os.listdir(root)
X, Y = [], []
for filepath in filepaths:
x, y, _ = filepath.split(' ')
x = float(x) / width
y = float(y) / height
X.append(cv2.imread(root + filepath))
Y.append([x, y])
X = np.array(X) / 255.0
Y = np.array(Y)
print (X.shape, Y.shape)

让我们定义我们的模型架构

model = Sequential()
model.add(Conv2D(32, 3, 2, activation = 'relu', input_shape = (12, 44, 3)))
model.add(Conv2D(64, 2, 2, activation = 'relu'))
model.add(Flatten())
model.add(Dense(32, activation = 'relu'))
model.add(Dense(2, activation = 'sigmoid'))
model.compile(optimizer = "adam", loss = "mean_squared_error")
model.summary()

这是我们的摘要:

6189e93c114d439cfaf15c9d20f8140a.png

接下来的任务是训练模型。我们将在图像数据中添加一些噪点:

epochs = 200
for epoch in range(epochs):
  model.fit(X, Y, batch_size = 32)

现在让我们使用我们的模型来实时移动鼠标。请注意,这需要大量数据才能正常工作。但是,作为概念证明,你们会注意到,实际上只有200张图像,它确实将鼠标移到了你们要查看的常规区域。当然,除非你们拥有更多的数据,否则这是不可控的。

while True:
  eyes = scan()
if not eyes is None:
      eyes = np.expand_dims(eyes / 255.0, axis = 0)
      x, y = model.predict(eyes)[0]
      pyautogui.moveTo(x * width, y * height)

这是一个概念证明的例子。请注意,在进行此屏幕录像之前,我们只训练了很少的数据。这是我们的鼠标根据眼睛自动移动到终端应用程序窗口的视频。就像我说的那样,这很容易,因为数据很少。有了更多的数据,它有望稳定到足以以更高的特异性进行控制。仅用几百张图像,你们就只能将其移动到注视的整个区域内。另外,如果在整个数据收集过程中,你们在屏幕的特定区域(例如边缘)都没有拍摄任何图像,则该模型不太可能在该区域内进行预测。

到此这篇关于OpenCV实现眼睛控制鼠标的实践的文章就介绍到这了,更多相关Opencv 眼睛控制鼠标内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Opencv实现眼睛控制鼠标的实践

本文链接: https://lsjlt.com/news/139543.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Opencv实现眼睛控制鼠标的实践
    如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方法。在此项目中,每次单击鼠标时,我们都会编写代码来裁剪你们的眼睛图像。使用这些数据,我们可以反向训练模型,从你们您的...
    99+
    2024-04-02
  • Opencv实现眼睛控制鼠标的案例分析
    这篇文章主要讲解了“Opencv实现眼睛控制鼠标的案例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Opencv实现眼睛控制鼠标的案例分析”吧!在开始项目之前,我们需要引入第三方库。#&...
    99+
    2023-06-29
  • 基于python3+OpenCV实现人脸和眼睛识别
    基于python3+OpenCV的人脸和眼睛识别,供大家参考,具体内容如下 一、OpenCV人脸检测的xml文件下载 人脸检测和眼睛检测要用到haarcascade_eye.xml和...
    99+
    2024-04-02
  • 用Python实现控制电脑鼠标
    目录一、序言二、配置环境二、鼠标控制1、获取鼠标位置函数以及测试源码2、控制鼠标左击/右击/双击函数以及测试源码3、控制鼠标移动/拖动4、控制鼠标滚轮滚动总结一、序言 使用pytho...
    99+
    2024-04-02
  • C++实现鼠标控制的黑框象棋
    本文实例为大家分享了C++实现鼠标控制的黑框象棋的具体代码,供大家参考,具体内容如下 该象棋小游戏的特色 有颜色标注出 红方和绿方 可以用鼠标控制 颜色原理 直接调用用Windows...
    99+
    2024-04-02
  • opencv锁定鼠标定位的实现
    目录控制鼠标鼠标事件:创建方法完整学习代码控制鼠标 opencv允许我们对窗口的鼠标动作做出响应: setMouseCallback(winname,callback,userdat...
    99+
    2023-02-16
    opencv锁定鼠标定位 opencv 鼠标定位
  • JavaScript实现鼠标控制自由移动的窗口
    本文实例为大家分享了JavaScript实现鼠标控制自由窗口的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html lang...
    99+
    2024-04-02
  • C++如何实现鼠标控制的黑框象棋
    这篇文章将为大家详细讲解有关C++如何实现鼠标控制的黑框象棋,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文实例为大家分享了C++实现鼠标控制的黑框象棋的具体代码,该象棋小游戏的特色有颜色标注出 红方和...
    99+
    2023-06-15
  • Python利用PyAutoGUI模块实现控制鼠标键盘
    目录前言1、鼠标的相关控制2、键盘的相关控制前言 PyAutoGUI是一个简单易用,跨平台的可以模拟键盘鼠标进行自动操作的python库。 使用pip的方式安装pyautogui模块...
    99+
    2024-04-02
  • 基于python+opencv调用电脑摄像头实现实时人脸眼睛以及微笑识别
    本文教大家调用电脑摄像头进行实时人脸+眼睛识别+微笑识别,供大家参考,具体内容如下 一、调用电脑摄像头进行实时人脸+眼睛识别 # 调用电脑摄像头进行实时人脸+眼睛识别,可直接复制...
    99+
    2024-04-02
  • Qt实现实时鼠标绘制图形
    目录功能实现1:记录图形第一个绘制点2:实时获取鼠标最新位置并绘图3:释放绘制点,绘制最终图形总结上一章节介绍了关于QGraphicsView的基础讲解,以及简单的类图创建,由上一章...
    99+
    2024-04-02
  • jQuery怎么实现鼠标滚轮控制图片缩放
    本文小编为大家详细介绍“jQuery怎么实现鼠标滚轮控制图片缩放”,内容详细,步骤清晰,细节处理妥当,希望这篇“jQuery怎么实现鼠标滚轮控制图片缩放”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,...
    99+
    2024-04-02
  • Python如何利用PyAutoGUI模块实现控制鼠标键盘
    这篇文章主要介绍“Python如何利用PyAutoGUI模块实现控制鼠标键盘”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python如何利用PyAutoGUI模块实现控制鼠标键盘”文章能帮助大家解...
    99+
    2023-07-02
  • Python+OpenCV实现鼠标画瞄准星的方法详解
    目录函数说明cv2.circle()cv2.line()简单的例子利用鼠标回调函数画瞄准星所谓瞄准星指的是一个圆圈加一个圆圈内的十字线,就像玩射击游戏狙击枪开镜的样子一样。这里并不是...
    99+
    2024-04-02
  • C#实现绘制鼠标的示例代码
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() ...
    99+
    2022-12-23
    C#绘制鼠标 C# 鼠标
  • jQuery实现鼠标拖动div改变位置、大小的实践
           实现类似windows窗体的效果,在中间拖动改变div位置,在边缘拖动改变div大小,鼠标在相应的...
    99+
    2024-04-02
  • Qt如何实现实时鼠标绘制图形
    小编给大家分享一下Qt如何实现实时鼠标绘制图形,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!展示效果功能实现想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件:按下、移动、释放那么具体实现实时绘制矩形框的核心流程是什么呢?鼠...
    99+
    2023-06-29
  • jQuery如何实现鼠标滚轮控制图片缩放功能
    这篇文章主要为大家展示了“jQuery如何实现鼠标滚轮控制图片缩放功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现鼠标滚轮控制图片缩放功能...
    99+
    2024-04-02
  • JavaScript怎么实现鼠标滚轮控制页面图片切换
    这篇文章主要介绍“JavaScript怎么实现鼠标滚轮控制页面图片切换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript怎么实现鼠标滚轮控制页面图片...
    99+
    2024-04-02
  • python opencv鼠标交互操作的实用指南
    目录前言cv2.setMouseCallback(windowName, onMouse [, param])鼠标回调函数:onMouse(event, x, y, flags, p...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作