python 基于opencv 实现一个鼠标绘图小程序

下面我将为您详细讲解“python基于opencv实现一个鼠标绘图小程序”的完整攻略。

简介

本文介绍如何使用Python和OpenCV库来实现一个简单的鼠标绘图小程序。主要包含以下步骤:

  1. 创建窗口
  2. 绑定鼠标事件
  3. 绘制图形
  4. 退出程序

创建窗口

首先需要导入OpenCV库并创建一个窗口。可以使用cv2.namedWindow()函数来创建一个窗口,并指定窗口的名称和大小。

import cv2

# 创建窗口并设置名称和大小
cv2.namedWindow("Mouse Drawing")
cv2.resizeWindow("Mouse Drawing", 640, 480)

# 显示窗口
cv2.imshow("Mouse Drawing", img)

绑定鼠标事件

接下来,需要设置鼠标事件。OpenCV提供了cv2.setMouseCallback()函数来设置鼠标事件。可以使用以下代码来设置一个鼠标点击事件。

# 定义鼠标事件处理函数
def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        # 绘制圆形
        cv2.circle(img, (x, y), 25, (0, 0, 255), -1)

# 绑定鼠标事件处理函数
cv2.setMouseCallback("Mouse Drawing", draw_circle)

以上代码定义了一个鼠标事件处理函数draw_circle(),用于在窗口中绘制圆形。使用cv2.setMouseCallback()函数将draw_circle()绑定到Mouse Drawing窗口的鼠标事件中。

绘制图形

现在已经成功绑定了鼠标事件,下一步是在窗口中实现绘制图形功能。此处以绘制圆形为例。

这里使用cv2.circle()函数来绘制圆形。在鼠标事件处理函数中调用该函数并传递所需参数。

# 定义鼠标事件处理函数
def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        # 绘制圆形
        cv2.circle(img, (x, y), 25, (0, 0, 255), -1)

# 绑定鼠标事件处理函数
cv2.setMouseCallback("Mouse Drawing", draw_circle)

以上代码当鼠标左键按下时,在img图像上绘制一个半径为25的红色圆形。

退出程序

当完成绘图后,需要按ESC键退出程序。使用cv2.waitKey()函数来等待用户按下键盘上的某个键。

while True:
    cv2.imshow("Mouse Drawing", img)
    if cv2.waitKey(20) & 0xFF == 27:
        break

# 关闭窗口
cv2.destroyAllWindows()

以上代码在一个无限循环中等待用户按下键盘上的某个键。当用户按下ESC键时,关闭窗口并释放内存。

示例

下面是两个示例,第一个示例演示如何在图像中绘制直线,第二个示例演示如何在图像中绘制矩形。

示例1:绘制直线

import cv2

# 创建窗口并设置名称和大小
cv2.namedWindow("Mouse Drawing")
cv2.resizeWindow("Mouse Drawing", 640, 480)

# 创建一张空白图像
img = cv2.imread("test.jpg")
img = cv2.resize(img, (640, 480))

