导入包

import cv2
import numpy as np

可以通过下面的代码来查看所有的鼠标事件函数

 events=[i for i in dir(cv2) if 'EVENT' in i]#查看所有鼠标事件print(events)输出为:
['EVENT_FLAG_ALTKEY',  flags 代表拖拽事件。按住alt键不放'EVENT_FLAG_CTRLKEY',按住ctrl键不放'EVENT_FLAG_LBUTTON',按住左键拖拽'EVENT_FLAG_MBUTTON',中键拖拽'EVENT_FLAG_RBUTTON',右键拖拽'EVENT_FLAG_SHIFTKEY',按住shift不放'EVENT_LBUTTONDBLCLK', event鼠标事件。左键双击'EVENT_LBUTTONDOWN',按下左键'EVENT_LBUTTONUP',释放左键'EVENT_MBUTTONDBLCLK','EVENT_MBUTTONDOWN','EVENT_MBUTTONUP','EVENT_MOUSEHWHEEL','EVENT_MOUSEMOVE','EVENT_MOUSEWHEEL','EVENT_RBUTTONDBLCLK','EVENT_RBUTTONDOWN','EVENT_RBUTTONUP']

创建回调函数。当双击鼠标左键时,自动出现圆

def draw_circle(event,x,y,flags,param):#创建回调函数,参数分别是:event鼠标事件,flags鼠标拖拽事件,x,y中心坐标if event==cv2.EVENT_LBUTTONDBLCLK:#双击鼠标左键cv2.circle(img,(x,y),100,(255,0,0),-1)img=np.zeros((512,512,3),np.uint8)#黑色画布,长宽都为512,3表示BGR3种颜色,uint8是用0-255表示所有颜色
cv2.namedWindow('image')#窗口命名
cv2.setMouseCallback('image',draw_circle)#用鼠标画
while(1):cv2.imshow('image',img)if cv2.waitKey(20)&0xFF==27:#。cv2.waitKey(delay)返回值:# 1、等待期间有按键:返回按键的ASCII码(比如:Esc的ASCII码为27);# 2、等待期间没有按键:返回 -1;break
cv2.destroyAllWindows()

拖动鼠标来画矩形或者圆

drawing=False
mode=True
ix,iy=-1,-1
def draw_circle(event,x,y,flags,param):global ix,iy,drawing,mode#定义全局变量if event==cv2.EVENT_LBUTTONDOWN:#若按下左键,drawing 的状态变成TRUEdrawing=Trueix,iy=x,yelif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:#若拖动左键,if drawing==True:if mode==True:cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)# (ix,iy),(x,y)# 当按下左键时就会将鼠标所在x,y的值赋给ix,iy作为矩形的左上角起始点,(x,y)终点坐标else:# cv2.circle(img,(x,y),3,(0,0,255),-1)#画圆,拖动鼠标时会画很多连在一起的小圆r = int(np.sqrt((x - ix) ** 2 + (y - iy) ** 2))#起始点是圆心,沿着半径方向拖动拉长半径cv2.circle(img,(x,y),r,(0,0,255),-1)elif event==cv2.EVENT_LBUTTONUP:#松开左键时,drawing=Falsedrawing==Falseif mode==True:#当没有执行上一个elif时,松开左键会画矩形,cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)else:cv2.circle(img, (x, y), 3, (0, 0, 255), -1)img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):cv2.imshow('image',img)k=cv2.waitKey(1)&0xFFif k==ord('m'):#按'm'键来控制mode状态,每按一次就会将mode的状态变为与上一次相反,从而判断是画圆还是矩形mode=not modeelif k==27:#ESC键退出break

用滑动条作调色板

