当前位置: 首页 > news >正文

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来进行模拟

思路:

  1. 鼠标左键点击开始进行绘制
  2. 鼠标未拖动则生成圆点
  3. 鼠标拖动则绘制矩形
  4. 最后在图像上生成矩形框

可用到的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微信小程序的投票系统

项目介绍 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,投票系统小程序被用户普遍使用,为方便用户…...

没有上司的舞会

有了上一篇博客,没有看上一篇博客的可以看看上一篇博客,我们对没有上司的舞会这道题会有更好的理解~ 所以关键的思路就是确定对于每一个节点我们应该维护什么内容才是最合适的,这个题目和上一篇博客的最后一道题目很相似,我们思考…...

2.18每日一题(不直接给f(x)的定积分及变上限积分)

...

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 就是用于定义…...

机器学习——正则化

正则化 在机器学习学习中往往不知道需要不知道选取的特征个数,假如特征个数选取过少,容易造成欠拟合,特征个数选取过多,则容易造成过拟合。由此为了保证模型能够很好的拟合样本,同时为了不要出现过拟合现象&#xff0…...

【c++】打家劫舍(动态规划)

打家劫舍 题目难度:高阶 时间限制:1000ms 内存限制:256mb 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff…...

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) 用作服务器和客户端之间的请求-响应协议。 它使它们之间的通信顺…...

怎么把成绩发给家长

亲爱的小伙伴们,作为老师,我们经常需要将学生的成绩发送给家长。但是,手动发送成绩不仅效率低,还容易出错。这时候,我们就需要一个强大的工具——成绩查询系统。它不仅可以轻松实现学生成绩的录入、存储和查询&#xf…...

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…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...