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

OpenCV的“画笔”功能

类似于画图软件的自由笔刷功能,当按住鼠标左键,在屏幕上画出连续的线条。

定义函数:

import cv2
import numpy as np# 初始化参数
drawing = False  # 鼠标左键按下时为True
ix, iy = -1, -1  # 鼠标初始位置# 鼠标回调函数
def mouse_paint(event, x, y, flags, param):global ix, iy, drawing# 左键按下事件if event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, y# 鼠标移动事件elif event == cv2.EVENT_MOUSEMOVE:if drawing:cv2.line(img, (ix, iy), (x, y), (0, 255, 0), 2)ix, iy = x, ycv2.imshow('image', img)# 左键松开事件elif event == cv2.EVENT_LBUTTONUP:drawing = False# cv2.line(img, (ix, iy), (x, y), (0, 255, 0), 2)# cv2.imshow('image', img)cv2.waitKey(0)# 创建空白图像或读取现有图像
img = np.zeros((500, 500, 3), np.uint8)    # 创建空白图像
# img = cv2.imread('d:\\mask1\\3.png', cv2.IMREAD_COLOR)   # 读取现有图像# 创建一个窗口并将回调函数与窗口绑定
cv2.namedWindow('image')
cv2.setMouseCallback('image', mouse_paint)# 保存绘制轨迹后的图像
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.imwrite('output_image.jpg', img)
cv2.destroyAllWindows()

 这里用到了OpenCV的鼠标回调函数cv2.setMouseCallback():

cv2.setMouseCallback() 是 OpenCV 库中用于设置鼠标事件回调函数的函数。该函数用于与图像窗口交互,通过在图像窗口中进行鼠标操作来获取像素点的坐标或执行一些特定操作。

函数原型为:

cv2.setMouseCallback(windowName, onMouse, param=None)
  • windowName 是要操作的图像窗口的名称。
  • onMouse 是回调函数,用于处理鼠标事件。该函数通常包含四个参数: event(事件类型,如 cv2.EVENT_MOUSEMOVEcv2.EVENT_LBUTTONDOWN 等)、x(鼠标点击的 x 坐标)、y(鼠标点击的 y 坐标)、flags(附加参数,如 cv2.EVENT_FLAG_CTRLKEYcv2.EVENT_FLAG_SHIFTKEY 等)。
  • param 是传递给回调函数的可选参数。

 封装为类:

