OpenCV 鼠标绘图
创始人
2025-05-30 10:05:31
0

1、实验目标

(1)、鼠标当笔
(2)、函数:setMouseCallback()
(3)、滑动调色板
(4)、函数cv.createTrackbar(),cv.getTrackbarPos()

2、实验步骤

(1)、安装必要的库

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

(2)、查看支持鼠标的操作

events = [i for i in dir(cv) if 'EVENT' in i]
print(events)

在这里插入图片描述
(3)、双击鼠标画出一个圆
cv2.setMouseCallback(winname, onMouse, userdata=0)
winname: 自定义的窗口名
onMouse:鼠标事件的回调函数(在发生鼠标事件时执行)
userdata:传递给回调函数的可选参数

#双击鼠标画一个圆
import numpy as np
import cv2 as cv
def draw_circle(event,x,y,flags,param):if event==cv.EVENT_LBUTTONDBLCLK:cv.circle(img,(x,y),100,(255,0,0),-1)
img = np.zeros((512,512,3),np.uint8)#创建黑色图像
cv.namedWindow('image')#创建一个窗口
cv.setMouseCallback('image',draw_circle)#函数与窗口进行绑定
while(1):cv.imshow('image',img)if cv.waitKey(20) & 0xFF==27:break
cv.destroyAllWindows()

在这里插入图片描述
(4)、拖动鼠标绘制矩形或圆圈
回调函数包含两部分,一部分画矩形,一部分画曲线

drawing = False #默认False,按下鼠标为True
mode = True #if True,画出矩形,按'm'切换曲线
ix,iy=-1,-1
#响应鼠标函数
def draw_circle(event,x,y,flags,param):global ix,iy,drawing,modeif event == cv.EVENT_LBUTTONDOWN:#左键击下drawing = Trueix,iy=x,yelif event==cv.EVENT_MOUSEMOVE:#鼠标移动if drawing == True:if mode==True:cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)else:cv.circle(img,(x,y),5,(0,0,255),-1)elif event==cv.EVENT_LBUTTONUP:#左键弹起drawing = Falseif mode == True:cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)else:cv.circle(img,(x,y),5,(0,0,255),-1)
#将函数与窗口进行绑定
img = np.zeros((512,512,3),np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):cv.imshow('image',img)k = cv.waitKey(1) & 0xFF#按下'm'键切换模式if k==ord('m'):#获得按键编码mode = not modeelif k==27:#按下ESC键退出break
cv.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
(5)滑动条调色板
cv.getTrackbarPos(trackbarname, winname)
第一个参数是滑动条名字,
第二个时所在窗口,
返回值是滑动条的数值。

cv.createTrackbar(“scale”, “display”, 0, 100, self.opencv_calibration_node.on_scale)
第一个参数时滑动条的名字,
第二个参数是滑动条被放置的窗口的名字,
第三个参数是滑动条默认值,
第四个参数时滑动条的最大值,
第五个参数时回调函数,每次滑动都会调用回调函数。

def nothing(x):pass
img = np.zeros((300,512,3),np.uint8)#创建黑色图片
cv.namedWindow('image')#创建窗口#创建滑动条
cv.createTrackbar('R','image',0,255,draw_circle)
cv.createTrackbar('G','image',0,255,draw_circle)
cv.createTrackbar('B','image',0,255,draw_circle)#创建开关
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch,'image',0,1,nothing)while(1):cv.imshow('image',img)k = cv.waitKey(1) & 0xFFif k==27:breakr = cv.getTrackbarPos('R','image')g = cv.getTrackbarPos('G','image')b = cv.getTrackbarPos('B','image')s = cv.getTrackbarPos(switch,'image')
#     print(r,g,b,s)if s==0:img[:] = 0else:img[:] = [b,g,r]cv.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
(6)、鼠标绘图,使用调色板调节颜色

