OpenCV学习(三)——响应鼠标事件(获取点击点坐标和颜色,利用鼠标进行绘图)
响应鼠标事件
- 3. 响应鼠标事件
- 3.1 获取鼠标点击的坐标
- 3.2 获取鼠标点击像素点的颜色
- 3.3 在鼠标点击的位置生成圆
- 3.4 通过拖动鼠标来绘制填充矩形
- 3.5 通过拖动鼠标绘制未填充矩形
- 3.6 使用鼠标选点绘制多边形
- 3.7 按住鼠标左键进行绘图
3. 响应鼠标事件
使用OpenCV读取图像,可以在读取图像的窗口通过鼠标点击可以实现:获取鼠标点击像素点的坐标、获取鼠标点击像素点的颜色和在鼠标点击的像素点生成圆等等。
# 对窗口的鼠标动作做出回应
cv2.setMouseCallback(winname, callback, userdata)
- winname:窗口的名字
- callback:回调函数
- userdata:给回调函数的参数
# 鼠标回调函数,传入到callback参数上去
def mouse_callback(event, x, y, flags, userdata)
- enent:鼠标事件
- x:横坐标
- y:纵坐标
- flags:事件组合
- userdata:与cv2.setMouseCallback中的userdata对应,用于传参
| 鼠标事件event | 对应 |
|---|---|
| EVENT_MOUSEMOVE | 鼠标移动 |
| EVENT_LBUTTONDOWN | 按下鼠标左键 |
| EVENT_RBUTTONDOWN | 按下鼠标右键 |
| EVENT_LBUTTONUP | 左键释放 |
| EVENT_RBUTTONUP | 右键释放 |
| EVENT_LBUTTONDBLCLK | 左键双击 |
| EVENT_RBUTTONDBLCLK | 右键双击 |
3.1 获取鼠标点击的坐标
import cv2
import numpy as np# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):# 如果鼠标左键点击,则输出横坐标和纵坐标if event == cv2.EVENT_LBUTTONDOWN:print(f'({x}, {y})')# 在图像上绘制点cv2.circle(img, (x, y), 3, (0, 0, 255), -1)# 在图像上添加坐标文本# (图像,文本内容,坐标点,字体类型,字体大小,颜色,字体粗细)cv2.putText(img, f'({x},{y})', (x, y),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)# 获取指定像素点的颜色pixel_color = img[x, y]print("颜色值BGR:", pixel_color)img = cv2.imread('lena.jpg')# 创建窗口
cv2.namedWindow('Point Coordinates')# 将回调函数绑定到窗口
cv2.setMouseCallback('Point Coordinates', mouse_callback)# 显示图像
while True:cv2.imshow('Point Coordinates', img)k = cv2.waitKey(1) & 0xFF# 按esc键退出if k == 27:break
cv2.destroyAllWindows()
3.2 获取鼠标点击像素点的颜色
# 获取指定像素点的颜色
pixel_color = img[x, y]
print("颜色值BGR:", pixel_color)

3.3 在鼠标点击的位置生成圆
import cv2img = cv2.imread('lena.jpg')# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):# 如果鼠标左键点击,则输出横坐标和纵坐标if event == cv2.EVENT_LBUTTONDOWN:print(f'({x}, {y})')# 在图像上绘制圆cv2.circle(img, (x, y), 100, (0, 0, 255), -1)# 创建新窗口
cv2.namedWindow('mouse')# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)while True:cv2.imshow('mouse', img)k = cv2.waitKey(1) & 0xFF# 按esc键退出if k == 27:break
cv2.destroyAllWindows()

3.4 通过拖动鼠标来绘制填充矩形
在用QQ截图的时候,会有绘制矩形框的选项,使用OpenCV来进行模拟
思路:
- 鼠标左键点击开始进行绘制
- 鼠标未拖动则生成圆点
- 鼠标拖动则绘制矩形
- 最后在图像上生成矩形框
可用到的event事件:
- EVENT_LBUTTONDOWN:按下鼠标左键
- EVENT_MOUSEMOVE:鼠标移动
- EVENT_LBUTTONUP:左键释放
import cv2
import numpy as npimg = cv2.imread('lena.jpg')drawing = False # 如果按下鼠标,则为真
start_x, start_y = -1, -1# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):global start_x, start_y, drawing# 鼠标左键单击if event == cv2.EVENT_LBUTTONDOWN:drawing = Truestart_x, start_y = x, y# 鼠标移动elif event == cv2.EVENT_MOUSEMOVE:if drawing == True:cv2.rectangle(img, (start_x, start_y), (x, y), (0, 0, 255), -1)# 鼠标左键松开elif event == cv2.EVENT_LBUTTONUP:drawing = False# 创建新窗口
cv2.namedWindow('mouse')# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)while True:cv2.imshow('mouse', img)k = cv2.waitKey(1) & 0xFF# 按esc键退出if k == 27:break
cv2.destroyAllWindows()

