OpenCV学习系列教程第一篇:处理鼠标事件

摘要:
因此,鼠标回调函数由两部分组成:一是绘制矩形,二是绘制圆形。

来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解

本文由作者翻译并进行代码验证,转载请注明出处~

官方文档请参阅:https://docs.opencv.org/4.0.1/db/d5b/tutorial_py_mouse_handling.html

运行环境:

windows 10+pycharm professional 2018.3+python 3.7.1+opencv 4.0.1

目标:

1,学习到如何处理鼠标事件

2,学习 cv.setMouseCallback()函数

简单示例

创建一张黑色背景的图------>处理鼠标点击事件:当鼠标点击两次时,以点击的点为圆心,创建半径为100的圆

import numpy as np
import cv2 as cv
# mouse callback function
def draw_circle(event,x,y,flags,param):
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img,(x,y),100,(255,0,0),-1)
# Create a black image, a window and bind the function to window
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()

复杂示例:

针对鼠标滑动、点击等产生的事件,选择不同的方法,实现绘制矩形或者是圆形的功能。

所以该鼠标回调函数由两部分组成:一是绘制矩形,一是绘制圆形。

第一次修改:cv.setMouseCallback('image',draw_circle) #这一句为image这个窗口增加了一个鼠标事件的回调函数

import numpy as np
import cv2 as cv
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
# mouse callback function
# img=cv.imread('C:\Users\xjtu\Desktop\1.jpg')
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv.imshow('img',img)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
cv.imshow('img', img)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv.imshow('img', img)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
cv.imshow('img', img)
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
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv.destroyAllWindows()
 

案例运行照片:

运行照片截图如下,随意点击两处,即可生成矩形

 OpenCV学习系列教程第一篇:处理鼠标事件第1张

英文状态下,输入m之后,点击,即可生成圆,运行截图如下

OpenCV学习系列教程第一篇:处理鼠标事件第2张

第一次修改:

setMouseCallback(

const String  winname

MouseCallback  onmouse

void*  userdata=0)

winname:窗口名

onmouse:鼠标事件的回调函数

userdata:回调函数的可选参数项

免责声明:文章转载自《OpenCV学习系列教程第一篇:处理鼠标事件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇大数据系列(1)——Hadoop集群坏境搭建配置SSE特殊指令集系列之二下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ios10中禁止用户缩放页面

在ios10前我们能通过设置meta来禁止用户缩放页面: [html] view plain copy<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />   在ios10系统中m...

KindEditor 一款好用的HTML可视化编辑器(富文本编辑器)

  KindEditor使用JavaScript编写,可以无缝的于Java、.NET、PHP、ASP等程序接合。 KindEditor非常适合在CMS、商城、论坛、博客、Wiki、电子邮件等互联网应用上使用,2006年7月首次发布2.0以来,KindEditor依靠出色的用户体验和领先的技术不断扩大编辑器市场占有率,目前在国内已经成为最受欢迎的编辑器之一。...

蓝牙Host Controller Interface笔记

1.概述     HCI提供了一个统一的使用蓝牙控制器(BR/EDR Controller,BR/EDR/LE Controller,LE Controller,AMP Controller等)的方法,它屏蔽了蓝牙的基带部分,提供了统一的数据进入基带的方法。     首先,蓝牙的BaseBand部分有以下几种控制器: • BR/EDR Controlle...

extjs学习笔记--ExtJS框架基础:事件模型及其常用功能

前言 工作中用ExtJS有一段时间了,Ext丰富的UI组件大大的提高了开发B/S应用的效率。虽然近期工作中天天都用到ExtJS,但很少对ExtJS框架原理性的东西进行过深入学习,这两天花了些时间学习了下。我并不推荐大家去研究ExtJS框架的源码,虽然可以学习其中的思想和原理,但太浪费精力了,除非你要自己写框架。 对于ExtJS这种框架,非遇到“杂症”的时候...

当微信小程序遇到AR(二)

当微信小程序遇到AR,会擦出怎么样的火花?期待与激动...... 通过该教程,可以从基础开始打造一个微信小程序的AR框架,所有代码开源,提供大家学习。 本课程需要一定的基础:微信开发者工具,JavaScript,Html,Css 第二章:基石-摄像头数据获取 【前情提要】 上一章,我们了解了微信小程序与AR相遇一些前因后果,同时也,罗列出来是要实现这样...

libevent源码学习(8):event_signal_map解析

目录event_signal_map结构体向event_signal_map中添加event激活event_signal_map中的event删除event_signal_map中的event以下源码均基于libevent-2.0.21-stable。       在前文中分析了event_io_map,在windows环境下event_io_map定义为...