اهداف

  • یادگیری کار با نوار های لغزنده (trackbar)
  • کار با cv.getTrackbarPos() و cv.createTrackbar()

نمونه کد

اینجا میخوایم یه برنامه ساده بسازیم تا با استفاده از نوار لغزنده و سه عمل RGB رنگ تولید کنیم تابع cv.createTrackbar() یک نوار لغزنده میسازد و چهار ورودی میگیرد اولین ورودی : نام نوار لغزنده دومین ورودی : نام پنجره ای که نوار به آن وصل میشود سومین ورودی : مقدار پبش فرض چهارمین ورودی : بیشترین مقدار پنحمین ورودی : تابع callback که تغییرات لحظه به لحظه ما در نوار را روی صفحه نشان میدهد.

ما در کتابخانه opencv دکمه نداریم برای همین اینجا از نوار لغزنده به عنوان سوییچ استفاده میکنیم که بتوانیم صفحه رو کنترل کنیم

import numpy as np
import cv2 as cv
 
def nothing(x):
    pass
 
# Create a black image, a window
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')
 
# create trackbars for color change
cv.createTrackbar('R','image',0,255,nothing)
 
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
 
# create switch for ON/OFF functionality
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)
 
while(1):
    cv.imshow('image',img)
    k = cv.waitKey(1) & 0xFF
    if k == 27:
        break
 
    # get current positions of four trackbars
    r = cv.getTrackbarPos('R','image')
    g = cv.getTrackbarPos('G','image')
    b = cv.getTrackbarPos('B','image')
    s = cv.getTrackbarPos(switch,'image')
 
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b,g,r]
 
cv.destroyAllWindows()

توضیحات

ابتدا با numpy یک بلوک سه کاناله ساختیم

img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')

سپس سه نوار با اسم های R و G و B ساختیم که مقادیر بین 0 و 255 دارند از تابع nothing به عنوان callback استفاده کردیم

cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)

سپس یک سوییچ ساختیم با مقادیر 0 یا 1 که بتوانیم صفحه رو کنترل کنیم

switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)

حلقه اصلی برنامه که یک حلقه بینهایت است و اگر کلید 27 یا همان esc فشرده شود برنامه تمام میشود

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

این قسمت مقادیر را هر لحظه دریافت میکند

r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')

سپس وضعیت سوییچ برسی میشود و رنگ صفحه به روزرسانی میشود

if s == 0:
    img[:] = 0
else:
    img[:] = [b,g,r]

و در نهیات با استفاده از cv.destroyAllWindows() بعد از فشرده شدن Esc پنجره بسته میشود.