اهداف
- یادگیری کار با نوار های لغزنده (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 پنجره بسته میشود.