一、鼠标控制

        在OpenCV中,setMouseCallback 是一个用于设置鼠标事件回调函数的接口。当你希望在 显示的图像窗口中捕捉用户的鼠标操作(如点击、移动、按下或释放)时,这个接口非常有 用。它允许你通过一个回调函数来处理用户的鼠标事件,从而进行交互式图像处理。

1.1、控制鼠标

        setMouseCallback 用于在指定的窗口上设置一个鼠标事件的回调函数。当用户在这个窗口 内进行鼠标操作时,回调函数会被触发,并且可以获取关于鼠标事件的详细信息。

cv2.setMouseCallback(windowName, mouse_cb, param=None)
参数 说明
winname 指定事件触发的窗口名称,必须是通过 cv2.namedWindow 创建的窗口。
mouse_cb (function) 回调函数,当鼠标事件发生时,该函数会被调用。
param 可以传递附加的参数,它会作为 userdata 传递给回调函数。
事件类型 说明 数值
cv2.EVENT_LBUTTONDOWN 左键按下 1
cv2.EVENT_LBUTTONUP 左键释放 4
cv2.EVENT_RBUTTONDOWN 右键按下 2
cv2.EVENT_RBUTTONUP 右键释放 5
cv2.EVENT_MBUTTONDOWN 中键按下 16
cv2.EVENT_MBUTTONUP 中键释放 17
cv2.EVENT_MOUSEMOVE 鼠标移动 0
cv2.EVENT_MOUSEWHEEL 鼠标滚轮 8
cv2.EVENT_FLAG_LBUTTON 左键按下的标志位 32
cv2.EVENT_FLAG_RBUTTON 右键按下的标志位 64
cv2.EVENT_FLAG_MBUTTON 中键按下的标志位 128
cv2.EVENT_FLAG_CTRLKEY 按下 Ctrl 键的标志位 8
cv2.EVENT_FLAG_SHIFTKEY 按下 Shift 键的标志位 16
cv2.EVENT_FLAG_ALTKEY 按下 Alt 键的标志位 32

回调函数

def mouse_cb(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)
参数 说明
event 鼠标事件类型(例如鼠标按下、移动等)。
x, y 鼠标事件发生时的坐标(相对于窗口左上角)。
flags 标志,用于指示鼠标的额外状态(如按键是否按下)。
userdata 附加参数,可以是任何类型的数据,通常用于传递额外信息。
import cv2
import numpy as np
# 创建一个空白图像
img = cv2.imread("./images/pands.png",cv2.IMREAD_COLOR )
# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(event, x, y, flags, param)
# 创建一个窗口
cv2.namedWindow("image")
# 设置回调函数
cv2.setMouseCallback("image", draw_circle)
while True:
    cv2.imshow("image", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()
import time
import cv2
import numpy as np
# 创建一个空白图像
img = cv2.imread("./images/pands.png",cv2.IMREAD_COLOR )
# 鼠标回调函数
mouse_key={
    1: "左键按下 (cv2.EVENT_LBUTTONDOWN)",
    4: "左键释放 (cv2.EVENT_LBUTTONUP)",
    2: "右键按下 (cv2.EVENT_RBUTTONDOWN)",
    5: "右键释放 (cv2.EVENT_RBUTTONUP)",
    16: "中键按下 (cv2.EVENT_MBUTTONDOWN)",
    17: "中键释放 (cv2.EVENT_MBUTTONUP)",
    0: "鼠标移动 (cv2.EVENT_MOUSEMOVE)",
    8: "鼠标滚轮 (cv2.EVENT_MOUSEWHEEL)",
    32: "左键按下的标志位 (cv2.EVENT_FLAG_LBUTTON)",
    64: "右键按下的标志位 (cv2.EVENT_FLAG_RBUTTON)",
    128: "中键按下的标志位 (cv2.EVENT_FLAG_MBUTTON)",
    8: "按下 Ctrl 键的标志位 (cv2.EVENT_FLAG_CTRLKEY)",
    16: "按下 Shift 键的标志位 (cv2.EVENT_FLAG_SHIFTKEY)",
    32: "按下 Alt 键的标志位 (cv2.EVENT_FLAG_ALTKEY)"
}
def draw_circle(event, x, y, flags, param):
    if event!=0:
        print(mouse_key[event], x, y, flags)
cv2.namedWindow('image')
cv2.setMouseCallback("image", draw_circle)

cv2.imshow('image',img)
cv2.waitKey(0)

二、滑动条事件TrackBar

        在 OpenCV 中,TrackBar 是一个滑动条控件,用来动态调整参数值,通常用于图像处理中 的实时调整,比如调整图像的亮度、对比度、阈值等。它允许用户通过拖动滑块来改变一些 参数,并实时观察效果,十分适合交互式图像处理应用。

2.1、cv2.createTrackbar()

        该函数用于在指定窗口中创建一个滑动条(TrackBar),可以用来调整某个值

cv2.createTrackbar(trackbar_name, window_name, value, count, onChange)
参数 说明
trackbar_name 滑动条的名称。
window_name 滑动条所在窗口的名称,通常是通过cv2.namedWindow() 创建的窗口。
value 滑动条的初始值。
count 滑动条的最大值(通常是255,用于RGB颜色通道)
onChange 回调函数,每次滑动条值发生变化时调用。通常设置为空函数( nothing ),如果需要某些功能,可以在回调函数 内处理。

2.2、cv2.getTrackbarPos()

         该函数用于获取滑动条(TrackBar)当前的值。通过这个函数,可以获取滑动条的值并应 用到程序中的其他部分(例如更新图像的颜色)。

cv2.getTrackbarPos(trackbar_name, window_name)
参数 说明
trackbar_name 滑动条的名称,必须与创建时一致。
window_name 滑动条所在窗口的名称,必须与创建时一致
import cv2
import numpy as np
# 创建一个窗口用于显示图像
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
cv2.moveWindow("image", 500, 300)
# 创建一个300*512 大小的黑色图像, RGB3个通道
img = np.zeros((300,600,3),dtype=np.uint8)

# 创建一个回调函数
def nothing(x):
    pass

# 创建一个滑动条
# 第一个参数性:滑动条名称
# 第二个参数:滑动条要绑定的窗口名称
# 第三个参数:滑动条初始值
# 第四个参数:滑动条最大值
# 第五个参数:滑动条回调函数
cv2.createTrackbar("R","image",0,255,nothing) # 红色通道
cv2.createTrackbar("G","image",0,255,nothing) # 绿色通道
cv2.createTrackbar("B","image",0,255,nothing) # 蓝色通道


while True:
    # 显示当前的图像窗口
    cv2.imshow("image",img)

    # 等待按键事件
    key = cv2.waitKey(1)

    if key == ord('q'):
            break
    
    # 获取滑动条的值
    # 第一个参数:滑动条名称
    # 第二个参数:滑动条要绑定的窗口名称
    r = cv2.getTrackbarPos("R","image") # 获取红色通道
    g = cv2.getTrackbarPos("G","image") # 获取绿色通道
    b = cv2.getTrackbarPos("B","image") # 获取蓝色通道

    # 获取滑动条的值  注意颜色顺序  BGR
    img[:] = [b,g,r]

# 关闭所有窗口
cv2.destroyAllWindows()

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