img = np.zeros((300,512,3),np.uint8)#创建黑色图片
cv.namedWindow('image')#创建窗口#创建滑动条
r = cv.createTrackbar('R','image',0,255,nothing)
g = cv.createTrackbar('G','image',0,255,nothing)
b = cv.createTrackbar('B','image',0,255,nothing)
drawing = False #默认False,按下鼠标为True
ix,iy=-1,-1
#响应鼠标函数
def nothing(x):pass
def draw(event,x,y,flags,param):global ix,iy,drawingr = cv.getTrackbarPos('R','image')g = cv.getTrackbarPos('G','image')b = cv.getTrackbarPos('B','image')if event == cv.EVENT_LBUTTONDOWN:#左键击下drawing = Trueix,iy=x,yelif event==cv.EVENT_MOUSEMOVE:#鼠标移动if drawing == True:cv.circle(img,(x,y),5,(b,g,r),-1)elif event==cv.EVENT_LBUTTONUP:#左键弹起drawing = Falsecv.circle(img,(x,y),5,(b,g,r),-1)cv.setMouseCallback('image',draw)
while(1):cv.imshow('image',img)k = cv.waitKey(1) & 0xFFif k==27:break
cv.destroyAllWindows()

在这里插入图片描述

相关内容

热门资讯

#window 环境rust开... window 安装 rust开发环境,采用mingw方式(不用安装c&#...
你出门了吗?为期5天的端午假期... 记者从广铁集团获悉,今年铁路端午假期运输自5月30日至6月3日,为期5天。铁路部门预计发送旅客117...
让游客看到古建“门道”,颐和园... 端午假期,恰逢“六一 ”国际儿童节,颐和园苏州街“边修缮,边开放”的工作现场,开展了一场别开生面的古...
Kubernetes(4):实... 1 Namespace Namespace是kubernetes系统中的一种非常重要资源,它的主要作...
MySQL数据库 + Dock... MySQL主从同步 一.前言 MySQL内建的复制功能是构建大型,高性能应用程序的基础...
软件质量保证与测试 课程设计 ... 测 试 报 告 2020年  6月   1日   测试项目 程序员 测试人 测试...
SpringBoot集成Red... 目录 一、Lettuce 集成使用 1. 在 pom.xml 配置文件中引入如下依赖 2. 在 ap...
普通粽子巴掌大,“横县大粽”却... 普通粽子巴掌大, “横县大粽”却像个巨无霸! 一刀切开, 足够几个人大快朵颐。 宽大粽叶裹着细糯, ...
(神州写真)创意粽子缤纷上新 ... 中新社杭州5月31日电 题:创意粽子缤纷上新 端午粽生活添彩时尚感 作者 黄彦君 创意口味层出不穷、...
谁发明的这种做法?比外面烧烤店... 谁发明的这种做法?比外面烧烤店还好吃!!! 孜然羊排不管空气炸锅还是户外烧烤、真的是一绝 肉质鲜嫩,...
创意粽子缤纷上新 端午粽生活添... 中新社杭州5月31日电 题:创意粽子缤纷上新 端午粽生活添彩时尚感 作者 黄彦君 创意口味层出不穷、...
端午集“五红”,南京鸭子店拍长... 今天是端午佳节。按照历法,2025年是农历乙巳年,又称“青蛇年”。因干支纪年每60年循环一次,下一次...
【hive】order by、... Order By(全局排序) Order By 用于结果集的排序。也可以...
端午假期首日 八达岭再现烟雨长... 5月31日清晨,一场清凉夏雨洗去尘埃,古老长城披上朦胧水纱。降雨为八达岭长城景区带来别样壮美。同时,...
Java编程前景如何? 在互联网+时代,每个服务行业都会利用大数据,结合大数据分析软件等...
贵州镇远:体验漂流 贵州镇远:... 本文转自:人民网2025年5月30日,贵州省黔东南苗族侗族自治州镇远县高过河景区,峡谷漂流项目吸引不...
Swift函数派发机制 Swift派发的目的是让CPU知道被调用的函数在哪里,Swift语言支持编译型语言的直接派发,函数表...
diskgenius磁盘管理和... DiskGenius是一款功能强大的磁盘管理和数据恢复软件,它可以帮助用户对磁盘进行分...
计算机考研复试--英语常问问题... 计算机考研复试–英语常问问题及答案 Category 1: Personal Questions ...
6月1~2号巽寮湾帆船、快艇美... 行程亮点 夏日海边精彩项目,一网打尽! 来一趟总要留下美丽的身影,快来出海美拍吧 赶海公园--赶海圣...