如果觉得本篇文章对您的学习起到帮助作用,请 点赞 + 关注 + 评论 ,留下您的足迹
本篇文章为我在学习Opencv时的理解与笔记,一是为了日后查找方便并加深对代码的理解,二是希望能帮助到正在学习Opencv时遇到困难的人。
本文相关推荐阅读:
(一)Opencv的GUI特性:1_图像入门
(一)Opencv的GUI特性:2_视频入门
(一)Opencv的GUI特性:3_OpenCV中的绘图函数
我们创建了一个简单的应用程序,在双击图像的任何地方画一个圆。
首先,我们创建一个当鼠标事件触发则执行的鼠标调用函数。鼠标事件可以是任何涉及鼠标的动作,例如:左击鼠标,右击鼠标,双击鼠标等等。
如下代码,展示鼠标事件所以事件:
import cv2
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)
out:共18个
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']
创建鼠标回调函数有一个特定的格式,以下代码完成功能为鼠标双击位置画一个圆,请看下面的代码。
函数:cv2.setMouseCallback(winname, onMouse, userdata)
import cv2
import numpy as np
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img, (x, y), 100, (255,0,0), 1)
# 创建一个黑色图片
img = np.zeros((512,512,3), np.uint8)
# 命名一个窗口
cv2.namedWindow('image')
# 为指定窗口设置鼠标处理程序
cv2.setMouseCallback('image',draw_circle)
while(1):
cv2.imshow('image',img)
if cv2.waitKey(2) & 0xFF == 27:
break
cv2.destroyAllWindows()
import numpy as np
import cv2
drawing = False # 鼠标按下为True
mode = True # True则画矩形,按'm'切换为画曲线
ix,iy = -1,-1
# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode # 四个变量定义为全局变量
if event == cv2.EVENT_LBUTTONDOWN: # 左键点击
drawing = True # 鼠标状态标识变为True
ix,iy = x,y # 此处为鼠标的x, y坐标
elif event == cv2.EVENT_MOUSEMOVE: # 鼠标滑动
if drawing == True:
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv2.EVENT_LBUTTONUP: # 左键松开
drawing = False
if mode == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(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) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
看到这里,赶快开始敲代码练习一下吧!!