OpenCV笔记2:鼠标事件实现绘制直线、矩阵、曲线

OpenCV

鼠标事件

  1. 创建窗口
  2. 设置窗口大小
  3. 鼠标事件监听
    • 判断事件更新起始点和终点
    • 绘制线
    • 显示图片
  4. 打开背景图
"""
鼠标事件
down
up
move
"""
import cv2
import numpy as npWINNAME = 'DRAWBOARD'
st_point = (-1, -1)
end_point = (-1, -1)def drawLine(event, x, y, flags, param):global st_point, end_pointimg_copy = bg_img.copy()if event == cv2.EVENT_LBUTTONDOWN:print('EVENT_LBUTTONDOWN', event, x, y, flags, param)st_point = (x, y)if event == cv2.EVENT_MOUSEMOVE and flags:end_point = (x, y)cv2.line(img_copy, st_point, end_point, color=(0, 0, 255), thickness=2)cv2.imshow(WINNAME, img_copy)if event == cv2.EVENT_LBUTTONUP:print('EVENT_LBUTTONUP', event, x, y, flags, param)end_point = (x, y)# 绘制线# 起始点 终点cv2.line(bg_img, st_point, end_point, color=(0, 0, 255), thickness=2)cv2.imshow(WINNAME, bg_img)def drawRectangle(event, x, y, flags, param):global st_point, end_pointimg_copy = bg_img.copy()if event == cv2.EVENT_LBUTTONDOWN:print('EVENT_LBUTTONDOWN', event, x, y, flags, param)st_point = (x, y)if event == cv2.EVENT_MOUSEMOVE and flags:end_point = (x, y)cv2.rectangle(img_copy, st_point, end_point, color=(0, 0, 255), thickness=2)cv2.imshow(WINNAME, img_copy)if event == cv2.EVENT_LBUTTONUP:print('EVENT_LBUTTONUP', event, x, y, flags, param)end_point = (x, y)# 绘制线# 起始点 终点cv2.rectangle(bg_img, st_point, end_point, color=(0, 0, 255), thickness=2)cv2.imshow(WINNAME, bg_img)def drawPolylines(event, x, y, flags, param):global st_point, end_pointif event == cv2.EVENT_LBUTTONDOWN:print('EVENT_LBUTTONDOWN', event, x, y, flags, param)st_point = (x, y)end_point = st_pointif event == cv2.EVENT_MOUSEMOVE and flags:last_x, last_y = st_point, end_pointst_point = end_pointend_point = (x, y)print('EVENT_MOUSEMOVE', event, x, y, flags, param)pts = np.array([last_x, last_y, st_point, end_point])cv2.polylines(bg_img, [pts], isClosed=False, color=(0, 0, 255), thickness=2)cv2.imshow(WINNAME, bg_img)if event == cv2.EVENT_LBUTTONUP:print('EVENT_LBUTTONUP', event, x, y, flags, param)last_x, last_y = st_point, end_pointst_point = end_pointend_point = (x, y)# 绘制线# 起始点 终点pts = np.array([last_x, last_y, st_point, end_point])cv2.polylines(bg_img, [pts], isClosed=False, color=(0, 0, 255), thickness=2)cv2.imshow(WINNAME, bg_img)def callBack(event, x, y, flags, param):# drawLine(event, x, y, flags, param)# drawRectangle(event, x, y, flags, param)drawPolylines(event, x, y, flags, param)if __name__ == '__main__':# 创建窗口cv2.namedWindow(WINNAME, cv2.WINDOW_NORMAL)# 设置窗口大小cv2.resizeWindow(WINNAME, 360, 360)# 鼠标事件的监听# 参数1 事件监听的窗口名称# 参数2 函数名称 用于回调使用cv2.setMouseCallback(WINNAME, callBack, param='hello')# 打开背景图bg_img = cv2.imread('snower.jpg')cv2.imshow(WINNAME, bg_img)cv2.waitKey(0)cv2.destroyAllWindows()

鼠标绘制直线

20240220174152_rec_.gif

鼠标绘制矩形

20240220174112_rec_.gif

鼠标绘制曲线

20240220173954_rec_.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/261114.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#,洗牌问题(Card Shuffle Problem)的算法与源代码

1 洗牌问题(Card Shuffle Problem) 洗牌问题(Card Shuffle Problem)的基本描述 你有 100 张牌,从 1 到 100。 你把它们分成 k 堆,然后按顺序收集回来。 例如,如果您将它们分成 4 堆&#xff0…

从源代码安装 rocSOLVER 并 调试 rocSOLVER 在 Ubuntu 22.04 平台

0, 下载并编译 rocBLAS 的调试版本 sudo apt install python3.10-venv sudo apt install libmsgpack-dev sudo pip install joblibgit clone --recursive https://github.com/ROCm/rocBLAS.git $ cd rocBLAS/ $ ./install.sh -i -g构建时间也不短 1,下载并编译 roc…

linux 防火墙

防火墙分类 按保护范围划分 主机防火墙:服务服务为当前一台主机 网络防火墙:服务服务为防火墙一侧的局域网 按实现方式分类划分 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一部分基于软件的实现 如:华为&#…

ping 8.8.8.8和ping www.baidu.com都OK,但是打不开网页

ping 8.8.8.8和ping www.baidu.com都OK,但是打不开网页 打开设置 -> 网络 找到IPV4, DNS栏输入 8.8.8.8 , apply 设置里界面变成这样 然后网页就能加载了

vue 非父子通信-event bus 事件总线

