【OpenCV-Python】教程:1-5 TrackerBar

文章目录

  • 【目标】
    • 【代码】
    • 【接口】
    • 【小栗子】
    • 【参考】

【目标】

  • 学会将Trakbar绑定到OpenCV窗口
  • cv.getTrackbarPos(), cv.createTrackbar()

【代码】

【OpenCV-Python】教程:1-5 TrackerBar_第1张图片

import numpy as np
import cv2 

# 空函数
def nothing(x):
    pass

# 创建图像
img = np.zeros((300,512,3), np.uint8)
cv2.namedWindow('image')

# 为彩色图像创建trackbar
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)

# create switch for ON/OFF functionality
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)


while(1):
    cv2.imshow('image', img)  
    if cv2.waitKey(2) & 0xFF == 27:
        break
  
    # 获取当前位置值
    r = cv2.getTrackbarPos('R','image')
    g = cv2.getTrackbarPos('G','image')
    b = cv2.getTrackbarPos('B','image')
    s = cv2.getTrackbarPos(switch,'image')
  
    # 如果关闭,就是黑图像
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b,g,r]

cv2.destroyAllWindows()

【接口】

int cv::createTrackbar ( const String & 	trackbarname,
const String & 	winname,
int * 	value,
int 	count,
TrackbarCallback 	onChange = 0,
void * 	userdata = 0 
);	

// # 返回trackbar的位置
int cv::getTrackbarPos ( const String & 	trackbarname,
const String & 	winname 
);
cv2.createTrackbar(trackbarName, windowName, value, count, onChange) -> None

# 返回trackbar的位置
cv2.getTrackbarPos(trackbarname, winname) -> retval

参数

  • trackbarname: trackbar名字
  • winname: trackbar父窗口名字
  • value: 整型值,反映trackbar的位置,一旦创造,slider的位置被该值定义
  • count: slider的最大值,最小值总是为0
  • onChange: 是一个函数指针,当slider位置发生变化时被调用,函数原型必须是 void Foo(int, void*), 其中第一个参数为trackbar的位置,第二个参数为用户数据。如果是空函数,则什么都不做,只是改变值。
  • userdata: 用户数据可以传输到回调函数里,可以处理trackbar事件无需定义全局变量。

【小栗子】

做一个简单的画图程序,可以改变画笔的颜色和粗细。

【OpenCV-Python】教程:1-5 TrackerBar_第2张图片

SHOW ME THE CODE

import numpy as np
import cv2

# 创建图像
img = np.zeros((400, 800, 3), np.uint8)
cv2.namedWindow('image')

r, g, b = 0, 0, 0
c = 0
ix,iy = -1,-1
drawing = False
thickness = -1

# 鼠标的回调函数
def draw_circle(event, x, y, flags, param):
    global ix, iy, drawing, r, g, b, c, thickness
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            cv2.circle(param, (x, y), 5, (b, g, r), thickness)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.circle(param, (x, y), 5, (b, g, r), thickness)


# 空函数
def nothing(x):
    pass

# 为彩色图像创建trackbar
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)
cv2.createTrackbar('clear', 'image', 0, 1, nothing)
cv2.createTrackbar('thickness', 'image', 0, 30, nothing)

# 设置鼠标事件
cv2.setMouseCallback('image', draw_circle, img)

while (1):
    cv2.imshow('image', img)
    if cv2.waitKey(2) & 0xFF == 27:
        break

    # 获取当前位置值
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    c = cv2.getTrackbarPos('clear', 'image')
    thickness = cv2.getTrackbarPos('thickness', 'image')
  
    # 清空画布
    if c == 0:
        img[:] = 0


cv2.destroyAllWindows()

【参考】

  1. https://docs.opencv.org/4.5.5/d9/dc8/tutorial_py_trackbar.html

你可能感兴趣的:(#,Python,#,OpenCV,opencv,python)