def nothing(x):passimg=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')#创建滑动条
cv2.createTrackbar('R','image',0,255,nothing)# 参数1:滑动条轨迹名, 参数2:滑动条依附的窗口名
# 参数3:滑块的位置,创建时,滑块初始位置就是这个变量当前的值 参数4:轨迹的最大值, 参数5:回调函数
#在本例中这个回调函数不用做任何事情,我们只需要 pass 就可以了。
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)switch='0:OFF\n1:ON'#创建转换按钮,opencv不带转换按钮,所以用滑动条来代替,颜色区间值设为0和1,表示关和开
cv2.createTrackbar(switch,'image',0,1,nothing)while(1):cv2.imshow('image',img)k=cv2.waitKey(1)&0xFFif k==27:breakr=cv2.getTrackbarPos('R','image')g=cv2.getTrackbarPos('G','image')b=cv2.getTrackbarPos('B', 'image')s=cv2.getTrackbarPos(switch,'image')if s==0:img[:]=0#s=0时,图像颜色0代表黑色else:img[:]=[b,g,r]
cv2.destroyAllWindows()

将鼠标和滑动条结合起来,可以选择不同颜色的画笔绘制。

def nothing(x):passdrawing=False
mode=True
ix,iy=-1,-1def draw_circle(event,x,y,flags,param):r = cv2.getTrackbarPos('R', 'image')g = cv2.getTrackbarPos('G', 'image')b = cv2.getTrackbarPos('B', 'image')#     s=cv2.getTrackbarPos(switch,'image')color=(b,g,r)# switch = '0:OFF\n1:ON'  # 创建转换按钮,opencv不带转换按钮,所以用滑动条来代替# cv2.createTrackbar(switch, 'image', 0, 1, nothing)global ix,iy,drawing,mode#定义全局变量if event==cv2.EVENT_LBUTTONDOWN:#若按下左键,drawing 的状态变成TRUEdrawing=Trueix,iy=x,yelif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:#若拖动左键,if drawing==True:if mode==True:cv2.rectangle(img,(ix,iy),(x,y),color,-1)# (ix,iy),(x,y)# 当按下左键时就会将鼠标所在x,y的值赋给ix,iy作为矩形的左上角起始点,(x,y)终点坐标else:# cv2.circle(img,(x,y),3,(0,0,255),-1)#画圆,拖动鼠标时会画很多连在一起的小圆r = int(np.sqrt((x - ix) ** 2 + (y - iy) ** 2))#起始点是圆心,沿着半径方向拖动拉长半径cv2.circle(img,(x,y),r,color,-1)elif event==cv2.EVENT_LBUTTONUP:#松开左键时,drawing=Falsedrawing=Falseif mode==True:#当没有执行上一个elif时,松开左键会画矩形,cv2.rectangle(img,(ix,iy),(x,y),color,-1)else:cv2.circle(img, (x, y), 3, color, -1)img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
#创建滑动条
cv2.createTrackbar('R','image',0,255,nothing)# 参数1:滑动条轨迹名, 参数2:滑动条依附的窗口名
# 参数3:滑块的位置,创建时,滑块初始位置就是这个变量当前的值 参数4:轨迹的最大值, 参数5:回调函数
#在本例中这个回调函数不用做任何事情,我们只需要 pass 就可以了。
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
# switch='0:OFF\n1:ON'#创建转换按钮,opencv不带转换按钮,所以用滑动条来代替
# cv2.createTrackbar(switch,'image',0,1,nothing)
cv2.setMouseCallback('image',draw_circle)
while(1):cv2.imshow('image',img)k=cv2.waitKey(1)&0xFFif k==ord('m'):#按'm'键来控制mode状态,每按一次就会将mode的状态变为与上一次相反,从而判断是画圆还是矩形mode=not modeelif k==27:#ESC键退出break