import cv2
import numpy as npclass Painter:def __init__(self):self.drawing = Falseself.ix, self.iy = -1, -1self.img = np.zeros((500, 500, 3), np.uint8)def mouse_paint(self, event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDOWN:self.drawing = Trueself.ix, self.iy = x, yelif event == cv2.EVENT_MOUSEMOVE:if self.drawing:cv2.line(self.img, (self.ix, self.iy), (x, y), (0, 255, 0), 1)self.ix, self.iy = x, ycv2.imshow('image', self.img)elif event == cv2.EVENT_LBUTTONUP:self.drawing = Falsecv2.waitKey(0)def run(self):cv2.setMouseCallback('image', self.mouse_paint)cv2.imshow('image', self.img)cv2.waitKey(0)cv2.imwrite('output_image.jpg', self.img)cv2.destroyAllWindows()if __name__ == "__main__":cv2.namedWindow('image')painter = Painter()painter.run()

使用PySide6和OpenCV实现:

 目前阶段我的PySide6熟悉程度要强于OpenCV

import sys
from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
from PySide6.QtGui import QPainter, QPixmap, QMouseEvent, QColor, QPen, QImage
from PySide6.QtCore import Qt, QPoint
import cv2
import numpy as npclass PaintLabel(QLabel):def __init__(self, parent=None):super(PaintLabel, self).__init__(parent)self.image = QImage()self.drawing = Falseself.last_point = QPoint()def set_image(self, image_file):self.image = QImage(image_file)self.setPixmap(QPixmap.fromImage(self.image))def mousePressEvent(self, event: QMouseEvent):if event.button() == Qt.LeftButton:self.drawing = Trueself.last_point = event.position()def mouseMoveEvent(self, event: QMouseEvent):if event.buttons() & Qt.LeftButton and self.drawing:painter = QPainter(self.image)pen = QPen(QColor('red'))pen.setWidth(3)painter.setPen(pen)painter.drawLine(self.last_point, event.position())self.last_point = event.position()self.setPixmap(QPixmap.fromImage(self.image))def mouseReleaseEvent(self, event: QMouseEvent):if event.button() == Qt.LeftButton:self.drawing = Falsedef save_image(self, file_path):self.image.save(file_path)class MainWindow(QWidget):def __init__(self):super().__init__()self.label = PaintLabel()# Load an image (you can change the file path)img = np.zeros((500, 500, 3), np.uint8)  # 创建空白图像q_img = cv2side(img)self.label.set_image(q_img)save_button = QPushButton('Save Image')save_button.clicked.connect(self.save_image)layout = QVBoxLayout()layout.addWidget(self.label)layout.addWidget(save_button)self.setLayout(layout)def save_image(self):self.label.save_image('output_image.png')# 将OpenCV格式的图像转换为PySide格式
def cv2side(img):img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转换 BGR 到 RGB# 转换图像到QT的QImage格式height, width, channels = img_rgb.shape  # 获取形状bytes_per_line = channels * width  # 每行字节数q_img = QImage(img_rgb.data, width, height, bytes_per_line, QImage.Format_RGB888)  # 转换成QImage格return q_imgif __name__ == "__main__":app = QApplication(sys.argv)main_window = MainWindow()main_window.show()sys.exit(app.exec())

运行截图:

相关文章:

OpenCV的“画笔”功能

类似于画图软件的自由笔刷功能,当按住鼠标左键,在屏幕上画出连续的线条。 定义函数: import cv2 import numpy as np# 初始化参数 drawing False # 鼠标左键按下时为True ix, iy -1, -1 # 鼠标初始位置# 鼠标回调函数 def mouse_paint(…...

uniapp封装picker选择器组件,支持关键字查询

CommonPicker.vue组件 路径在 components\CommonPicker.vue <template><view><uni-easyinput v-model"searchQuery" :placeholder"placeholder" /><picker :range"filteredOptions" :range-key"text" v-model&…...

智慧城市的规划与实施:科技引领城市运行效率新飞跃

随着信息技术的飞速发展&#xff0c;智慧城市的构想正逐步成为现实。作为地理信息与遥感领域的研究者&#xff0c;我深知在这一转型过程中&#xff0c;技术的创新与应用是提升城市运行效率的关键。本文旨在探讨如何利用地理信息系统&#xff08;GIS&#xff09;、遥感技术、大数…...

Linux——内存管理代码分析

虚空间管理 页框和页的关系 页框 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个页框&#xff0c;也叫页帧&#xff0c;即物理页面&#xff0c;是linux划分内存空间的结果。 每个页框都有一个页框号&#xff0c;即内存块号、物理块号。 页 将用户…...

手机自动化测试:4.通过appium inspector 获取相关app的信息,以某团为例,点击,搜索,获取数据等。

0.使用inspector时&#xff0c;一定要把不相关的如weditor啥的退出去&#xff0c;否则&#xff0c;净是事。 1.从0开始的数据获取 第一个位置&#xff0c;有时0.0.0.0&#xff0c;不可以的话&#xff0c;你就用这个。 第二个位置&#xff0c;抄上。 直接点击第三个启动。不要…...

个人项目———密码锁的实现

布局组件 布局效果 组件绑定 密码锁的实现代码 using TMPro; using UnityEngine; using UnityEngine.UI;public class PasswordPanel : MonoBehaviour {// public Button button;// 所有按键的父物体public Transform buttonPanel;// 输入字符串的文本框public TMP_Text input…...

关于Input【type=number】可以输入e问题及解决方案

一、为什么 因为在数学里e 代表无理数&#xff0c;e是自然对数的底数&#xff0c;同时它又是一个无限不循环小数&#xff0c;所以我们在输入 e 时&#xff0c;输入框会默认 e 是数字&#xff0c;从而没有对它进行限制。 二、解决方案 小提示&#xff1a;vue下监听事件需要加n…...

zabbix“专家坐诊”第241期问答

问题一 Q&#xff1a;华为交换机的100GE 1/0/1口的光模块收光值监测不到&#xff0c;有没有人碰到过这个问题呢&#xff1f;其他的端口都能监测到收光值&#xff0c;但是100GE 1/0/1口监测不到收光值。底层能查到&#xff0c;zabbix 6.0监控不到&#xff0c;以下是端口的报错信…...

了解Kubernetes-RKE2的PKI以及证书存放位置

一、什么是PKI&#xff1f; 简称&#xff1a;证书基础设施。 可以方便理解为当你的集群有Server,Client架构&#xff0c;那么为了安全加密之间的通信&#xff0c;则需要使用证书进行交互&#xff0c;那么利用PKI架构可以安全加密组件之间的通信。 二、Kubernetes的PKI架构什…...

利用大语言模型进行事实匹配

论文地址:Automated Claim Matching with Large Language Models: Empowering Fact-Checkers in the Fight Against Misinformation | Companion Proceedings of the ACM on Web Conference 2024 WWW 2024 Automated Claim Matching with Large Language Models: Empowering F…...

【Stable Diffusion】(基础篇一)—— Stable Diffusion的安装

本系列笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili **Stable Diffusion&#xff08;简称…...

维纳运动的概念

维纳运动&#xff08;Wiener Process&#xff09;&#xff0c;也称为标准布朗运动&#xff0c;是一种重要的随机过程&#xff0c;广泛应用于数学、物理学和金融学等领域。它是一个连续时间的随机过程&#xff0c;具有一些特殊的性质&#xff0c;使其成为描述随机动态系统的经典…...

毫秒级查询性能优化实践!Apache Doris 在极越汽车数字化运营和营销方向的解决方案

作者&#xff1a;韩同阳&#xff0c;极越汽车大数据架构师&#xff0c;Apache Doris Active Contributor 编辑整理&#xff1a;SelectDB 技术团队 导读&#xff1a;极越是高端智能汽车机器人品牌&#xff0c;基于领先的百度 AI 能力和吉利 SEA 浩瀚架构生态赋能&#xff0c;致…...

vllm 大模型量化微调推理使用: lora、gptq、awq

1)微调lora模型推理 docker run --gpus all -v /ai/Qwen1.5-7B-Chat:/qwen-7b -v /ai/lora:/lora -p 10860:10860 --...

WPS/Office(Word、Excel、PPT) 自动测评方法

在各高等、中等院校的计算机类课程中,计算机基本应用技能的上机操作考试,广受重视,大为盛行。其中,office(word、excel、ppt)上机考试最为普遍。于是,实现这类Office文档操作的自动阅卷评分,很有必要。本人最近项目上刚好遇到需要解决这种自动评分的问题,所以再次记录下解决的…...

ArrayList——简单洗牌算法

特殊语法介绍&#xff1a; List<List<E>> 该语法情况比较特殊&#xff0c;相当于一个“二维数组”存着一个个线性表的结构&#xff0c;如图&#xff1a; 该语法的灵活性强&#xff0c;可适用于多种类型和多种情况。接下来就使用该语法来实现一个简单的洗牌操作。…...

springboot vue 开源 会员收银系统 (6) 收银台的搭建

前言 完整版演示 前面我们对会员系统 分类和商品的开发 完成了收银所需的基础信息 下面我们开始完成收银台的开发 简单画了一个收银的流程图大家参考下 从这张图我们可以分析一下几点 可以选择会员或散客收银选择会员使用相应的会员价结算使用会员卡则在价格基础根据卡折扣…...

重排和重绘的区别,什么情况下会触发这两种情况

重排&#xff08;Reflow&#xff09;和重绘&#xff08;Repaint&#xff09;是Web前端开发中关于浏览器渲染机制的两个核心概念。它们之间的主要区别以及触发条件如下&#xff1a; 重排&#xff08;Reflow&#xff09; 定义&#xff1a; 重排也称为布局&#xff08;Layout&a…...

亮点回顾|智能汽车芯片创新技术应用与质量研讨会

5月29日&#xff0c;2024汽车软件与通信大会——智能汽车芯片创新技术应用与质量研讨会在江苏苏州狮山国际会议中心举行。本次会议由中国中检所属中国汽车工程研究院股份有限公司&#xff08;简称&#xff1a;中国汽研&#xff09;主办&#xff0c;旨在为智能汽车芯片的技术创新…...

特征工程,减小过拟合

目录 特征工程 减小过拟合 图像增强方法 特征工程是机器学习和数据分析中不可或缺的一环,其重要性不言而喻。以下是关于特征工程的详细回答: 一、定义 特征工程是将原始数据转化为更好的表达问题本质的特征的过程,旨在发现对因变量y有明显影响作用的特征(通常称自变量…...

OpenClaw调试进阶:百川2-13B-4bits量化模型响应日志分析

OpenClaw调试进阶&#xff1a;百川2-13B-4bits量化模型响应日志分析 1. 为什么需要关注模型响应日志 上周我在用OpenClaw对接百川2-13B-4bits量化模型时&#xff0c;遇到了一个奇怪的现象&#xff1a;自动化任务执行到一半突然中断&#xff0c;控制台只显示"模型响应异常…...

ArcGIS 批量出图实战:15 分钟搞定 15 省地图自动化生成

&#x1f680;ArcGIS 批量出图实战&#xff1a;15 分钟搞定 15 省地图自动化生成 ✨GISer 效率神器&#xff01;告别重复操作&#xff0c;一键批量生成省级专题地图✨ 作为 GIS 从业者&#xff0c;你是不是也经常遇到这样的场景&#xff1a;&#x1f4cb;要给十几个省份分别制作…...

douyin-downloader完全指南:音频高效提取的创新方法

douyin-downloader完全指南&#xff1a;音频高效提取的创新方法 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

Adafruit NeoMatrix 原理与坐标映射详解

1. 项目概述 Adafruit NeoMatrix 是一款专为 NeoPixel 矩阵与网格显示设备设计的嵌入式图形库&#xff0c;其核心定位是作为 Adafruit_GFX 图形抽象层的硬件适配实现。它并非独立渲染引擎&#xff0c;而是通过继承并扩展 Adafruit_GFX 的绘图接口&#xff08;如 drawPixel() …...

嵌入式软件框架设计:从基础到实战

1. 嵌入式软件框架设计基础作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我深刻体会到框架设计对项目成败的决定性影响。嵌入式系统与通用计算机系统最大的区别在于其资源受限性和实时性要求&#xff0c;这就决定了我们不能简单套用桌面开发的思维模式。程序框架本质上…...

别再让MCSDK电流环PI参数拖后腿了!手把手教你从电机参数到代码配置的完整调参流程

从电机参数到代码实现&#xff1a;MCSDK电流环PI参数优化实战指南 在电机控制领域&#xff0c;电流环的性能直接影响着整个系统的响应速度、稳定性和能效表现。许多工程师在使用STM32的MCSDK进行FOC开发时&#xff0c;往往满足于"电机能转"的基本状态&#xff0c;却忽…...

Fix | Resolving ImportError: libGL.so.1 Missing in Docker/Local Environments

1. 遇到libGL.so.1缺失报错怎么办&#xff1f; 最近在部署一个基于OpenGL的图形处理项目时&#xff0c;又双叒叕遇到了这个熟悉的报错&#xff1a;"ImportError: libGL.so.1: cannot open shared object file: No such file or directory"。这已经是这个月第三次碰到…...

给AI模型‘打补丁’:用‘上下文提示’和‘查询分解’两招,轻松提升多模态大模型的抗攻击能力

多模态大模型防御实战&#xff1a;用上下文提示与查询分解抵御图像对抗攻击 当你在社交媒体上传一张"猫"的照片&#xff0c;AI系统却识别为"狗"——这种看似无害的错误在医疗影像分析或自动驾驶场景中可能引发灾难。2024年CVPR会议揭示了一个关键发现&…...

牙科手术显微镜市场:其中中国市场占比超15%

在口腔诊疗向精细化、微创化演进的进程中&#xff0c;牙科手术显微镜作为核心光学放大设备&#xff0c;凭借其高照度、高景深与高清晰度特性&#xff0c;成为提升根管治疗、牙周手术及种植修复等环节精准性的关键工具。该设备集成连续变倍观察、同轴照明、术野调焦及影像记录系…...

快马平台十分钟速建:openclaw机器人抓取参数可视化配置原型

最近在做一个机器人抓取控制的项目&#xff0c;需要快速搭建一个openclaw的参数配置界面。作为一个前端开发经验不多的工程师&#xff0c;我惊喜地发现InsCode(快马)平台可以帮我快速实现这个需求。下面分享下我的实现过程。 首先明确需求 这个配置工具需要实现五个核心功能&a…...