1.作用 非父子组件之间,进行简易消息传递。(复杂场景→ Vuex) 2.步骤 创建一个都能访问的事件总线 (空Vue实例) import Vue from vue const Bus new Vue() export default Bus A组件(接受方),监听Bus的…

04 动力云客之登录后获取用户信息+JWT存进Redis+Filter验证Token + token续期

1. 登录后获取用户信息 非常好实现. 只要新建一个controller, 并调用SS提供的Authentication对象即可 package com.sunsplanter.controller;RestController public class UserController {GetMapping(value "api/login/info")public R loginInfo(Authentication a…

Spring Boot项目中TaskDecorator的应用实践

一、前言 TaskDecorator是一个执行回调方法的装饰器,主要应用于传递上下文,或者提供任务的监控/统计信息,可以用于处理子线程与主线程间数据传递的问题。 二、开发示例 1.自定义TaskDecorator import org.springframework.core.task.Task…

【rust】7、命令行程序实战:std::env、clap 库命令行解析、anyhow 错误库、indicatif 进度条库

文章目录 一、解析命令行参数1.1 简单参数1.2 数据类型解析-手动解析1.3 用 clap 库解析1.4 收尾 二、实现 grep 命令行2.1 读取文件,过滤关键字2.2 错误处理2.2.1 Result 类型2.2.2 UNwraping2.2.3 不需要 panic2.2.4 ? 问号符号2.2.5 提供错误上下文-自定义 Cust…

java导出动态下拉框excel模板

1.原始模板 2.导出模板,下拉框为数据库中得到动态数据 public void downloadTemplate(HttpServletResponse response) throws IOException {// 所有部门List<String, String> departments expertManageMapper.selectAllDepartment();//所有职位List<String, String&g…

打码半年,开源一款自定义大屏设计软件!

hi&#xff0c;大家好&#xff0c;我是Tduck马马。 最近我们开源了一款大屏软件-TReport&#xff0c;与大家分享。 TReport是一款基于Vue3技术栈的数据可视化系统&#xff0c;支持静态、动态api等数据源&#xff1b;可用于数据可视化分析、报表分析、海报设计使用。 提供自定…

定制你的【Spring Boot Starter】,加速开发效率

摘要&#xff1a; 本文将介绍如何创建一个自定义的 Spring Boot Starter&#xff0c;让您可以封装常用功能和配置&#xff0c;并在多个 Spring Boot 项目中共享和重用。 1. 简介 Spring Boot Starter 是 Spring Boot 框架中的一种特殊的依赖项&#xff0c;它用于快速启动和配置…

计算机网络-广域通信网

1.广域网概念和分类 什么是广域网&#xff1f; 广域网是指长距离跨地区的各种局域网、计算机、终端互联在一起&#xff0c;组成一个资源共享的通信网络。 广域网分为传统广域网和现代广域网。 传 统 广 域 网公共交换电话网PSTN公共数据网X.25帧中继网FR综合业务数据网ISDN…

Linux 内存top命令详解

通过top命令可以监控当前机器的内存实时使用情况&#xff0c;该命令的参数解释如下&#xff1a; 第一行 15:30:14 —— 当前系统时间 up 1167 days, 5:02 —— 系统已经运行的时长&#xff0c;格式为时:分 1 users ——当前有1个用户登录系统 load average: 0.00, 0.01, 0.05…

时间获取,文件属性和权限的获取——C语言——day06

今天主要内容是时间获取以及文件属性和权限的获取 时间获取 1.time 1.time time_t time(time_t *tloc); 功能:返回1970-1-1到现在的秒数&#xff08;格林威治时间&#xff09; 参数:tloc:存放秒数空间首地址 返回值:成功返回秒数失败返回-12.localtime 2.localtimestruct t…

开发一款招聘小程序需要具备哪些功能?

随着时代的发展&#xff0c;找工作的方式也在不断变得简单&#xff0c;去劳务市场、人才市场的方式早就已经过时了&#xff0c;现在大多数年轻人都是直接通过手机来找工作。图片 找工作类的平台不但能扩大企业的招聘渠道&#xff0c;还能节省招聘的成本&#xff0c;方便求职者进…

Linux-时间接口-005

学习重点&#xff1a; 1.函数接口 2.【ls-l】命令的实现1【time】 1.1函数原型 【time_t time(time_t *tloc);】1.2函数功能 返回1970-1-1到现在的秒数&#xff08;格林威治时间&#xff09;1.3函数参数 1.3.1【tloc】 存放秒数空间首地址 存放的秒数&#xff1a;如果【t…

Java Web(六)--XML

介绍 官网&#xff1a;XML 教程 为什么需要&#xff1a; 需求 1 : 两个程序间进行数据通信&#xff1f;需求 2 : 给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去读取它应当监听的端口号、还有连接数据库的用户名和密码。spring 中的…

数据结构--红黑树详解

什么是红黑树 红黑树(Red Black Tree)是一种自平衡二叉查找树。它是在 1972 年由 Rudolf Bayer 发明的,当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在 1978 年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 由于其自平衡的特性,保证…

NBlog个人博客部署维护过程记录 -- 后端springboot + 前端vue

项目是fork的Naccl大佬NBlog项目&#xff0c;页面做的相当漂亮&#xff0c;所以选择了这个。可以参考2.3的效果图 惭愧&#xff0c;工作两年了也没个自己的博客系统&#xff0c;趁着过年时间&#xff0c;开始搭建一下. NBlog原项目的github链接&#xff1a;Naccl/NBlog: &#…

展示用HTML编写的个人简历信息

展示用HTML编写的个人简历信息 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…