OpenCV————鼠标绘制和滑动条相关推荐

  1. OpenCV鼠标事件和滑动条事件

    鼠标事件 ① 鼠标事件是通过传统的回调函数机制来完成. void your_mouse_callback(int event, int x, int y, int flags, void* param ...

  2. opencv给图片加滑动条调节窗口大小

    起因:最近对图片进行截取矩形区域操作时,发现了opencv一个很蛋痛的地方,使用imshow()函数展示图片的时候,一旦图片的分辨率过高,就不能完全显示.要是调整参数为WINDOWSIZE_NORMA ...

  3. python opencv Intel Realsense 使用滑动条调整图片的曝光率

    # -*- coding: utf-8 -*- """ @File : 200113:测试跟踪条tracebackbar().py @Time : 2020/1/13 9 ...

  4. HighGUI图像用户界面初步(滑动条、鼠标操作)

    文章目录 1.Mat类简析 2.图像的载入:imread()函数 3.图像的显示:imshow()函数 4.创建窗口:namedWindow()函数 5.输出图像到文件:imwrite()函数 6.综 ...

  5. OpenCV学习笔记:反色显示图片、鼠标事件、键盘事件和窗口滑动条操作

    环境CentOS7 g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) $ pkg-config --modversion opencv 2.4.13 参照< ...

  6. 【OpenCV 】计算物体的凸包/创建包围轮廓的矩形和圆形边界框/createTrackbar添加滑动条/

    目录 topic 1:模板匹配 topic 2:图像中寻找轮廓 topic 3:计算物体的凸包 topic 4:轮廓创建可倾斜的边界框和椭圆¶ topic 5:轮廓矩¶ topic 6:为程序界面添加 ...

  7. OpenCV之highgui 模块. 高层GUI和媒体I/O: 为程序界面添加滑动条 OpenCV的视频输入和相似度测量 用OpenCV创建视频

    为程序界面添加滑动条 在以前的教程中 (例如 linear blending 和 brightness and contrast adjustments)你有可能注意到需要 input 一些数值到我们 ...

  8. QT+OpenCV综合示例:图像混合(滑动条)

    QT+OpenCV综合示例:图像混合(滑动条) 1.代码: 2.运行结果: 0)Widget_op.ui (界面文件)设计: 1.代码: 1)opencv_imwrite_Q.pro 添加: INCL ...

  9. Python,OpenCV鼠标事件进行矩形、圆形的绘制(随机颜色、随机半径)

    Python,OpenCV鼠标事件进行矩形.圆形的绘制(随机颜色.随机半径) 1. 效果图 2. 源码 参考 这篇博客将介绍鼠标事件,并介绍鼠标事件矩形.圆形的绘制: 所有的鼠标事件(左键按下.左键释 ...

最新文章

  1. java jsp w3c报错_JSP JavaBean
  2. ViewHolder VS HolderView ?
  3. vim设置显示行号,vim跳转到文件头,文件尾
  4. 【修饰符】四种访问修饰符和各自的权限
  5. SAP C4C里前台Opportunity搜索的响应明细
  6. 解决IIS出现“由于权限不足而无法读取配置文件”的问题
  7. php常用字符串函数有哪些,ThinkPHP字符串函数及常用函数汇总
  8. ASP.NET AJAX学习笔记之:CollapsiblePanel---可折叠的面板
  9. Java中NIO详解
  10. 案例|工业物联网解决方案·光伏电站
  11. 保持初心,不负韶华||回顾2021,展望2022
  12. h3c服务器登录密码修改,H3C交换机配置ssh密码验证登录方式
  13. 中餐厅服务器维护,《中餐厅5》首播,龚俊仅出镜10分钟,两个细节表明他恐不会常驻...
  14. 【计算机毕业设计】267防疫信息登记系统设计与实现
  15. 你喜欢最华为手机哪一点?网友评论亮了
  16. error: src refspec dev does not match any.
  17. Lambda使用指北(上)
  18. 效能篇 | 爱奇艺APP一键体检技术实践
  19. vb怎样访问网络服务器的access数据库
  20. 适用于Shiny的ESS代码缩进设置

热门文章

  1. 神经网络调参:loss 问题汇总(震荡/剧烈抖动,loss不收敛/不下降)
  2. 【Hibernate步步为营】--映射合集汇总
  3. 读书百客:《送客之江西》赏析
  4. 【Python123】鸡兔同笼
  5. Django(十二)模型表关系的实现
  6. FFmpeg视频录制(WIN)
  7. 小米 VS 华为 - 抽象工厂模式
  8. 《巴黎圣母院》 1.大厅 解读
  9. 微信小程序-WXML-template模板
  10. Redis Setex