# 定义鼠标事件处理函数
def draw_line(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        # 设置起点
        cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
        param["start_point"] = (x, y)
    elif event == cv2.EVENT_LBUTTONUP:
        # 设置终点
        cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
        param["end_point"] = (x, y)
        # 绘制直线
        cv2.line(img, param["start_point"], param["end_point"], (0, 255, 0), 2)

# 绑定鼠标事件处理函数
cv2.setMouseCallback("Mouse Drawing", draw_line, {"start_point": None, "end_point": None})

# 循环显示图像,按ESC键退出程序
while True:
    cv2.imshow("Mouse Drawing", img)
    if cv2.waitKey(20) & 0xFF == 27:
        break

# 关闭窗口
cv2.destroyAllWindows()

示例2:绘制矩形

import cv2

# 创建窗口并设置名称和大小
cv2.namedWindow("Mouse Drawing")
cv2.resizeWindow("Mouse Drawing", 640, 480)

# 创建一张空白图像
img = cv2.imread("test.jpg")
img = cv2.resize(img, (640, 480))

# 定义鼠标事件处理函数
def draw_rectangle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        # 设置起点
        cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
        param["start_point"] = (x, y)
    elif event == cv2.EVENT_LBUTTONUP:
        # 设置终点
        cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
        param["end_point"] = (x, y)
        # 绘制矩形
        cv2.rectangle(img, param["start_point"], param["end_point"], (0, 255, 0), 2)

# 绑定鼠标事件处理函数
cv2.setMouseCallback("Mouse Drawing", draw_rectangle, {"start_point": None, "end_point": None})

# 循环显示图像,按ESC键退出程序
while True:
    cv2.imshow("Mouse Drawing", img)
    if cv2.waitKey(20) & 0xFF == 27:
        break

# 关闭窗口
cv2.destroyAllWindows()

以上就是“python基于opencv实现一个鼠标绘图小程序”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 基于opencv 实现一个鼠标绘图小程序 - Python技术站

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

相关文章

  • Python线程详解

    Python线程详解攻略 前言 多线程是一种常用的并发编程方式,在Python中也有相应的模块支持多线程。本攻略将从以下几个方面对Python线程进行详细的讲解。 线程的基本概念 Python中的多线程模块(threading) 线程的生命周期 线程锁的概念 线程的同步与阻塞 线程的基本概念 线程是操作系统能够进行运算调度的最小单位。一个进程可以拥有多个线程…

    python 2023年5月13日
    00
  • pip报错“ModuleNotFoundError: No module named ‘pip._vendor.appdirs’”怎么处理?

    当使用pip安装Python包时,可能会遇到“ModuleNotFoundError: No module named ‘pip._vendor.appdirs’”错误。这个错误通常是由以下原因之一引起的: pip安装目录缺少必要的文件:如果您的pip安装目录缺少必要的文件,则可能会出现此错误。在这种情况下,需要重新安装pip。 pip版本过低:如果您的pi…

    python 2023年5月4日
    00
  • 对python中的 os.mkdir和os.mkdirs详解

    当我们写 Python 程序时,可能会需要创建文件夹,Python 标准库中的 os 包提供了两种创建文件夹的函数:os.mkdir 和 os.mkdirs。 os.mkdir 和 os.mkdirs 的区别 os.mkdir(path):只能创建单级目录,如果要创建多级目录则会抛出 OSError 异常; os.mkdirs(path, mode=0o77…

    python 2023年6月2日
    00
  • 基于python实现井字棋小游戏

    基于python实现井字棋小游戏完整攻略 1. 概述 本攻略将指导您如何使用python编写一个简单的井字棋小游戏。 2. 准备工作 在编写本游戏前,您需要安装Python 3,并安装该游戏所需的库,其中包括: tkinter: 用于创建游戏图形界面 Pillow: 用于对图形进行处理 您可以使用以下命令安装这些库: pip install tkinter …

    python 2023年5月19日
    00
  • Python实现随机生成有效手机号码及身份证功能示例

    下面我将为你详细讲解“Python实现随机生成有效手机号码及身份证功能示例”的攻略。 1. 生成有效手机号码 步骤一:导入 Python 的 random 和 re 模块 在 Python 中生成随机号码,需要使用 random 模块生成随机数。而在生成有效手机号码时,需要用到正则表达式来限制号码的格式。因此,需要导入 Python 的 random 和 r…

    python 2023年6月3日
    00
  • Python的Matplotlib库图像复现学习

    下面是Python的Matplotlib库图像复现学习的完整攻略: 前言 Matplotlib是Python中用于绘制高质量图形的2D库,它可以帮助我们进行数据可视化和图形绘制。本文将介绍如何通过Matplotlib库学习复现图像。 准备工作 在学习Matplotlib库图像复现前,我们需要准备以下工具和知识: Python环境:Matplotlib库是Py…

    python 2023年6月6日
    00
  • python函数返回多个值的示例方法

    下面是关于Python函数返回多个值的完整攻略: 方法一:使用元组或列表 Python中的元组或列表类型可以用于存储多个值,因此可以通过在函数中返回元组或列表,来实现返回多个值的功能。 示例一:使用元组返回多个值 下面的代码演示了如何使用元组返回多个值: def statistics(numbers): min_num = min(numbers) max_…

    python 2023年6月5日
    00
  • Python 元组拆包示例(Tuple Unpacking)

    当我们从函数或语句返回多个值时,Python 通常返回它们作为元组。元组拆包是一种将元组的值分配给多个变量的方法。在这个过程中,元组中的每个项目都分配给一个变量。元组拆包非常有用,它可以让你从函数中返回或处理多个值非常容易。 元组拆包语法非常简单。只需将元组中的每个项目赋值给相应的变量即可。我们来看几个示例说明: 示例一:基本用法 # 定义一个示例元组 pe…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部