QQ:3020889729 小蔡
opencv可以实现gui拥有的功能——所以,opencv中也包含了鼠标事件——通过点击等等事件,执行相应的回调函数,实现指定的功能,最终实现交互!!!
鼠标回调函数的构造:函数名任意——但是参数应依次包含:event(事件),x, y,flags(标志),param(其它参数)
补充一下:事件和标志都可以作为事件触发的条件!!!
import cv2 as cv
import numpy as np
def mouse_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDOWN: # 该事件为鼠标左键按下
pass # 执行任务
事件列表:
标志列表:
由方法cv.setMouseCallback(‘imag’, mouse_circle) 实现鼠标事件!!!
import cv2 as cv
import numpy as np
cv.setMouseCallback('imag', mouse_circle)
# 第一个参数为窗体名称——指的是哪个窗体下执行
# 第二个参数为鼠标回调函数的名称——传入函数名称,指的是传入整个函数声明,而不是直接执行函数
这里采用鼠标左键按下为事件触发的条件——所以我们就要设置一个自定义回调函数,里边包含当事件为左键按下时,我们画一个88*88的矩形~
我们这里用到event——事件参数,当然,你可以修改它的名字,但是呢,只要记住这个位置在后边回调函数实现时,传入的是事件就ok啦~
def mouse_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDOWN: # 触发事件为左键按下时
cv.rectangle(img, (x, y), (x+88, y+88), (174, 238, 238), -1) # 画一个88*88的GhostWhite(颜色)矩形
还是老规矩,既然是用opencv的gui——那么我们就需要先创建一张照片(图像),接着创建一个窗体——然后把后边涉及的相关窗体放在同一个窗体下!!!(回调函数的实现也是挂在同一个窗体下的哦,要一一对应)
if __name__ == "__main__":
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('imag', cv.WINDOW_NORMAL) # 创建一个可改变大小的窗体
cv.resizeWindow('imag', 510, 510) # 大小设置
cv.setMouseCallback('imag', mouse_circle) # 实现鼠标回调函数到imag的窗体
while True:
cv.imshow('imag', img)
k = cv.waitKey(10) & 0xFF # 读取按键
if k == ord('q') or k == ord('Q'): # 结束绘制
break
cv.destroyAllWindows()
import cv2 as cv
import numpy as np
# 该回调函数用来花矩形
def mouse_circle(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDOWN: # 触发事件为左键按下时
cv.rectangle(img, (x, y), (x+88, y+88), (174, 238, 238), -1) # 画一个88*88的GhostWhite(颜色)矩形
if __name__ == "__main__":
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('imag', cv.WINDOW_NORMAL)
cv.resizeWindow('imag', 510, 510)
cv.setMouseCallback('imag', mouse_circle)
while True:
cv.imshow('imag', img)
k = cv.waitKey(10) & 0xFF
if k == ord('q') or k == ord('Q'):
break
cv.destroyAllWindows()
点击一次——按下时就产生图形了~
多次按下就有多个图形
我们可以用鼠标点击,用矩形拼凑一个小图形出来~(说明,我们实现的事件,是画到了图片上并且保留到图片上了的)
import cv2 as cv
import numpy as np
drawing = False # True时,才绘图
mode_up_down = True # 为true时,实现等腰三角形正向图;Flase时,实现倒图
ix, iy = -1, -1 # 为画图(上顶点)坐标_采用全局变量获取实时坐标
# 我们引入全局变量,实现绘制的控制
def mouse_function(event, x, y, flags, param):
global drawing, mode_up_down, mode_color, ix, iy
if event == cv.EVENT_LBUTTONDOWN: # 鼠标左键按下,允许绘图,以及获取绘图坐标
drawing = True # 允许绘图
ix, iy = x, y # 获取坐标
elif event == cv.EVENT_LBUTTONUP: # 弹起时就绘制图形
drawing = False # 关闭绘制功能
if mode_up_down:
pst = np.array([[ix, iy], [ix - 30, iy + 30], [ix + 30, iy + 30]], np.int32) # 为多边形绘制的顶点配置
pst = pst.reshape((3, 1, 2))
cv.polylines(img, [pst], True, (0, 0, 255), 2, cv.LINE_AA)
else: # 绘制倒置图形
pst = np.array([[ix - 30, iy], [ix + 30, iy], [ix, iy + 30]], np.int32) # 倒置顶点的配置
pst = pst.reshape((3, 1, 2))
cv.polylines(img, [pst], True, (0, 0, 255), 2, cv.LINE_AA)
elif event == cv.EVENT_MOUSEMOVE: # 按键未弹起,移动位置之后也发生绘图
if drawing == True:
if mode_up_down:
pst = np.array([[ix, iy], [ix - 30, iy + 30], [ix + 30, iy + 30]], np.int32)
pst = pst.reshape((3, 1, 2))
cv.polylines(img, [pst], True, (0, 0, 255), 2, cv.LINE_AA)
else:
pst = np.array([[ix - 30, iy], [ix + 30, iy], [ix, iy + 30]], np.int32)
pst = pst.reshape((3, 1, 2))
cv.polylines(img, [pst], True, (0, 0, 255), 2, cv.LINE_AA)
if __name__ == "__main__":
img = np.zeros((512, 512, 3), np.uint8)
cv.namedWindow('imag', cv.WINDOW_NORMAL)
cv.resizeWindow('imag', 510, 510)
cv.setMouseCallback('imag', mouse_function) # 实现鼠标回调函数
while True:
cv.imshow('imag', img)
k = cv.waitKey(10) & 0xFF
if k == 27:
break
elif k == ord('m') or k == ord('M'):
mode_up_down = not mode_up_down
cv.destroyAllWindows()