1, 把鼠标当笔
1.1 查看opencv支持的鼠标事件
# coding:utf-8
import cv2
import numpy as np
events = [i for i in dir(cv2) if 'EVENT' in i]
print(events)
有FLAG,代表鼠标的拖拽事件,以及键盘鼠标联合事件,
事件 | 含义 |
---|---|
EVENT_FLAG_ALTKEY | 按Alt不放事件 |
EVENT_FLAG_CTRLKEY | 按Ctrl不放事件 |
EVENT_FLAG_LBUTTON | 左鍵拖曳 |
EVENT_FLAG_MBUTTON | 中鍵拖曳 |
EVENT_FLAG_RBUTTON | 右鍵拖曳 |
EVENT_FLAG_SHIFTKEY | 按Shift不放事件 |
EVENT_LBUTTONDBLCLK | 左键双击 |
EVENT_LBUTTONDOWN | 左键按下 |
EVENT_LBUTTONUP | 左键放开 |
EVENT_MBUTTONDBLCLK | 中键双击 |
EVENT_MBUTTONDOWN | 中键点击 |
EVENT_MBUTTONUP | 中键放开 |
EVENT_MOUSEHWHEEL | 横向滚轮滚动(鼠标不支持, 未测试出来) |
EVENT_MOUSEMOVE | 滑动 |
EVENT_MOUSEWHEEL | 鼠标滚动 |
EVENT_RBUTTONDBLCLK | 右键双击 |
EVENT_RBUTTONDOWN | 右键按下 |
EVENT_RBUTTONUP | 右键放开 |
1.2 setMouseCallback(windowName, onMouse, param=None)
鼠标回调函数
参数 | 含义 |
---|---|
windowName | 窗口名称 |
onMouse | 鼠标事件回调函数 |
param | 其他参数 |
回调函数的参数为: event,x,y,flags,param, 其中param是通过回调函数的param赋值进来的,event代表是的事件, flags代表拖拽事件
1.3 鼠标左击画圆
# coding:utf-8
import cv2
import numpy as np
def draw_circle(event,x,y,flags,param):
if event == cv2.EVENT_FLAG_LBUTTON:
cv2.circle(param, (x, y), 100, (255, 0,0), 2)
if __name__ == '__main__':
img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow('win', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('win', draw_circle, img)
while 1:
cv2.imshow('win', img)
q = cv2.waitKey(10)
if q == ord('q'):
break
cv2.destroyAllWindows()
1.4 鼠标按下为圆心, 拖动为半径画圆
# coding:utf-8
import cv2
import numpy as np
import math
# 记录圆心
x1 = -1
y1 = -1
def draw_circle(event,x,y,flags,param):
global x1, y1
if event == cv2.EVENT_LBUTTONDOWN:
x1 = x
y1 = y
if flags == cv2.EVENT_FLAG_LBUTTON:
if (x1 != -1):
radius = int(math.sqrt(math.pow((x-x1),2)+math.pow((y-y1),2)))
print(radius)
cv2.circle(param, (x1, y1), radius, (255, 0,0), 2)
if __name__ == '__main__':
img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow('win', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('win', draw_circle, img)
while 1:
cv2.imshow('win', img)
q = cv2.waitKey(1)
if q == ord('q'):
break
cv2.destroyAllWindows()
上面的demo有点尴尬, 本来是想拖动后显示拖动圆的轨迹, 最后就显示鼠标抬起时刻的那个圆, 结果 哈哈~
2, 用滑动条做调色板
2.1 createTrackbar(trackbarName, windowName, value, count, onChange)
在某个窗口上创建滑动条
参数 | 含义 |
---|---|
trackbarName | 滑动条的名字 |
windowName | 窗口名字 |
value | 默认值 |
count | 最大值 |
onChange | 值改变时的回调函数 |
2.2 getTrackbarPos(trackbarname, winname)
获取某个窗口的滑动条的数值
参数 | 含义 |
---|---|
trackbarname | 滑动条名字 |
winname | 窗口名字 |
2.3 编码
# coding:utf-8
import cv2
import numpy as np
def nothing(x):
pass
if __name__ == '__main__':
cv2.namedWindow('img', cv2.WINDOW_AUTOSIZE)
cv2.createTrackbar('B', 'img', 0, 255, nothing)
cv2.createTrackbar('G', 'img', 0, 255, nothing)
cv2.createTrackbar('R', 'img', 0, 255, nothing)
switch = '0:OFF, 1:ON'
cv2.createTrackbar(switch, 'img', 0, 1, nothing)
img = np.zeros((500, 800, 3), np.uint8);
while 1:
cv2.imshow('img', img)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
r = cv2.getTrackbarPos('R', 'img')
g = cv2.getTrackbarPos('G', 'img')
b = cv2.getTrackbarPos('B', 'img')
s = cv2.getTrackbarPos(switch, 'img')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
cv2.destroyAllWindows()