opencv期末练习题(3)附带解析

创建黑色画板,并支持两种画图功能

python 复制代码
import math

import cv2
import numpy as np
"""
1. 创建一个黑色画板
2. 输入q退出
3. 输入m切换画图模式
    两种模式,画矩形和画圆形。
    用户按住鼠标左键到一个位置然后释放就可以画出对应的图像
"""
px, py, rx, ry = 0, 0, 0, 0  # 临时保存左键按下时的x,y坐标

drawing = False
# 绑定窗体,窗体名为image
cv2.namedWindow("image")

canvas = np.zeros((400, 400, 3))  # 创建黑色画板


def draw_shape(event, x, y, flags, param):
    global px, py, rx, ry, canvas, draw_line  # 设置全局变量,这样才能够访问方法体外部的变量
    if not drawing:
        if event == cv2.EVENT_LBUTTONDOWN:  # 判断当前是否为按下左键
            px, py = x, y  # 保存按下左键的坐标
        if event == cv2.EVENT_LBUTTONUP:
            rx, ry = x, y  # 保存释放左键的坐标
            cv2.rectangle(canvas, [px, py], [rx, ry], color=(255, 255, 255))  # 根据坐标信息,画出一个黑色的矩形
    else:
        if event == cv2.EVENT_LBUTTONDOWN:  # 如果用户按下了m键,则切换到画圆形模式
            px, py = x, y
        if event == cv2.EVENT_LBUTTONUP:
            # 计算当前释放点和上次点击的圆心距离多远
            dis = math.sqrt((x - px) ** 2 + (y - py) ** 2)  # 两点之间距离公式
            cv2.circle(canvas, center=(px, py), radius=int(dis), color=(0, 0, 255))  # 根据离圆心的距离画出圆


cv2.setMouseCallback('image', draw_shape)  # 设置opencv鼠标事件

while 1:  # 死循环等待用户
    cv2.imshow("image", canvas)  # 显示当前的画板数据
    k = cv2.waitKey(10)  # 等待10ms,判断用户的键盘数据
    if k == ord("q"):  # 如果输入q则退出程序
        break
    if k == ord('m'):  # 如果输入m则切换模型,修改drawing变量
        drawing = not drawing

这段代码使用 OpenCV 创建了一个简单的画板应用,支持矩形和圆形的绘制。用户可以按下左键拖动以绘制矩形,按下右键拖动以绘制圆形。按下 'q' 键退出程序,按下 'm' 键切换绘制模式(矩形或圆形)。

以下是代码的主要步骤:

  1. 初始化全局变量:px, py, rx, ry 用于保存左键按下和释放时的坐标,drawing 用于标记当前绘制模式。

  2. 创建一个黑色画板:canvas = np.zeros((400, 400, 3))

  3. 定义鼠标事件处理函数 draw_shape,在函数中根据事件类型和坐标信息绘制矩形或圆形。

  4. 设置鼠标事件回调函数:cv2.setMouseCallback('image', draw_shape)

  5. 进入死循环,不断显示当前画板,并等待用户的键盘输入。

  6. 如果用户按下 'q' 键,则退出程序;如果按下 'm' 键,则切换绘制模式。

这个简单的画板演示了如何使用 OpenCV 处理鼠标事件来实现基本的图形绘制功能。

相关推荐
lijianhua_97121 小时前
国内某顶级大学内部用的ai自动生成论文的提示词
人工智能
EDPJ1 小时前
当图像与文本 “各说各话” —— CLIP 中的模态鸿沟与对象偏向
深度学习·计算机视觉
蔡俊锋1 小时前
用AI实现乐高式大型可插拔系统的技术方案
人工智能·ai工程·ai原子能力·ai乐高工程
自然语1 小时前
人工智能之数字生命 认知架构白皮书 第7章
人工智能·架构
大熊背1 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
eastyuxiao2 小时前
如何在不同的机器上运行多个OpenClaw实例?
人工智能·git·架构·github·php
诸葛务农2 小时前
AGI 主要技术路径及核心技术:归一融合及未来之路5
大数据·人工智能
光影少年2 小时前
AI Agent智能体开发
人工智能·aigc·ai编程
charlee442 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测
ai生成式引擎优化技术2 小时前
TSPR-WEB-LLM-HIC (TWLH四元结构)AI生成式引擎(GEO)技术白皮书
人工智能