Python+OpenCV实战之拖拽虚拟方块的实现

“Python+OpenCV实战之拖拽虚拟方块的实现”是一个非常有趣的实践项目,可以提高我们的Python编程和OpenCV图像处理技能。下面是实现该项目的攻略:

1. 准备工作

在开始项目之前,需要进行以下准备工作:

1.1 安装OpenCV

如果你还没有安装OpenCV,请通过以下命令在终端中安装:

pip3 install opencv-python

1.2 下载代码

你可以通过github上的链接克隆完整代码,使用以下命令:

git clone https://github.com/LiuXingMing/Python-OpenCV-VirtualBox.git

1.3 准备图片

在项目中,需要拖动一个虚拟的方块,因此我们需要一张包含一个实物方块的图片。你可以使用任何一张图片,只需要将实物方块的位置抠出来即可。

2. 实例演示

下面有两个示例,在这里我们将介绍如何实现这两个示例:

2.1 实例1:拖拽虚拟方块

这个示例的功能是让我们可以通过鼠标拖动一个虚拟的方块,实现拖拽的效果。

操作步骤:

  1. 进入项目文件夹,并执行以下命令:

python VirtualBox.py

  1. 在打开的窗口中,左键点击虚拟方块并拖动,即可实现拖拽效果。

代码实现:

import cv2

img = cv2.imread('物块.png')
x, y, w, h = 100, 200, 200, 200  #定义图片显示位置和大小
roi = img[y:y + h, x:x + w]  # 把图片的二维坐标 以[x,y]为顶点,[h,w]为矩阵的长度和宽度节点截出来。
cv2.namedWindow('image')
cv2.imshow('image', img)  # 显示整个图片

drag = False  # 标记是否可以开始拖拽
gx, gy = 0, 0  # 用于记录图像移动的坐标

# 鼠标事件处理函数
def mouse_event(event, x, y, flags, param):
    global gx, gy, drag
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键按下开始拖拽
        if x > (gx + 100) and x < (gx + 300) and y > (gy + 200) and y < (gy + 400):
            drag = True
            gx, gy = x - gx, y - gy
    elif event == cv2.EVENT_LBUTTONUP:  # 左键释放停止拖拽
        drag = False
    elif event == cv2.EVENT_MOUSEMOVE and drag:  # 拖拽过程中不断更新图像位置并实时显示
        gx, gy = x - gx, y - gy
    else:
        pass

# 注册鼠标事件处理函数并处理事件
cv2.setMouseCallback('image', mouse_event)
while True:
    if drag:
        img[gy:gy + 200, gx:gx + 200] = roi  # 实时更新拖拽后的坐标
    cv2.imshow('image', img)  # 实时显示图片
    if cv2.waitKey(1) & 0xFF == 27:  # 按下“ESC”键退出循环
        break

cv2.destroyAllWindows()

2.2 实例2:拖拽虚拟方块并调整大小

这个示例的功能是允许我们通过鼠标拖动虚拟方块并调整大小实现拖拽和缩放的效果。

操作步骤:

  1. 进入项目文件夹,并执行以下命令:

python VirtualBox_resize.py

  1. 在打开的窗口中,左键点击虚拟方块并拖动,可以实现拖拽效果,右键点击方块的边缘区域并拖动,可以实现调整方块大小的效果。

代码实现:

import cv2

img = cv2.imread('物块.png')
x, y, w, h = 100, 200, 200, 200  #定义图片显示位置和大小
roi = img[y:y + h, x:x + w]  # 把图片的二维坐标 以[x,y]为顶点,[h,w]为矩阵的长度和宽度节点截出来。
cv2.namedWindow('image')
cv2.imshow('image', img)  # 显示整个图片

drag = False  # 标记是否可以开始拖拽
gx, gy = 0, 0  # 用于记录图像移动的坐标
rw, rh = 200, 200  # 定义初始的图像宽高

# 鼠标事件处理函数
def mouse_event(event, x, y, flags, param):
    global gx, gy, drag, rw, rh
    if event == cv2.EVENT_LBUTTONDOWN:  # 左键按下开始拖拽
        if x > gx and x < (gx + rw) and y > gy and y < (gy + rh):
            drag = True
            gx, gy = x - gx, y - gy
        elif x > gx + rw - 20 and x < (gx + rw) and y > gy + rh - 20 and y < (gy + rh):
            drag = True
            gx, gy = x - (gx + rw), y - (gy + rh)
            rw, rh = rw + gx, rh + gy  # 按边框修改宽高
    elif event == cv2.EVENT_LBUTTONUP:  # 左键释放停止拖拽
        drag = False
    elif event == cv2.EVENT_MOUSEMOVE and drag:  # 拖拽过程中不断更新图像位置并实时显示
        gx, gy = x - gx, y - gy
    else:
        pass