3.5 通过拖动鼠标绘制未填充矩形
import cv2
import numpy as npimg = cv2.imread('lena.jpg')drawing = False # 如果按下鼠标,则为真
start_x, start_y = -1, -1# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):global start_x, start_y, drawing# 鼠标左键单击if event == cv2.EVENT_LBUTTONDOWN:drawing = Truestart_x, start_y = x, y# 鼠标移动elif event == cv2.EVENT_MOUSEMOVE:pass# 鼠标左键松开elif event == cv2.EVENT_LBUTTONUP:drawing = Falsecv2.rectangle(img, (start_x, start_y), (x, y), (0, 0, 255), 3)# 创建新窗口
cv2.namedWindow('mouse')# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)while True:cv2.imshow('mouse', img)k = cv2.waitKey(1) & 0xFF# 按esc键退出if k == 27:break
cv2.destroyAllWindows()

3.6 使用鼠标选点绘制多边形
import cv2
import numpy as npimg = cv2.imread('lena.jpg')xys = []# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):global xys, img# 鼠标左键单击if event == cv2.EVENT_LBUTTONDOWN:xys.append([x, y])cv2.circle(img, (x, y), 5, (0, 0, 255), -1)# 鼠标右键单击elif event == cv2.EVENT_RBUTTONDOWN:pts = np.array(xys, np.int32)# 画多条线:(图像,点集合,是否闭合,颜色,粗细)cv2.polylines(img, [pts], True, (0, 0, 0), 2)xys = []# 创建新窗口
cv2.namedWindow('mouse')# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)while True:cv2.imshow('mouse', img)k = cv2.waitKey(1) & 0xFF# 按esc键退出if k == 27:break
cv2.destroyAllWindows()
按照鼠标选点的先后位置绘制多边形

如果相同选点,但顺序不同,绘制的图像也不同

3.7 按住鼠标左键进行绘图
可以想象成绘图工具中的橡皮擦操作
import cv2
import numpy as npimg = cv2.imread('lena.jpg')drawing = False # 按下鼠标左键响应# 回调函数:鼠标点击输出点击的坐标
# (事件(鼠标移动、左键、右键),横坐标,纵坐标,组合键,setMouseCallback的userdata用于传参)
def mouse_callback(event, x, y, flags, userdata):global drawing# 鼠标左键单击if event == cv2.EVENT_LBUTTONDOWN:drawing = True# 鼠标移动elif event == cv2.EVENT_MOUSEMOVE:if drawing == True:cv2.circle(img, (x, y), 5, (255, 255, 255), -1)# 鼠标左键释放elif event == cv2.EVENT_LBUTTONUP:drawing = False# 创建新窗口
cv2.namedWindow('mouse')# 将回调函数绑定在mouse窗口
cv2.setMouseCallback('mouse', mouse_callback)while True:cv2.imshow('mouse', img)k = cv2.waitKey(1) & 0xFF# 按esc键退出if k == 27:break
cv2.destroyAllWindows()

