5, opencv基础api学习-2个小演示

238 阅读2分钟

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()