博客 / 詳情

返回

『OpenCV-Python』Trackbar控件的用法

點贊 + 關注 + 收藏 = 學會了

推薦關注 《OpenCV-Python專欄》

在 OpenCV 中,Trackbar 控件(滑塊)是一個非常常用的 GUI 組件,用於在圖像處理和計算機視覺任務中進行交互式調整參數。比如説,加載一個圖片,通過一個滑塊調整圖片的亮度,這樣便於我們用肉眼觀察圖片的變化。

Trackbar 允許用户通過拖動滑塊來調整參數的值,並且會實時更新顯示結果。

01.gif

比如上圖這個例子,創建了3個 Trackbar 控件分別控制圖片的 R、G、B 三個通道。拖拽不同通道的滑塊後,圖片對應的顏色也會跟着修改。

在 OpenCV 中使用 Trackbar 需要用到2個方法:cv2.createTrackbar()cv2.getTrackbarPos()

創建滑塊控件

cv2.createTrackbar() 用於創建一個滑塊(Trackbar)控件,它接受5個參數。

cv2.createTrackbar(trackbarname, winname, value, count, onChange)
  • trackbarname:滑塊的名稱(字符串),在窗口中顯示。
  • winname:窗口的名稱,滑塊將被添加到這個窗口中。這個窗口必須在調用 cv2.createTrackbar() 之前通過 cv2.namedWindow() 創建。
  • value:滑塊的初始值(整數),表示滑塊的默認位置。
  • count:滑塊的最大值(整數),表示滑塊的可調範圍。例如,設置為 255 表示滑塊的範圍是 0 到 255。
  • onChange:回調函數。當滑塊值發生變化時,onChange 函數會被調用。它接收滑塊的新值作為參數。如果不需要回調函數,可以傳入一個空函數 nothing()。

獲取滑塊當前值

cv2.getTrackbarPos() 用於獲取滑塊的當前位置(即當前的值),它接受2個參數。

cv2.getTrackbarPos(trackbarname, winname)
  • trackbarname:要獲取值的滑塊名稱。該名稱必須與創建滑塊時使用的名稱一致。
  • winname:包含滑塊的窗口名稱。該窗口應該已經通過 cv2.namedWindow() 創建。

舉個例子

使用 numpy 要創建一個 480 x 640 像素的圖片,這個圖片每個像素有3個通道,分別代表R(紅)、G(綠)、B(藍)。用鼠標滑動滑塊後,圖片每個像素的顏色值也會隨之發生變化。

01.gif

import cv2
import numpy as np

# 初始化默認的RGB通道值
r = 0
g = 0
b = 0

# 回調函數,當滑塊值變化時觸發
def nothing(x):
    pass

# 創建一個窗口
cv2.namedWindow('RGB Control')

# 創建三個滑塊,分別控制 RGB 通道的值
cv2.createTrackbar('Red', 'RGB Control', 0, 255, nothing)
cv2.createTrackbar('Green', 'RGB Control', 0, 255, nothing)
cv2.createTrackbar('Blue', 'RGB Control', 0, 255, nothing)

# 循環顯示窗口,實時更新 TrackBar 的值
while True:
    # 獲取滑塊的當前值
    r = cv2.getTrackbarPos('Red', 'RGB Control')
    g = cv2.getTrackbarPos('Green', 'RGB Control')
    b = cv2.getTrackbarPos('Blue', 'RGB Control')

    # 創建一個新的圖像,初始為全黑(0, 0, 0)
    img = np.zeros((480, 640, 3), dtype=np.uint8)

    # 設置圖像的RGB通道值
    img[:, :, 0] = b  # 藍色通道
    img[:, :, 1] = g  # 綠色通道
    img[:, :, 2] = r  # 紅色通道

    # 顯示圖像
    cv2.imshow('RGB Control', img)

    # 按 'ESC' 鍵退出
    if cv2.waitKey(1) & 0xFF == 27:
        break

# 關閉窗口
cv2.destroyAllWindows()

需要注意,在 OpenCV 中,圖片裏的像素通道排序是 [B, G, R],和我們平時説的“RGB”排序是反過來的。切記切記。


點贊 + 關注 + 收藏 = 學會了

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.