相关文章:
OpenCV学习(三)——响应鼠标事件(获取点击点坐标和颜色,利用鼠标进行绘图)
响应鼠标事件 3. 响应鼠标事件3.1 获取鼠标点击的坐标3.2 获取鼠标点击像素点的颜色3.3 在鼠标点击的位置生成圆3.4 通过拖动鼠标来绘制填充矩形3.5 通过拖动鼠标绘制未填充矩形3.6 使用鼠标选点绘制多边形3.7 按住鼠标左键进行绘图 3. 响应鼠标事件 使用OpenCV读取图像&#…...
基于安卓android微信小程序的投票系统
项目介绍 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,投票系统小程序被用户普遍使用,为方便用户…...
没有上司的舞会
有了上一篇博客,没有看上一篇博客的可以看看上一篇博客,我们对没有上司的舞会这道题会有更好的理解~ 所以关键的思路就是确定对于每一个节点我们应该维护什么内容才是最合适的,这个题目和上一篇博客的最后一道题目很相似,我们思考…...
RHCE8 资料整理(四)
RHCE8 资料整理 第四篇 存储管理第13章 硬盘管理13.1 对磁盘进行分区13.2 交换分区(swap分区) 第14章 文件系统14.1 了解文件系统14.2 了解硬链接14.3 创建文件系统14.4 挂载文件系统14.5 设置永久挂载14.6 查找文件14.7 find的用法 第15章 逻辑卷管理15…...
目标跟踪ZoomTrack: Target-aware Non-uniform Resizing for Efficient Visual Tracking
论文作者:Yutong Kou,Jin Gao,Bing Li,Gang Wang,Weiming Hu,Yizheng Wang,Liang Li 作者单位:CASIA; University of Chinese Academy of Sciences; ShanghaiTech University; Beijing Institute of Basic Medical Sciences; People AI, Inc 论文链接&…...
Flink Data Sink
本专栏案例代码和数据集链接: https://download.csdn.net/download/shangjg03/88477960 1. Data Sinks 在使用 Flink 进行数据处理时,数据经 Data Source 流入,然后通过系列 Transformations 的转化,最终可以通过 Sink 将计算结果进行输出,Flink Data Sinks 就是用于定义…...
机器学习——正则化
正则化 在机器学习学习中往往不知道需要不知道选取的特征个数,假如特征个数选取过少,容易造成欠拟合,特征个数选取过多,则容易造成过拟合。由此为了保证模型能够很好的拟合样本,同时为了不要出现过拟合现象࿰…...
【c++】打家劫舍(动态规划)
打家劫舍 题目难度:高阶 时间限制:1000ms 内存限制:256mb 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统ÿ…...
eslint提示 xxx should be listed in the project's dependencies
有时候手动安装了一个npm包A,npm包A里面包含了npm包B,这时候如果 import xxx from npm包B;eslint会报错,提示 npm包B 不在 package.json 里面 解决方法:在 eslintrc.js 增加配置 module.exports {rules: {import/no-extraneous-d…...
H3C LC-5120-52SC-HI配置管理IP
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、MGMT是什么?二、配置步骤1.连接ConsoleWindowsLinux1.配置minicom2.使用minicom 2.配置管理端口3.配置Web管理4.http其它配置项 总结 前言 最近…...
数据结构与算法之排序: 归并排序 (Javascript版)
排序 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例) 归并排序 该排序属于 分治 策略将一个问题分解为两个问题来计算,计算完成之后,就会得到子任务的解,这些解不是最终问题的解,还需要merge起来…...
Java练习题2021-2
"某地大数据防疫平台记录了往来的所有防疫相关信息,包括 本地或外地人员、健康码颜色、接种疫苗情况、最近一次核酸结果、最近一次核酸检测时间等。 该地某区域对于进入人员的要求为: 如果是本地人员,需要绿码和疫苗完全接种方可进入&am…...
深度学习面试题目01
01 什么是神经网络?02 请解释前馈神经网络(Feedforward Neural Network)的工作原理。03 什么是激活函数,为什么它在神经网络中重要?04 请解释反向传播算法(Backpropagation)05 什么是过拟合&…...
ESP32网络开发实例-HTTP-POST请求
HTTP-POST请求 文章目录 HTTP-POST请求1、HTTP POST2、软件准备3、硬件准备4、代码实现在本文中,我们将介绍如何使用 ESP32向 ThingSpeak等常用 API 发出 HTTP POST 请求。 1、HTTP POST 超文本传输协议 (HTTP) 用作服务器和客户端之间的请求-响应协议。 它使它们之间的通信顺…...
怎么把成绩发给家长
亲爱的小伙伴们,作为老师,我们经常需要将学生的成绩发送给家长。但是,手动发送成绩不仅效率低,还容易出错。这时候,我们就需要一个强大的工具——成绩查询系统。它不仅可以轻松实现学生成绩的录入、存储和查询…...
Banana Pi BPI-W3 RK3588开发板基本使用文档
RK3588编译&烧录Linux固件 1、开发环境及工具准备 Rockchip Linux 软件包:linux-5.10-gen-rkr4 主机: 安装VMware搭建虚拟机,版本为Ubuntu 20.04 (硬盘容量大于100G)安装远程连接工具MobaXterm(可连接虚拟机方…...
源码解析SpringMVC之RequestMapping注解原理
1、启动初始化 核心:得到应用上下文中存在的全部bean后依次遍历,分析每一个目标handler & 目标方法存在的注解RequestMapping,将其相关属性封装为实例RequestMappingInfo。最终将 uri & handler 之间的映射关系维护在类AbstractHand…...
biocParallel学习
我好像做了一个愚蠢的测试 rm(listls()) suppressPackageStartupMessages({library(SingleCellExperiment)library(scMerge)library(scater)library(Matrix) })setwd("/Users/yxk/Desktop/test/R_parallel/") load("./data/exprsMat.RData") load(".…...
AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(六):一个AWTK工程
一个AWTK工程基于C/C++编写,可以分为如下几步: 结合下图,看懂启动的部分。一般一个AWTK工程,需要实现哪些部分,就是其中开始之后白色的部分,比如调用main函数和gui_app_start时会做一些操作,比如asset_init和application_init时要做一些设置,还有退出的函数application…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