# 注册鼠标事件处理函数并处理事件
cv2.setMouseCallback('image', mouse_event)
while True:
    if drag:
        img = cv2.imread('物块.png')  # 重新读取图片
        roi = img[y:y + rh, x:x + rw]  # 重新裁剪图片
        img[gy:gy + rh, gx:gx + rw] = roi  # 实时更新拖拽后的坐标
    cv2.imshow('image', img)  # 实时显示图片
    if cv2.waitKey(1) & 0xFF == 27:  # 按下“ESC”键退出循环
        break

cv2.destroyAllWindows()

以上就是“Python+OpenCV实战之拖拽虚拟方块的实现”的完整攻略及两个示例的实现过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python+OpenCV实战之拖拽虚拟方块的实现 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Yii2框架中一些折磨人的坑

    下面我就来详细讲解Yii2框架中一些折磨人的坑和解决方案。 一、数据库操作中的坑 1.1 坑:使用Query对象时,忘记使用createCommand方法生成实际的SQL语句 在Yii2框架中,我们可以使用Query对象来构建和执行SQL语句。但是,在使用Query对象时,需要注意生成实际的SQL语句时需要使用createCommand方法。如果忘记了使用c…

    人工智能概论 2023年5月25日
    00
  • 在Perl中使用Getopt::Long模块来接收用户命令行参数

    要在Perl中从命令行接收用户输入的参数,可以使用Getopt::Long模块。该模块可以轻松地解析命令行参数并为其提供选项值。下面是使用Getopt::Long模块来接收用户命令行参数的完整攻略。 安装Getopt::Long模块 首先需要确保已安装了Perl,然后可以使用CPAN模块来安装Getopt::Long模块。可以在终端或命令行窗口中输入以下命令…

    人工智能概论 2023年5月25日
    00
  • Go-RESTful实现下载功能思路详解

    Go-RESTful实现下载功能思路详解 简介 在Web应用程序中,下载功能通常是必需的功能之一。Go是一种功能强大的编程语言,使用它实现RESTful API来实现下载功能非常高效、方便和可靠。在本文中,我们将深入讨论如何使用Go-RESTful库实现下载功能。 步骤 本文将介绍三个主要步骤来实现下载功能: 定义RESTful路由 打开文件并将其发送到客户…

    人工智能概览 2023年5月25日
    00
  • 详解Pytorch+PyG实现GCN过程示例

    详解Pytorch+PyG实现GCN过程示例 这篇攻略将会详细讲解如何使用PyTorch和PyG实现图卷积网络(GCN)。我们将通过两条示例说明如何使用PyG和PyTorch来实现GCN,并对代码进行详细分析。 简介 图形数据(或称为网络数据或图形数据)由许多顶点和边组成,这些组成通常是不规则的,图形中顶点之间的拓扑关系也是不规则的。GCN是一种用于处理图形…

    人工智能概论 2023年5月25日
    00
  • 解决Pytorch中的神坑:关于model.eval的问题

    当我们在Pytorch中使用训练好的模型进行推理时,需要使用model.eval()方法将模型切换到评估模式。在这个模式下,模型中的一些操作(如dropout)会被禁用,以确保推理结果的准确性。但是,即使在模型已经切换到评估模式下,我们在数据前向传递时仍然需要加上with torch.no_grad()代码块才行。这是因为Pytorch在评估模式下仍然会跟踪…

    人工智能概论 2023年5月25日
    00
  • vue+socket.io+express+mongodb 实现简易多房间在线群聊示例

    下面我将详细讲解“vue+socket.io+express+mongodb 实现简易多房间在线群聊示例”的完整攻略,具体步骤如下: 1. 环境准备 在开始编程之前,需要先准备好必要的环境,包括: Node.js及npm包管理器 MongoDB数据库 Vue.js框架 在确认这些工具已经就绪后,接下来可以开始进行实现了。 2. 服务端实现 本示例中,我们选用…

    人工智能概论 2023年5月25日
    00
  • Python中zipfile压缩文件模块的基本使用教程

    下面是关于“Python中zipfile压缩文件模块的基本使用教程”的完整攻略。 简介 zipfile是Python标准库中的压缩文件模块,可以进行ZIP文件的创建、读取和解压缩等操作。使用zipfile模块可以方便地处理ZIP压缩包。 基本使用方法 创建ZIP文件 创建ZIP文件的方法是调用zipfile.ZipFile()类,并传入要创建的ZIP文件名和…

    人工智能概览 2023年5月25日
    00
  • Python写代码的七条重要技巧介绍

    Python是一种快速发展的编程语言,具有易学易用、开源免费等特点,越来越受到广大开发者的喜爱和青睐。本文将介绍Python写代码的七条重要技巧,让你在编写Python代码时更加得心应手。 1. 规范化的代码风格 规范化的代码风格指的是代码的缩进、空格的使用、命名规则、注释等方面的统一规范。遵循统一规范的代码,可以让代码看起来更加舒适,从而提高代码的可读性。…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部