diff --git a/src/02.StartWithImage.md b/src/02.StartWithImage.md index cf93935..12adc14 100644 --- a/src/02.StartWithImage.md +++ b/src/02.StartWithImage.md @@ -52,6 +52,10 @@ if img is None: این تابع یک ورودی دارد که نشان دهنده مدت زمانیست که برنامه باید برای ورودی کاربر صبر کند. ورودی تابع int است و به میلی ثانیه هستند. صفر نشان دهنده این است که برنامه باید برای همیشه صبر کند. +به عنوان مثال اگر عدد 5000 رابه تابع بدهیم +`cv.waitkey(5000)` به مدت 5 ثانیه صبر میکند +واحد میلی ثانیه است. +اگر عدد صفر به تابع داده شود برای همیشه صبر میکند برای همین بهتر است از `cv.destroyAllWindows` بعد از `cv.waitkey(0)` استفاده شود. ```python cv.imshow("Display window", img) @@ -64,7 +68,47 @@ k = cv.waitKey(0) ```python if k == ord("s"): cv.imwrite("starry_night.png", img) + ``` + + + +اگر با عکس هایی با کیفیت بالا استفاده میکنید میتوانید با استفاده از `cv.resize()` کیفیت عکس را تغییر دهید +```python +import cv2 as cv +import sys + +# خواندن تصویر +img = cv.imread(cv.samples.findFile("starry_night.jpg")) + +# بررسی اینکه آیا تصویر با موفقیت بارگذاری شده است +if img is None: + sys.exit("Could not read the image.") + +# تغییر اندازه تصویر به ابعاد جدید (مثلاً نصف اندازه اصلی) +width = int(img.shape[1] * 0.5) # عرض تصویر جدید (50٪ از عرض اصلی) +height = int(img.shape[0] * 0.5) # ارتفاع تصویر جدید (50٪ از ارتفاع اصلی) +new_size = (width, height) + +# تغییر اندازه تصویر +resized_img = cv.resize(img, new_size, interpolation=cv.INTER_LINEAR) + +# نمایش تصویر اصلی و تصویر تغییر اندازه یافته +cv.imshow("Original Image", img) +cv.imshow("Resized Image", resized_img) + +# منتظر بماند تا کاربر کلیدی را بفشارد +cv.waitKey(0) + +# بستن همه پنجره‌ها +cv.destroyAllWindows() + +``` +تابع `cv.resize()` سه ورودی میگیرد +اولین ورودی عکس اصلی و دومین ورودی یک تاپل که به صورت `(عرض , ارتفاع)` است داده میشود +سومین ورودی روش درون‌یابی است که در اینجا از `cv.INTER_LINEAR` استفاده کردیم. +روش درون یابی در اصل همان روشی است که کمک میکند هنگام تغییر سایزی پیکسل های جدید کم و زیاد شوند +مطالعه بقیه روش ها به عهده خودتون. diff --git a/src/06.ColorPallette.md b/src/06.ColorPallette.md new file mode 100644 index 0000000..a2cc07d --- /dev/null +++ b/src/06.ColorPallette.md @@ -0,0 +1,104 @@ +# اهداف +* یادگیری کار با نوار های لغزنده (trackbar) +* کار با `cv.getTrackbarPos()` و `cv.createTrackbar()` + +# نمونه کد +اینجا میخوایم یه برنامه ساده بسازی تا با استفاده از نوار لغزنده و سه عمل RGB رنگ تولید کنیم +تابع `cv.createTrackbar()` یک نوار لغزنده میسازد و چهار ورودی میگیرد +اولین ورودی : نام نوار لغزنده +دومین ورودی : نام پنجره ای که نوار به آن وصل میشود +سومین ورودی : مقدار پبش فرض +چهارمین ورودی : بیشترین مقدار +پنحمین ورودی : تابع callback که تغییرات لحظه به لحظه ما در نوار را روی صفحه نشان میدهد. + +ما در کتابخانه opencv دکمه نداریم برای همین اینجا از نوار لغزنده به عنوان سوییچ استفاده میکنیم +که بتوانیم صفحه رو کنترل کنیم + +```python +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 یک بلوک سه کاناله ساختیم +```pyhton +img = np.zeros((300,512,3), np.uint8) +cv.namedWindow('image') +``` +سپس سه نوار با اسم های R و G و B ساختیم که مقادیر بین 0 و 255 دارند +از تابع `nothing` به عنوان callback استفاده کردیم + +```python +cv.createTrackbar('R','image',0,255,nothing) +cv.createTrackbar('G','image',0,255,nothing) +cv.createTrackbar('B','image',0,255,nothing) +``` +سپس یک سوییچ ساختیم با مقادیر 0 یا 1 که بتوانیم صفحه رو کنترل کنیم + +```python +switch = '0 : OFF \n1 : ON' +cv.createTrackbar(switch, 'image',0,1,nothing) +``` +حلقه اصلی برنامه که یک حلقه بینهایت است و اگر کلید 27 یا همان esc فشرده شود برنامه تمام میشود + +```python +while(1): + cv.imshow('image',img) + k = cv.waitKey(1) & 0xFF + if k == 27: + break +``` +این قسمت مقادیر را هر لحظه دریافت میکند +```python +r = cv.getTrackbarPos('R','image') +g = cv.getTrackbarPos('G','image') +b = cv.getTrackbarPos('B','image') +s = cv.getTrackbarPos(switch,'image') +``` +سپس وضعیت سوییچ برسی میشود +```python +if s == 0: + img[:] = 0 +else: + img[:] = [b,g,r] + +``` +و در نهیات با استفاده از `cv.destroyAllWindows()` بعد از فشرده شدن Esc پنجره بسته میشود. + + + diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 4ed3652..8da8321 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -4,4 +4,5 @@ - [ شروع به کار با عکس](./02.StartWithImage.md) - [شروع به کار با ویدیو](./03.StartWithVideo.md) - [توابع رسم](./04.DrawingFunc.md) -- [مدیریت موس](./05.MouseHandling.md) \ No newline at end of file +- [مدیریت موس](./05.MouseHandling.md) +- [پنل رنگ](./06.ColorPallette.md) \ No newline at end of file