<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Hesam Mohebi</title><link>https://virgool.ir/feed/@mohebi.hesam</link><description></description><language>fa</language><pubDate>2026-11-11 04:44:28</pubDate><image><url>https://files.virgool.ir/upload/users/167794/avatar/TErLKN.jpg</url><title>Hesam Mohebi</title><link>https://virgool.ir/@mohebi.hesam</link></image><item><title>معرفی کتابخانه OpenCv بخش ۶</title><link>https://virgool.ir/@mohebi.hesam/معرفی-کتابخانه-opencv-بخش-۶-b3acmw6kod3x</link><description>توی این پست ادامه مبحث مربوط به thresholding  با استفاده از تابع inRange و تابع HSV توضیح میدم . خب اول از همه یه توضیحی در مورد فضای رنگی HSV میدم که چیه و کلا به چه کاری میاد .فضای رنگی HSV که مخفف (Hue  Saturation Value ) هست یه مدل برای مشخص کردن وضعیت رنگی یک تصویر یا پیکسل توی فضا رنگی هست و شباهت زیادی به مدل RGB  داره . همونطور که میدونید توی مدل RGB ما اگه هر یک از رنگ های آبی ٬ قرمز و سبز یک محور بردار در نظر بگیریم ٬ میتونیم توی یک فضای سه بعدی تمام رنگ هارو شبیه سازی کنیم مثلا مختصات (255,255,255) رنگ سفید بهمون میده یا (66,245,167) رنگ آبی فیروزه ای رو درست می کنه حالا توی HSV هم همینطوره منتهی به یه شکلی دیگه ای نشون میدن .توی مدل رنگی HSV به جای اینکه به سه تا مولفه x,y,z داشته باشیم که یک فضای مکعبی بسازه ٬ یه فضای استوانه ای داریم که هر مولفشو جدا توضیح میدم ‌. مولفه رنگ (Hue): این مولفه که از بازه صفر تا ۳۶۰ هست رنگ پیکسل رو مشخص می کنه مثلا اگه پیکسل قرمز باشه مقدارش حدودا ۳۲۰ هست و اگه آبی باشه حدودا ۱۶۰  هست . پس کل طیف های رنگی روی ۳۶۰ درجه پخش شدند . مولفه اشباع (Saturation):این مولفه از بازه صفر تا 255 هست و تعیین کننده میزان پر رنگی یا کم رنگی پیکسل هست . اگه مقدارش صفر باشه پیسکل سفیده و اگه ۲۵۵ باشه پررنگ ترین رنگ اون زاویه رو نشون میده مولفه مقدار (Value):‌این مولفه هم از بازه صفر تا 255 قرار داره و میزان تیرگی یا روشنی پیکسل رو مشخص می کنه اگه یادتون باشه توی پست قبلی ما تصویر های که روشون آستانه تعیین می کردیم همه توی کانال خاکستری بودند مقداری که این مولفه داره دقیقا همون مقداری هست که مولفه y توی پست قبلی داشت یعنی اگه اگه صفر باشه سیاهه و ۲۵۵ هم باشه سفید یا روشنترین حالت پیکسل رو نشون میده . مدل های رنگی دیگه ای هم مثل HSL هستند که استفاده میشند اما فعلا به همین مدل اکتفا می کنیم . خب بریم سراغ کد !import cv2 as cv&#xA;&#xA;max_value = 255&#xA;max_value_H = 360 // 2&#xA;low_H = 0&#xA;low_S = 0&#xA;low_V = 0&#xA;high_H = max_value_H&#xA;high_S = max_value&#xA;high_V = max_value&#xA;window_capture_name = &#39;Video Capture&#39;&#xA;window_detection_name = &#39;Object Detection&#39;&#xA;low_H_name = &#39;Low H&#39;&#xA;low_S_name = &#39;Low S&#39;&#xA;low_V_name = &#39;Low V&#39;&#xA;high_H_name = &#39;High H&#39;&#xA;high_S_name = &#39;High S&#39;&#xA;high_V_name = &#39;High V&#39;مثل همیشه با نام و یاد خدا کتابخونه رو اد میکنیم و یه سری مقادیر تعیین می کنیم که توی تعیین پارامتر های توابع به کار میاند . cap = cv.VideoCapture(2)&#xA;cv.namedWindow(window_capture_name)&#xA;cv.namedWindow(window_detection_name)&#xA;&#xA;cv.createTrackbar(low_H_name, window_detection_name, low_H, max_value_H, on_low_H_thresh_trackbar)&#xA;&#xA;cv.createTrackbar(high_H_name, window_detection_name, high_H, max_value_H, on_high_H_thresh_trackbar)&#xA;&#xA;cv.createTrackbar(low_S_name, window_detection_name, low_S, max_value, on_low_S_thresh_trackbar)&#xA;&#xA;cv.createTrackbar(high_S_name, window_detection_name, high_S, max_value, on_high_S_thresh_trackbar)&#xA;&#xA;cv.createTrackbar(low_V_name, window_detection_name, low_V, max_value, on_low_V_thresh_trackbar)&#xA;&#xA;cv.createTrackbar(high_V_name, window_detection_name, high_V, max_value, on_high_V_thresh_trackbar)خب قدم بعدی دادن دسترسی به وبکمه اگه هم از ویدیو یا تصویر از قبل استفاده می کنید مثل پست های قبلی آدرس اون فیلم رو داخل تابع بزارید . بعد ما میایم دوتا پنجره تعریف می کنیم یکی برای نشون دادن تصویر اورجینال وبکم و یکی هم برای نشون دادن خروجی تابع inRange بعدشم که یه سری بار مثل قبل برای تعیین پارامتر در لحظه ایجاد می کنیم . def on_low_H_thresh_trackbar(val):&#xA;    global low_H&#xA;    global high_H&#xA;    low_H = val&#xA;    low_H = min(high_H - 1, low_H)&#xA;    cv.setTrackbarPos(low_H_name, window_detection_name, low_H)&#xA;&#xA;&#xA;def on_high_H_thresh_trackbar(val):&#xA;    global low_H&#xA;    global high_H&#xA;    high_H = val&#xA;    high_H = max(high_H, low_H + 1)&#xA;    cv.setTrackbarPos(high_H_name, window_detection_name, high_H)&#xA;&#xA;&#xA;def on_low_S_thresh_trackbar(val):&#xA;    global low_S&#xA;    global high_S&#xA;    low_S = val&#xA;    low_S = min(high_S - 1, low_S)&#xA;    cv.setTrackbarPos(low_S_name, window_detection_name, low_S)&#xA;&#xA;&#xA;def on_high_S_thresh_trackbar(val):&#xA;    global low_S&#xA;    global high_S&#xA;    high_S = val&#xA;    high_S = max(high_S, low_S + 1)&#xA;    cv.setTrackbarPos(high_S_name, window_detection_name, high_S)&#xA;&#xA;&#xA;def on_low_V_thresh_trackbar(val):&#xA;    global low_V&#xA;    global high_V&#xA;    low_V = val&#xA;    low_V = min(high_V - 1, low_V)&#xA;    cv.setTrackbarPos(low_V_name, window_detection_name, low_V)&#xA;&#xA;&#xA;def on_high_V_thresh_trackbar(val):&#xA;    global low_V&#xA;    global high_V&#xA;    high_V = val&#xA;    high_V = max(high_V, low_V + 1)&#xA;    cv.setTrackbarPos(high_V_name, window_detection_name, high_V)قدم بعدی که در واقع قبل از گرفتن ورودی وبکم انجام میشه ساختن توابع مربوط به بار هایی هست که ساختیم و کارش اینه که مقداری که هر بار داره رو داخل متغییر هایی که اول کار تعریف کردیم بریزه . while True:&#xA;    ret, frame = cap.read()&#xA;    if frame is None:&#xA;        break&#xA;    frame_HSV = cv.cvtColor(frame, cv.COLOR_BGR2HSV)&#xA;    frame_threshold = cv.inRange(frame_HSV, (low_H, low_S, low_V), (high_H, high_S, high_V))&#xA;    cv.imshow(window_capture_name, frame)&#xA;    cv.imshow(window_detection_name, frame_threshold)&#xA;&#xA;    key = cv.waitKey(30)&#xA;    if key == ord(&#39;q&#39;):&#xA;        breakقدم بعدی هم گرفتن هر فریم وبکم ٬ تغییر اون از مدل BGR به HSV و گذاشتن اون توی تابع inRange هست.  یه توضیحی که بخوام در مورد این تابع بدم اینه که خروجیش دقیقا مثل تابع آستانه باینری هست یعنی هر پیکسلی که مقادیر HSV اون از آستانه ای که ما تعیین کردیم بیشتر باشه سفید نشون میده و هر پیکسلی که کمتر باشه سیاه نشون میده. خب حالا خروجی که ما میگیریم یه همچین چیزی میشه ‌:‌دوتا ویندو داریم که یکی تصویر اورجینال وبکم و اون یکی خروجی تابع inRange رو با توجه به پارامتر هایی که تعیین کردیم بهمون میده حالا اصن به چه دردی میخوره !باز تو مباحث مربوط به تشخیص اشیا به کمک رنگ این تابع و شناخت داشتن به اون میتونه خیلی کمک بکنه یعنی میشه خیلی راحت به کمک این توابع آستانه ای برای تصویر تعیین کرد که صرفا جسم مورد نظر مارو خروجی بده به عنوان مثال با همین تصویر ورودیمون میتونیم پارامتر ها رو جوری تنظیم کنیم که فقط رنگ قرمز رو تشخیص بده ‌:‌یا مثلا یه جسم دیگه :‌همونطور که میبینید ما تو خروجی یکم نویز داریم و همونطور که قبلا گفتم میشه با یه تابعی مثلا erode این نویز هارو حذف کرد . نسخه نویز دار:‌نسخه تحلیل رفته :خب ! اینم از این پست امیدوارم که مطلب مفیدی بوده باشه سورس کدم همینجا میزارم که خودتون اگه دوست داشتید تست کنید . import cv2 as cv&#xA;&#xA;max_value = 255&#xA;max_value_H = 360 // 2&#xA;low_H = 0&#xA;low_S = 0&#xA;low_V = 0&#xA;high_H = max_value_H&#xA;high_S = max_value&#xA;high_V = max_value&#xA;window_capture_name = &#39;Video Capture&#39;&#xA;window_detection_name = &#39;Object Detection&#39;&#xA;low_H_name = &#39;Low H&#39;&#xA;low_S_name = &#39;Low S&#39;&#xA;low_V_name = &#39;Low V&#39;&#xA;high_H_name = &#39;High H&#39;&#xA;high_S_name = &#39;High S&#39;&#xA;high_V_name = &#39;High V&#39;&#xA;&#xA;&#xA;def on_low_H_thresh_trackbar(val):&#xA;    global low_H&#xA;    global high_H&#xA;    low_H = val&#xA;    low_H = min(high_H - 1, low_H)&#xA;    cv.setTrackbarPos(low_H_name, window_detection_name, low_H)&#xA;&#xA;&#xA;def on_high_H_thresh_trackbar(val):&#xA;    global low_H&#xA;    global high_H&#xA;    high_H = val&#xA;    high_H = max(high_H, low_H + 1)&#xA;    cv.setTrackbarPos(high_H_name, window_detection_name, high_H)&#xA;&#xA;&#xA;def on_low_S_thresh_trackbar(val):&#xA;    global low_S&#xA;    global high_S&#xA;    low_S = val&#xA;    low_S = min(high_S - 1, low_S)&#xA;    cv.setTrackbarPos(low_S_name, window_detection_name, low_S)&#xA;&#xA;&#xA;def on_high_S_thresh_trackbar(val):&#xA;    global low_S&#xA;    global high_S&#xA;    high_S = val&#xA;    high_S = max(high_S, low_S + 1)&#xA;    cv.setTrackbarPos(high_S_name, window_detection_name, high_S)&#xA;&#xA;&#xA;def on_low_V_thresh_trackbar(val):&#xA;    global low_V&#xA;    global high_V&#xA;    low_V = val&#xA;    low_V = min(high_V - 1, low_V)&#xA;    cv.setTrackbarPos(low_V_name, window_detection_name, low_V)&#xA;&#xA;&#xA;def on_high_V_thresh_trackbar(val):&#xA;    global low_V&#xA;    global high_V&#xA;    high_V = val&#xA;    high_V = max(high_V, low_V + 1)&#xA;    cv.setTrackbarPos(high_V_name, window_detection_name, high_V)&#xA;&#xA;&#xA;&#xA;cap = cv.VideoCapture(2)&#xA;cv.namedWindow(window_capture_name)&#xA;cv.namedWindow(window_detection_name)&#xA;cv.createTrackbar(low_H_name, window_detection_name, low_H, max_value_H, on_low_H_thresh_trackbar)&#xA;cv.createTrackbar(high_H_name, window_detection_name, high_H, max_value_H, on_high_H_thresh_trackbar)&#xA;cv.createTrackbar(low_S_name, window_detection_name, low_S, max_value, on_low_S_thresh_trackbar)&#xA;cv.createTrackbar(high_S_name, window_detection_name, high_S, max_value, on_high_S_thresh_trackbar)&#xA;cv.createTrackbar(low_V_name, window_detection_name, low_V, max_value, on_low_V_thresh_trackbar)&#xA;cv.createTrackbar(high_V_name, window_detection_name, high_V, max_value, on_high_V_thresh_trackbar)&#xA;&#xA;while True:&#xA;    ret, frame = cap.read()&#xA;    if frame is None:&#xA;        break&#xA;    frame_HSV = cv.cvtColor(frame, cv.COLOR_BGR2HSV)&#xA;    frame_threshold = cv.inRange(frame_HSV, (low_H, low_S, low_V), (high_H, high_S, high_V))&#xA;    cv.imshow(window_capture_name, frame)&#xA;    cv.imshow(window_detection_name, frame_threshold)&#xA;    frame_erode = cv.erode(frame_threshold, None, iterations=4)&#xA;    cv.imshow(&#34;new window&#34;, frame_erode)&#xA;&#xA;    cv.imwrite(&#34;res.jpg&#34;, frame_threshold)&#xA;    cv.imwrite(&#34;res2.jpg&#34;, frame)&#xA;    cv.imwrite(&#34;res3.jpg&#34;, frame_erode)&#xA;&#xA;    key = cv.waitKey(30)&#xA;    if key == ord(&#39;q&#39;) or key == 27:&#xA;        break</description><category>Hesam Mohebi</category><author>Hesam Mohebi</author><pubDate>Thu, 08 Sep 2022 17:24:13 +0430</pubDate></item><item><title>معرفی کتابخانه OpenCv بخش ۵</title><link>https://virgool.ir/@mohebi.hesam/معرفی-کتابخانه-opencv-بخش-۵-qirpnqfwqsuz</link><description>توی این پست می خوام مفهوم آستانه گذاری (thresholding) با استفاده از  توابع threshold و inRange رو یه توضیحی بدم . به طور کلی اگه بخوام خلاصه بگم٬ thresholding به عملی گفته میشه که ما میایم یه شرط گلوگاهی برای تصویرمون تعیین می کنیم و براساس اون شرط ٬ یه خروجی از تصویر میگیریم. این روش یکی از ساده ترین شیوه های تقسیم بندی تصویر هست و کاربرد های زیادی داره مثلا ما توی بحث تشخیص اشیا به کمک آستانه گذاری می تونیم یه جسم رو از پس زمینه جدا کنیم یا بر اساس طیف رنگی که داره اون جسم رو تشخیص بدیم . اول از تابع threshold شروع می کنم . به کمک این تابع ما میتونیم به پنج طریق آستانه گذاری کنیم ٬ برای درک بهتر مطلب فرض کنید ما یه تصویر ورودی داریم  که شدت مقادیر اون به شکل زیر هست و خط افقی آبی هم آستانه ما هستش . این تصویرو من یه توضیح اضافی بدم فرض کنید که ما همه پیکسل های تصویر رو توی محور x نمودار داریم یعنی به جای اینکه پیکسل های مختصات دو بعدی داشته باشند همشون رو ما به صف کردیم و توی محور x قرار دادیم و شدت پیسکل هم که مقدار y میشه میزان پر رنگی و کم رنگی پیکسل هست ( اگه یادتون باشه توی پست های قبلی گفتم که ما میتونیم یه تصویر رو فقط رو کانال خاکستری داشته باشیم که ۰ میشه سیاه و ۲۵۵ میشه سفید یا اینکه روی کانال BGR که رنگ های آبی و سبز و قرمز هست که هر کدوم از بازه ۰ تا ۲۵۵ متغییره حالا اینجا ما فقط روی کانال خاکستری کار می کنیم ).آستانه باینری (Threshold Binary)توی این روش آستانه گذاریم ما میگیم هرچی پیکسل شدتش از آستانه ما بیشتر بود ۲۵۵ باشه و هرچی پایین تر بود صفر باشه فورمول ریاضیش هم این شکلی میشه :‌و طبق این فورمول خروجی نمودار بالا همچین چیزی میشه :‌و اتفاقی که توی تصویر می افته اینه که پیسکل های تصویر یا سیاه هست یا سفید . به عنوان مثال اگه تصویر ورودیمون جناب شرک باشه :اول کار  از کانال رنگی میبریمش خاکستری :‌بعدش آستانمون رو تعیین می کنیم که توی کد به این شکل میشه :‌_, dst = cv.threshold(src_gray, 120, 255, 0)پارامتر اول تصویر ورودیه که همین تصویر خاکستری بالاست دومی اندازه آستانه که من دادم ۱۲۰ که حدودا نصف تصویر رو سیاه می کنه پارامتر بعدی حداکثر مقدار هست و پارامتر آخر هم نوع آستانمون که همونطوری که گفتم باینری هست . و خروجی تصویر به این شکل میشه :آستانه باینری، معکوس(Threshold Binary, Inverted)همون آستانه باینریه فقط اومدیم برعکس کردیم یعنی وقتی از آستانه بیشتر بود صفر باشه کمتر بود 255 .تصویری هم که میگیریم این شکلی میشه :‌_, dst = cv.threshold(src_gray, 120, 255, 1)کدشم همونه فقط پارامتر آخر شده یک . کوتاه کردن (Truncate)توی این روش هر پیکسلی که شدتش از آستانه بیشتر بود ٬ شدتش برابر میشه با مقدار آستانه :‌و نمودارشم این شکلی میشه :‌کدشم همونه فقط پارامتر آخر میشه دو و خروجی تصویر هم این شکلی میشه :‌آستانه تا صفر (Threshold to Zero)خب فرقی که این روش با باینری داره اینه که در صورتی که کمتر از آستانه باشه صفر میشه و اگه بیشتر باشه همون مقدار خودشه . و نمودارشم این شکلی میشه :‌مثلا یه کاری که با این آستانه میشه کرد اینه که ببینیم روشن ترین یا تاریک ترین نقاط تصویر کجاست یا تو یه مثال پیشرفته تر میشه منبع نور رو تشخیص داد . تصویر خروجی :‌آستانه تا صفر معکوس (Threshold to Zero inverted)اینم مثه همون آستانه دومیه فقط تنها فرقش اینه که به جای اینکه شدت پیکسل های 255 بشه همون مقدای که دارند میمونند . و تصویر خروجی :‌خب حالا میریم سره توضیح دادن کد . قبل از اینکه شروع کنم بگم که سورس کد اصلی مال خود سایت opencv بود منتهی من یکم دست بردم توش که تو درک مطلب کمک کنه . اول کار مثل همیشه با نام و یاد خدا کتابخونه هارو اضافه می کنیم و تصویرو ورودی میگیریم و از کانال رنگی میبریمش کانال خاکستری :src = cv.imread(&#34;shrek.jpg&#34;)&#xA;src = cv.resize(src,(900,450))&#xA;# Convert the image to Gray&#xA;src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)بعدش میایم یه پنجره میسازیم که توش دوتا بار یکی برای تعیین نوع آستانه و یکی دیگه برای مقداری آستانه قرار داره :cv2.imwrite(&#34;gray_shrek.jpg&#34;, src_gray)&#xA;cv.namedWindow(window_name)&#xA;cv.createTrackbar(trackbar_type, window_name , 3, max_type, Threshold_Demo)&#xA;# Create Trackbar to choose Threshold value&#xA;cv.createTrackbar(trackbar_value, window_name , 0, max_value, Threshold_Demo)بعدش برا اینکه تمیز تر باشه یه تابع میسازیم و کارایی که می خوایم رو توی اون انجام میدیم :‌def Threshold_Demo(val):&#xA;    #0: Binary&#xA;    #1: Binary Inverted&#xA;    #2: Threshold Truncated&#xA;    #3: Threshold to Zero&#xA;    #4: Threshold to Zero Inverted&#xA;    threshold_type = cv.getTrackbarPos(trackbar_type, window_name)&#xA;    threshold_value = cv.getTrackbarPos(trackbar_value, window_name)&#xA;    _, dst = cv.threshold(src_gray, threshold_value, max_binary_value, threshold_type )&#xA;    cv.imshow(window_name, dst)خب اون دوتا خط بعد کامنتا میاد نوع آستانه و مقدارشو توی دوتا متغییر میریزه و بعد با استفاده از تابع  threshold میام متغیر هارو جایگذاری می کنیم . نتیجه نهایی یه ابزار مفیدی میشه واسه فیلتر کردن شدت روشنایی و کارای دیگه اینم کد کاملش :‌from __future__ import print_function&#xA;&#xA;import cv2&#xA;import cv2 as cv&#xA;&#xA;max_value = 255&#xA;max_type = 4&#xA;max_binary_value = 255&#xA;trackbar_type = &#39;Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted&#39;&#xA;trackbar_value = &#39;Value&#39;&#xA;window_name = &#39;Threshold Demo&#39;&#xA;&#xA;def Threshold_Demo(val):&#xA;    #0: Binary&#xA;    #1: Binary Inverted&#xA;    #2: Threshold Truncated&#xA;    #3: Threshold to Zero&#xA;    #4: Threshold to Zero Inverted&#xA;    threshold_type = cv.getTrackbarPos(trackbar_type, window_name)&#xA;    threshold_value = cv.getTrackbarPos(trackbar_value, window_name)&#xA;    _, dst = cv.threshold(src_gray, threshold_value, max_binary_value, threshold_type )&#xA;    cv2.imwrite(&#34;binary.jpg&#34;, dst)&#xA;&#xA;src = cv.imread(&#34;shrek.jpg&#34;)&#xA;src = cv.resize(src,(900,450))&#xA;# Convert the image to Gray&#xA;src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)&#xA;&#xA;cv.namedWindow(window_name)&#xA;cv.createTrackbar(trackbar_type, window_name , 3, max_type, Threshold_Demo)&#xA;cv.createTrackbar(trackbar_value, window_name , 0, max_value, Threshold_Demo)&#xA;&#xA;Threshold_Demo(0)&#xA;# Wait until user finishes program&#xA;cv.waitKey()خب مثکه پست طولانی شد واسه همین تابع inRange و فیلتر HSV رو میزاریم توی پست بعدی توضیح میدم . امیدوارم مفید بوده باشه و مثل همیشه اگه سوالی داشتید میتونید سرچ کنید . </description><category>Hesam Mohebi</category><author>Hesam Mohebi</author><pubDate>Thu, 08 Sep 2022 13:56:26 +0430</pubDate></item><item><title>معرفی کتابخانه OpenCv بخش ۴</title><link>https://virgool.ir/@mohebi.hesam/معرفی-کتابخانه-opencv-بخش-۴-l68opcdirz6w</link><description>توی این بخش یه نگاهی می کنیم  به مختصات پیکسل ها ٬ اندازه و برش تصویر و چیزای دیگه خب اولین نکته اینکه توی تصاویر مختصات هر پیکسل برعکس محور مختصات که از گوشه پایین سمت چپ شروع میشه از گوشه بالای چپ شروع میشه یعنی بالا چپ میشه مختصات (0,0) و پایین راست میشه اندازه پهنا و ارتفاع عکسمون . img = cv2.imread(&#34;image.jpg&#34;)&#xA;print(img.shape) &#xA;&gt;&gt; (816, 1400, 3)خب کاری که تابع shape انجام میده اینه که یه تاپل سه تایی بهمون میده که مقدار اول ارتفاع تصویر٬ دومی پهنا و سومی چنل هایی هستند که تصویر داره که تو این مثال BGR هست . تابع بعدی که قبلا هم در موردش گفته بودم resize هست که اندازه تصویر رو میشه تغییر داد باهاش .imgResize = cv2.resize(img, (300, 200))&#xA;print(imgResize.shape)&#xA;&gt;&gt; (200, 300, 3)پارامتر های این تابع عکس ورودی و پهنا و ارتفاع مدنظر هست و همینطوری که میبینید وقتی اندازه تصویر جدید رو چاپ می کنیم همون مقادیر رو میده (اینکه چرا برای تغییر اندازه اول پهناست بعد ارتفاع و وقتی اندازه رو می خوایم نشون بدیم برعکسه نمیدونم والا به نظرم خیلی مسخرست ! )تابع بعدی بریدن هست که خیلی به کار میاد توی مباحث مربوط به پردازش تصویر و یکی از دلیلاشم اینه که مثلا توی تشخیص یه شکلی ما می خوایم بر اساس رنگشون طبقه بندی کنیم کاری که میکنیم اینه که وقتی شکل رو تشخیص دادیم اونو از تصویر میبریم تا سرعت برناممون بیشتر بشه . اگه دقیق تر بخوایم بهش نگاه بکنیم هر تصویر یه ماتریسه و هرچه قدر ابعاد این ماتریس کمتر باشه گردش توش هم راحت تر هست . imgCropped = img[125:575,500:925]خب همونطور که گفتم تصویر یه ماتریسه و برای بریدن یه بخشیش خیلی راحت میشه بازه ها مدنظر رو مشخص کرد فقط یه چیز مسخره اینکه دوباره اینجا پهنا و ارتفاع برعکسه یعنی اول ارتفاع رو میدیم بعد پهنا . تصویر اولیه و چیزی که بریده شده ازش :‌خب موضوع بعدی ساختن ماتریس هست . یک ماتریسی که همه مقادیرش صفر باشه مشکیه و برعکس ماتریسی که همه مقادیرش یک باشه سفیده .black = np.zeros((512, 512))&#xA;cv2.imshow(&#34;black&#34;,  black)&#xA;print(black)&#xA;&gt;&gt;&gt;&#xA;[[0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] ... [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.]]همونطور که میبیند وقتی ماتریس black رو چاپ می کنیم همه مقادریش صفر هست و خروجی تصویر به این شکل میشه :‌برای تصویر سفید هم به همین شکل داریم :‌white = np.ones((512,512))&#xA;cv2.imshow(&#34;white&#34;, white)&#xA;print(white)&#xA;&gt;&gt;&gt;&#xA;[[1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] ... [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.]]خب عکس هایی که ساختیم توی مقیاس خاکستریه و چنل های رنگی آبی ٬ سبز و قرمز ندارند . برای اینکه رنگیش کنیم باید ببریمشون توی مقیاس BGR برای اینکار داریم :‌black = np.zeros((512, 512,3), np.uint8)&#xA;black[:] = 0,255,0&#xA;cv2.imshow(&#34;black&#34;,  black)اگه دقت کنید میبیند که یه پارامتر سه اضافه شده که چنل های رنگی رو اضافه می کنه و نوع اعدادشم اینتیجر ۸ بیت  گذاشتیم . خط بعدهم کاری که می کنه چنل سبز رو تا ته زیاد می کنه و نهایتا تصویری که داریم به این شکله :‌حالا یه نکته دیگه اگه دقت کنید خط دوم توی براکت متغییر black یه دو نقطه بیشتر نیست و اگه یکم تو پایتون با مفهوم آرایه آشنا باشیم میفهمیم که دو نقطه خالی یعنی از اول تا آخر یه آرایه واسه همین اگه بخوایم مثلا میگم یه بخشی از تصویر رو رنگ قرمز کنیم همچین چیزی داریم :‌black[100:250, 200:500] = 0,0,255&#xA;cv2.imshow(&#34;black&#34;,  black)تابع بعدی تابع کشیدن خطه که در کنار مستطیل و دایره کشیدن جز تابع های مهم نوشتاری هستند . به این شکل مقدار دهی میشه ‌:black = np.zeros((512, 512,3), np.uint8)&#xA;black[:] = 0,0,255&#xA;cv2.line(black, (0,0), (512,512), (255,0,0), 3)&#xA;cv2.imshow(&#34;black&#34;,  black)توی خط سوم پارامترا به این ترتیب هست :‌ تصویر ورودی ٬ مختصات شروع خط ٬ مختصات پایان خط ٬ رنگش و کلفت بودنش که خیلی مهمه :) الان تصویری که داریم یه خط از اول تا آخرش کشیده :تابع بعدی تابع مستطیل کشیدنه که پارامتراش مثل خطه  واسه همین داریم :cv2.rectangle(black, (200, 200), (300, 450), (125,125,0), 5)منتهی یه چیز دیگه ای که هست میشه تو پرش کرد به این شکل :‌cv2.rectangle(black, (200, 200), (300, 450), (125,125,0), cv2.FILLED)دایره هم به همین شکل منتهی به جای اینکه ما ابتدا و انتهارو مشخص کنیم مرکز و شعاع رو مشخص می کنیمcv2.circle(black, (270,250), 25, (100,15, 200), 3)و اخرین تابع هم اضافه کردنه متنه که اینجوری پارامتراش مشخص میشه تقریبا همونه فقط یه فونت داره و اندازه . cv2.putText(black, &#34;Shrek is love&#34;, (200, 250),cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 4)خب اینم از مطالب این پست امیدوارم مفید  بوده ! اگه سوالی داشتید میتونید سرچ کنید :) </description><category>Hesam Mohebi</category><author>Hesam Mohebi</author><pubDate>Tue, 30 Aug 2022 21:54:53 +0430</pubDate></item><item><title>معرفی کتابخانه OpenCv بخش ۳</title><link>https://virgool.ir/@mohebi.hesam/معرفی-کتابخانه-opencv-بخش-۳-bfdh0flsd8tx</link><description>خب توی این پست اول با یکی از ابزارهایی که opencv در اختیارمون میزاره تا توی فرایند تنظیم پارامترها کارمون راحت بشه آشنا میشیم و  جلوتر سعی می کنم با یه مثال٬ کاربرد فیلتر هایی که توی پست قبلی گفتم٬ واضح تر بشه . یکی از ابزارهایی که opencv داره و خیلی هم به کار میاد ساختن پنجره و بار هست . این ابزار به ما کمک می کنه که فیلتر هایی که داریم رو در لحظه مقدار دهی کنیم . مثلا فرض کنید ما تعداد لبه هایی که به کمک تابع canny تشخیص میدیدم رو بیشتر یا کمتر کنیم به کمک یک بار ساده میشه در لحظه مقدار پارامتر رو جوری تنظیم کرد که به اون حدی که مد نظر  هست برسه و دیگه نیازی به این نیست دستی پارامتر ها رو تغییر بدیم .def empty(a):&#xA;    pass&#xA;cv2.namedWindow(&#34;Parameters&#34;)&#xA;cv2.createTrackbar(&#34;Threshold1&#34;, &#34;Parameters&#34;, 0, 255, empty)&#xA;cv2.createTrackbar(&#34;Threshold2&#34;, &#34;Parameters&#34;, 0, 255, empty)خط سوم یه پنجره میسازه که اسمشو گذاشتیم parameters که قراره بار هایی که تو دو خط بعدی میسازیم توی این پنجره قرار بگیره دو خط بعدی هم بار ها رو میسازه که پارامتر اول اسم ٬ پارامتر دوم پنجره ای که توش قرار میگیرند پارامتر های سه و چهارم مین و ماکس بار هستش و پارامتر آخر تابعی هست که در صورت تغییر دادن بار اون تابع فراخونی میشه که تو این مثال تابعی فراخونی نمیشه (یعنی میشه اما رد میشه ). نتیجه نهایی همچین چیزی میشه :‌خب حالا کاری که ما می خوایم بکنیم اینه که از این بار ها برای تغییر لحظه ای فیلتر canny استفاده کنیم .cap = cv2.VideoCapture(2)&#xA;while True :&#xA;    success, img = cap.read()&#xA;    cv2.imshow(&#34;frame&#34;, img)&#xA;    cv2.imwrite(&#34;1.jpg&#34;,img)مثل قبل ورودی رو تعیین می کنیم فقط به جای یه تصویر من دارم از وبکم میخونم که کار راحت تر باشه بقیه کارا هم مثل قبل که خروجی همچین چیزی میده :‌من اینجا از یه سیب با بک گراند مشکی استفاده کردم که حداکثر کنتراستو داشته باشه . imgBlur = cv2.GaussianBlur(img, (7,7), 1)&#xA;cv2.imwrite(&#34;2.jpg&#34;,imgBlur)imgGray = cv2.cvtColor(imgBlur, cv2.COLOR_BGR2GRAY)&#xA;cv2.imwrite(&#34;3.jpg&#34;,imgGray)کارای تکراری قبلی ٬ مات کردن برا کاهش نویز خاکستری کردن تصویر . threshold1 = cv2.getTrackbarPos(&#34;Threshold1&#34;, &#34;Parameters&#34;)&#xA;threshold2 = cv2.getTrackbarPos(&#34;Threshold2&#34;, &#34;Parameters&#34;)&#xA;imgCanny = cv2.Canny(imgGray, threshold1, threshold2)&#xA;cv2.imwrite(&#34;4.jpg&#34;, imgCanny)خب اینجا ما میایم مقداری که بار هامون دارند رو توی دوتا متغییر میریزیم و این دوتا متغییر رو به عنوان پارامتر به تابع canny میدیم .حالا اگه این پارامتر هارو تغییر بدیم میتونیم مقدار نویز رو کم و زیاد کنیم تا به یه مقدار دلخواه برسیم .و به این شکل ما خیلی راحت ما یه برنامه shape_detection ساده ساختیم .تشخیص شکل میتونه تو خیلی از مباحث مربوط به پردازش تصویر مثل تشخیص اشیا یا صورت به کار بیاد . من یه تابع هم نوشتم که میتونه توی چسبوندن تصاویر و نشون دادن سیر تکامل یه فرایند پردازش تصویر کمک بکنه . اینم کدش اما دیگه حوصله توضیحشو ندارم واقعا !def stackImages(scale,imgArray):&#xA;    rows = len(imgArray)&#xA;    cols = len(imgArray[0])&#xA;    rowsAvailable = isinstance(imgArray[0], list)&#xA;    width = imgArray[0][0].shape[1]&#xA;    height = imgArray[0][0].shape[0]&#xA;    if rowsAvailable:&#xA;        for x in range ( 0, rows):&#xA;            for y in range(0, cols):&#xA;                if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:&#xA;                    imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)&#xA;                else:&#xA;                    imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)&#xA;                if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)&#xA;        imageBlank = np.zeros((height, width, 3), np.uint8)&#xA;        hor = [imageBlank]*rows&#xA;        hor_con = [imageBlank]*rows&#xA;        for x in range(0, rows):&#xA;            hor[x] = np.hstack(imgArray[x])&#xA;        ver = np.vstack(hor)&#xA;    else:&#xA;        for x in range(0, rows):&#xA;            if imgArray[x].shape[:2] == imgArray[0].shape[:2]:&#xA;                imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)&#xA;            else:&#xA;                imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)&#xA;            if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)&#xA;        hor= np.hstack(imgArray)&#xA;        ver = hor&#xA;    return verیه موضوع دیگه ای هم که الان یادم اومد در مورد تابع های erode  و dilate هستش . این دوتا تابع با هم دیگه خیلی استفاده میشن و دلیلشم اینه که همونطور که گفتم erode برای کاهش جزعیات و dilate برای افزایش هستش و مثلا یه استفاده ای که میشه اینه که ما تصویرمون یه سری نویز داره مثلا نقطه های سفید سفید توی صفحه هستش یه کاری که می کنند اینه که اول از تابع erode برای حذف این نویز ها استفاده می کنند اما اون جسمی که می خوایم تشخیص بده رو کوچک می کنه برای همین بعدش از تابع dilate استفاده میشه تا دوباره جسم مدنظر واضح تر بشه که تو تشخیص کمک بکنه این روش برای تشخیص اجسام دور خیلی کاربرد داره الان توی تصویر بالا شکل راست بالا نویز داره ما میایم نویزو حذف می کنیم اما تصویرم کوچیک تر میشه کاری که می کنیم اینه که تصویرو تقویتش می کنم که قدرت تشخیص دوباره زیاد بشه حالا توی پست های بعدی بیشتر در موردش صحبت می کنم . اینم کد کامل چیزی که پیاده سازی کردم امیدوارم که خوشتون اومده باشه و به کار بیاد . import cv2&#xA;import numpy as np&#xA;&#xA;def stackImages(scale,imgArray):&#xA;    rows = len(imgArray)&#xA;    cols = len(imgArray[0])&#xA;    rowsAvailable = isinstance(imgArray[0], list)&#xA;    width = imgArray[0][0].shape[1]&#xA;    height = imgArray[0][0].shape[0]&#xA;    if rowsAvailable:&#xA;        for x in range ( 0, rows):&#xA;            for y in range(0, cols):&#xA;                if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:&#xA;                    imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)&#xA;                else:&#xA;                    imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)&#xA;                if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)&#xA;        imageBlank = np.zeros((height, width, 3), np.uint8)&#xA;        hor = [imageBlank]*rows&#xA;        hor_con = [imageBlank]*rows&#xA;        for x in range(0, rows):&#xA;            hor[x] = np.hstack(imgArray[x])&#xA;        ver = np.vstack(hor)&#xA;    else:&#xA;        for x in range(0, rows):&#xA;            if imgArray[x].shape[:2] == imgArray[0].shape[:2]:&#xA;                imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)&#xA;            else:&#xA;                imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)&#xA;            if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)&#xA;        hor= np.hstack(imgArray)&#xA;        ver = hor&#xA;    return ver&#xA;def empty(a):&#xA;    pass # Hesam Mohebi&#xA;cv2.namedWindow(&#34;Parameters&#34;)&#xA;cv2.createTrackbar(&#34;Threshold1&#34;, &#34;Parameters&#34;, 0, 255, empty)&#xA;cv2.createTrackbar(&#34;Threshold2&#34;, &#34;Parameters&#34;, 0, 255, empty)&#xA;&#xA;&#xA;cap = cv2.VideoCapture(2)&#xA;while True :# Hesam Mohebi&#xA;    success, img = cap.read()&#xA;    print(img.shape)&#xA;    cv2.imshow(&#34;frame&#34;, img)&#xA;    cv2.imwrite(&#34;1.jpg&#34;,img)&#xA;    imgBlur = cv2.GaussianBlur(img, (7,7), 1)&#xA;    cv2.imwrite(&#34;2.jpg&#34;,imgBlur)&#xA;    imgGray = cv2.cvtColor(imgBlur, cv2.COLOR_BGR2GRAY)&#xA;    cv2.imwrite(&#34;3.jpg&#34;,imgGray)&#xA;&#xA;    threshold1 = cv2.getTrackbarPos(&#34;Threshold1&#34;, &#34;Parameters&#34;)&#xA;    threshold2 = cv2.getTrackbarPos(&#34;Threshold2&#34;, &#34;Parameters&#34;)&#xA;    imgCanny = cv2.Canny(imgGray, threshold1, threshold2)&#xA;    cv2.imwrite(&#34;4.jpg&#34;, imgCanny)&#xA;    imgStack = stackImages(0.8, ([img,imgBlur], [imgGray,imgCanny]))&#xA;    cv2.imwrite(&#34;5.jpg&#34;, imgStack)&#xA;&#xA;&#xA;    cv2.imshow(&#34;res&#34;, imgStack)# Hesam Mohebi&#xA;&#xA;&#xA;    if cv2.waitKey(1) &amp; 0xff == ord(&#39;q&#39;):&#xA;        break</description><category>Hesam Mohebi</category><author>Hesam Mohebi</author><pubDate>Tue, 30 Aug 2022 15:38:27 +0430</pubDate></item><item><title>معرفی کتابخانه OpenCv بخش ۲</title><link>https://virgool.ir/Rocket/معرفی-کتابخانه-opencv-بخش-۲-ecbsnfjrv5yu</link><description>خب توی این پست ادامه مطالب مربوط به opencv رو توضیح میدم .  توی این بخش بیشتر روی فیلتر ها و ماسک ها تمرکز می کنیم .قدم اول مثل همیشه اضافه کردن کتابخونه ها و گذاشتن تصویر توی یک متغیر هست .import cv2&#xA;import numpy as np&#xA;img = cv2.imread(&#34;shrek.jpg&#34;)&#xA;width, height = img.shape[:2]&#xA;img = cv2.resize(img, (int(height / 2), int(width / 2)))&#xA;cv2.imshow(&#34;shrek&#34;, img)&#xA;cv2.imwrite(&#34;res.jpg&#34;, img) خط چهارم طول و عرض تصویر رو در میاره و خط پنجم ابعاد تصویر رو تغییر میده من برای این اینکارو کردم که سایز اصلی تصویر خیلی بزرگ بود برای همین ابعاد تصویر رو نصف کردم . خط بعدی هم تصویر رو نمایش میده و خط آخر هم تصویر رو ذخیره می کنه . خروجی res.jpg به شکل زیر میشه :‌بخش بعدی خاکستری کردن تصویر هست که به شکل زیر پیاده سازی میشه imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)&#xA;cv2.imshow(&#39;grayshrek&#39;,imgGray )&#xA;cv2.imwrite(&#34;grayres.jpg&#34;, imgGray)پارامتر هایی که تابع cvtColor میگره یکی تصویر ورودی هستش و دیگری تبدیلی هست که قراره انجام بشه که تو این مثال از رنگی به خاکستری هست . این نکته رو هم اضافه بکنم که توی opencv به جای RGB ترتیب رنگ ها ‌BGR هستش .دو خط بعدی هم مثل بالایی نشون میده و ذخیره می کنه . خروجی grayres.jpg :‌بخش بعدی مات کردن تصویر هست که به شکل زیر پیاده سازی میشه .imgBlur = cv2.GaussianBlur(imgGray, (17,17), 0)&#xA;cv2.imshow(&#39;blurres&#39;,imgBlur )&#xA;cv2.imwrite(&#34;blurres.jpg&#34;, imgBlur)برای مات کردن تصویر از تابع GuassianBlur استفاده میشه که سه تا پارامتر اصلی اون یکی تصویر ورودی هست بعدیش اندازه کرنل هست که کارش اینه که شدت مات کردن رو تعیین می کنه هرچه قدر بیشتر باشه ٬ بیشتر تصویر مات میشه اندازه کرنل هم باید به شکل یه تاپل دوتایی مقادیر فرد یکسان داده بشه . خروجی blurres.jpg :‌تابع بعدی canny هست که کارش پیدا کردن لبه های تصویر هست یعنی پیکسل هایی که کنتراست زیادی با هم دیگه دارندimgCanny = cv2.Canny(img, 100, 50)&#xA;cv2.imshow(&#34;canny&#34;, imgCanny)&#xA;cv2.imwrite(&#34;cannyres.jpg&#34;, imgCanny)پارامتر اول تصویر ورودی هست و دو تا پارامتر بعدی میزان threshold یا گذردهی رو تعیین می کنه . اگه با پارامتراش بازی کنید به فهمش خیلی کمک می کنه .خروجی cannyres : تابع بعدی dilate هست که کارش اتساع یا پهن کردن خطوط و لبه هایی هستند که توسط canny ایجاد شده . kernel = np.ones((5,5), np.uint8)&#xA;imgDialation = cv2.dilate(imgCanny, kernel, iterations=1)&#xA;cv2.imshow(&#34;dialation&#34;, imgDialation)&#xA;cv2.imwrite(&#34;dialres.jpg&#34;, imgDialation)برای مقداردهی به تابع dilate ابتدا میبایست یک هسته kernel  تعریف کرد. در این مثال این هسته یک ماتریس ۵ در ۵ می باشد که همه مقادیر آن یک میباشد و وظیفه آن ٬ تشدید مقادیر تصویر ورودی است . پارامتر سوم تابع dilate تعداد چرخش هایی تصویر ورودی در هسته ای که ساختیم را تعیین می کند که هرچه قدر بیشتر باشد ٬ تصویر خروجی شدت بیشتر دارد . خروجی dialres.jpg : اخرین تابع erosion یا فرسایش هست که برعکس تابع dilate عملکرده و ویژگی هارا کاهش میدهد . imgErode = cv2.erode(imgDialation, kernel, iterations=1)&#xA;cv2.imshow(&#34;er&#34;, imgErode)&#xA;cv2.imwrite(&#34;eroderes.jpg&#34;, imgErode)پارامتر های erosion همانند dilate هست چون عمل عکس اونو  انجام میده. خروجی eroderes.jpg ‌:خب تو این پست سعی کردم یه سری از تابع های اصلی که استفاده زیاده ازشون توی فیلتر کردن تصاویر میشه رو یه توضیح مختصری داده باشم اما ممکنه براتون سوال پیش اومده باشه که اینا اصن به چه کاری میاد که توی پست های بعدی سعی می کنم یه مثال عملی رو پیاده کنم .  </description><category>Hesam Mohebi</category><author>Hesam Mohebi</author><pubDate>Sat, 27 Aug 2022 12:53:57 +0430</pubDate></item><item><title>معرفی کتابخانه OpenCV بخش ۱</title><link>https://virgool.ir/Rocket/معرفی-کتابخانه-opencv-بخش-۱-xvr5mj1xwvrh</link><description>کتابخانه opencv یک کتابخانه منبع باز (اوپن سورس) هست که تو حوزه های پردازش تصویر بینایی ماشین و یادگیری ماشین استفاده زیادی ازش میشه . opencv توسط شرکت اینتل و به زبان سی پلاس پلاس طراحی شده اما در حال حاضر رپر (wrapper) های پایتون و جاوا اون وجود داره یعنی اینکه شما به زبون پایتون یا جاوا میتونید همون توابع و کلاس های سی پلاس پلاس رو پیاده سازی کنید و از لحاظ سرعت پردازش هم تفاوت زیادی با سی پلاس پلاس نداره . قبل از اینکه سراغ کد زنی برم یه توضیح مختصری در مورد بینایی ماشین و پردازش تصویر میدم . به طور خلاصه میشه گفت که به فرایند فهم تصویر و فیلم و چگونگی ذخیره سازی و کنترل اون بینایی ماشین گفته میشه و تو حوزه های زیادی مثل دوربین های نظارتی‌٬ ماشین های خودران ٬ تشخیص چهره و خیلی چیزای دیگه استفاده میشه . به فرایند هایی که روی یک تصویر برای بهینه سازی اون یا استخراج اطلاعات از اون تصویر انجام میشه پردازش تصویر گفته میشه مثلا فیلتر کردن طیف های رنگی توی تصویر استخراج متن یا شکلی مشخص از تصویر کلا میشه گفت که پردازش تصویر بخشی از بینایی ماشین محسوب میشه .برای پیاده سازی opencv از پایتون استفاده می کنیم چون راحتره و خوبیش اینه که بعدا میشه کد رو به سی پلاس پلاس برگردوند . ورژن پایتونی هم که استفاده می کنید ۳.۷ به بعد باشه بهتره . برای نصب کتابخونه opencv از دستور زیر استفاده می کنید اگه هم ورژن مد نظرو پیدا نکرد با یه سرچ ساده اروری که داده مشکلو میشه حل کرد . pip install opencv-pythonمحیط کدزنی هم من خودم pycharm رو ترجیح میدم نسبت به vscode چون اینتلی سنس یا سیستم پیشنهادی قوی تری داره اما کلا فرق زیادی نداره . خب واسه شروع کتابخونه اوپن سی وی و نامپای رو اد می کنیم . نامپای فعلا استفاده ای نمیشه اما جلوتر برای خیلی کارا مثل کرنل ساختن یا تغییر ماتریس ها یا چیز های دیگه استفاده میشه . import cv2&#xA;import numpy as npتوی اولین مثال می خوایم یه عکس به فورمت jpg یا png رو نشون بدیم . img = cv2.imread(&#34;image.jpg&#34;)&#xA;cv2.imshow(&#34;shrek&#34;, img)&#xA;cv2.waitKey(0)خط اول عکس رو از مسیری که بهش دادیم میخونه و توی متغیر img میریزه خط بعدی عکس رو نشون میده و خط آخر به برنامه میگه که چقدر باید صبر بکنه مقدار عددی که به عنوان پارامتر میگیره بر حس میلی ثانیه هست وقتی هم که مقدارشو صفر بدیم برنامه منتظر میمونه تا ما کلیدی رو فشار بدیم . خروجی برنامه این میشه توی مثال دوم یه فیلم رو توی برنامه نمایش میدیدم . cap = cv2.VideoCapture(&#34;video.mp4&#34;)&#xA;# or &#xA;cap = cv2.VideoCapture(0)&#xA;&#xA;cap.set(3, 640)&#xA;cap.set(4, 480)&#xA;cap.set(10, 120)&#xA;&#xA;while True :&#xA;    success, frame = cap.read()&#xA;    cv2.imshow(&#34;webcam&#34;, frame)&#xA;    if cv2.waitKey(1) &amp; 0xff == ord(&#39;q&#39;):&#xA;        breakخط اول ویدیو رو داخل متغییر cap قرار میده اگه پارامتر تابع صفر بدیم ورودی وبکم داده میشه و اگه دوربین خارجی دارید که با USB به کامپیوتر وصل میشه بسته به تعداد پورتی که دستگاه داره مثلا اگه سه تا داشته باشه یکی از عددای ۱٬۲٬۳ میتونه باشه . دو خط بعدی تعیین پهنا و ارتفاع متغییری هست که نشون میده که توی این مثال پهنا 640 پیکسل و ارتفاع 480 پیکسل هست . خط بعدی هم میزان روشنایی رو تنظیم می کنه که هر چه قدر عددش بیشتر باشه روشن تر هست .توی حلقه تابع read دوتا متغییر میده یکی success که درست بودن فریمی که گرفته رو چک میکنه (یعنی True or False ) متغییر frame هم هر فریم فیلم رو توی خودش ذخیره می کنه قدم بعدی هم مثل مثال اول نشون دادن تصویر هست و شرطی که بعدش اومده چک می کنه که اگه ما کلید q رو بزنیم از حلقه خارج بشه .خب توی پست های بعدی سعی می کنم بقیه بخش های opencv رو توضیح بدم این رو هم اضافه بکنم من فقط سعی می کنم یه توضیح مختصری در مورد هر بخش بدم اگه علاقه به یادگیری بیشتر داشتید کورس های زیاد و خیلی خوبی هست که میتونه کمکتون کنه </description><category>Hesam Mohebi</category><author>Hesam Mohebi</author><pubDate>Sat, 27 Aug 2022 11:57:14 +0430</pubDate></item><item><title>معرفی الگوریتم های ماشین لرنینگ با استفاده از scikit-learn</title><link>https://virgool.ir/pubUIAI/معرفی-الگوریتم-های-ماشین-لرنینگ-با-استفاده-از-scikit-learn-aclxbrh16v6a</link><description>بخش مقدماتی : ?تعریف ساده ماشین لرنینگ اینطوری میشه  گفت که به  علم برنامه نویسی کامپیوتر ها به نحوی که از داده ها یادبگیرند . یا به عبارت دیگه حوزه ای از علوم کامپیوتره که این قابلیتو به کامپیوتر میده که بدون برنامه نویسی شدن به طور مشخص یه کاریو انجام بده.یه مثال ساده از ماشین لرنینگ فیلتر اسپم ایمیله . که یه سری از ایمیل های آشغال رو به عنوان اسپم بهش میدیم و یه سری دیگه که مهم هستند رو به عنوان ایمیل مهم یا None-Spam بهشون میدیم و میاد بر اساس نمونه هایی که بهش دادیم به ایمیل ها لیبل میده که اسپم هستند یا نیستند .فرق ماشین لرنینگ با کد زدن عادی چیه ؟تو همون مثال ایمیل های اسپم فرض ما می خوایم خودمون یه برنامه ای طراحی کنیم که بیاد توی ایمیل ها بگرده و مثلا یه سری الگو های کلامی که ایمیل های اسپم دارند رو تشخیص بده و هر چه قدر که تعداد این الگو ها بیشتر بود احتمال اینکه این ایمیل عنوان اسپم بگیره بیشتر هستش پس به طور خلاصه اون عمل اصلی و مهمی که ما انجام میدیم نوشتن قوانین تشخیص این الگو هاست.بدیه این کار چیه ؟ اینکه نهایتا ما یه مقدار زیادی کده پیچیده داریم که فقط برای این لیست از ایمیل ها کار می کنه?در مقابل یه فیلتر اسپم با استفاده از ماشین لرنینگ به طور خودکار یادمیگیره کدوم کلمات و جملات نشون دهنده اسپم بودن ایمیل هستند حالا چجوری اینکارو انجام میده ؟ میاد تو ایمیل ها میگرده که کدوم کلمات و جملات به طور غیر طبیعی تکرار شدند و یه سری الگو توی این کلمات پیدا می کنهاین برنامه به مراتب کوتاه تر و دقیق تر از روش قبلی هست و جوریه که ما اگه یه سری ایمیل جدید بهش بدیم خودشو تطبیق میده به دیتا های جدید?پس به طور خلاصه ماشین لرنینگ برا اینکار ها مناسبه : مسائلی که توش پیدا کردن جواب مناسب نیازمند قوانین و حالات بسیار زیادی هست .محیط هایی که توی اونها  داده های به طور مرتب تغییر می کنند و استفاده از یه سری کد ثابت جوابگو نیستش و باید به طور مرتب این کد تغییر بکنه بسته به دیتایی که داره.توی بحث بیگ دیتا استفاده از ماشین لرنینگ به ما کمک می کنه که روابط بین یه سری ورودی ها رو درک کنیم و اصطلاحا اونارو همسو بدونیم.انواع ماشین لرنینگ :به طور کلی  سیستم های ماشین لرنینگ بر اساس اینکه چه نوع و مقدار داده ای رو نظارت روش میکنند ، به چهار دسته نظارتی ، غیرنظارتی ، تقویتی و شبه نظارتی تقسیم میشند که من سه تای اولو یه توضیح مختصری میدم?یادگیری نظارتی(supervised learning):توی یادگیری نظارتی training data set  که ما به برنامه میدیم شامل مقادیر خروجی یا به زبون دیگه جوابی که باید برنامه بده میشه که بهشون میگیم لیبل(Label) همون مثال فیلتر اسپمی که اول کار گفتم هم از همین نوع هست.مثلا یه کاربرد دیگه ای که میتونه داشته باشه تو بحث قیمت خودرو ، ملک یا به طور کلی هر نوع مقدار عددی هست که پارامتر های عددی دیگه رابطه دارند . ما یه سری خصوصیت (feature ) مثل سال تولید ، کیلومتر طی شده ، رنگ ، اتوماتیک بودن یا نبودن و ویژگی های  دیگه رو به همراه قیمتش به عنوان training set  میدیم و الگوریتم  پیشبینی می کنه که  مثلا  یه ماشینی مدل 82 دنده اتوماتیک با رنگ نقره ای  چه قیمت هست  و این قیمت رو  که مدل ما پیشبینی کرده میایم نسبت میدیم به قیمت واقعیش و میفهمیم که درصد خطاش یا دقتش چقدر بوده.نکته مهمی هم که باید اضافه بکنم تو حوزه ماشین لرنینگ بین دو کلمه attribute و feature تفاوت وجود داره به این شکل که attribute فقط اشاره به نوع داده داره اما feature  نوع و مقدار اون داده رو مشخص می کنه .یادگیری غیر نظارتی (unsupervised leaning ): توی این روش برخلاف روش قبل  ما درون  داده ای که آموزش میدیم  لیبل نداریم و در واقع هیچ معیاری برای سنجش درست یا غلط بودن وجود ندارهبه عنوان مثال ما حجم زیادی  دیتا از بینندگان وبساتیمون داریم و می خوای با استفاده از الگوریتم کلاسترینگ افرادی که سلیقه های مشترکی دارند رو گروه بندی کنیم . اینکارو الگوریتم بدون هیچ کمکی از داده ترین انجام میده و باید خودش شباهت ها و اشتراکات این داده ها رو تشخیص بده مثلا تشخیص بده به عنوان مثال 60 درصد خوانندگان مرد هستند یا مثلا 20 درصد مردم علاقه به فیلمای اکشن دارند.یه سری دیگه از الگوریتم های غیر نظارتی نمایش بصری (visualization ) هستند که توی بحث بیگ دیتا و داده های حجم بالایی که لیبل ندارند خیلی کاربردیه و میتونه خیلی سریع  بینش کلی از اون داده ای که داریم بهمون بدهیک موضوعی که مربوط به یادیگری غیرنظارتی  هستش و خیلی مهم هست بحث کاهش ابعادیه (dimensionality reduction  ) که درش ما بدون اینکه اطلاعات زیادی رو از دست بدیم میایم داده های ساده تر می کنیم و برای این کار میایم گروه های داده ای رو که با همدیگه مرتبط هستند مرج (merge)می کنیم تا تقسیم بندی ساده تر بشه به عنوان مثال کیلو متر ماشین با عمر ماشین مرتبطه به خاطر همین میایم ما این دو گروه از داده رو مرج می کنیم به این عمل feature extraction گفته میشه .یادگیری تقویتی (    Reinforcement learning  ):توی یادگیری تقویتی سیستم یادگیری محیط رو مشاهده می کنه یه عملی رو انتخاب و اونو انجام میده و در صورت درست بودنش جایزه میگیره در غیر این صورت هم جریمه میشه جوریه که یادمیگیره که بهترین استراتژی چیه که تو طول زمان بیشترین جایزه یا توکن رو بگیرهمثال های زیادی هم داره از حوزه رباتیک گرفته تا  شبیه سازی و مدلینگ تا  بحث گیمینگ و پست خودشو میطلبه تا توضیح بدم ?من توی این پست سعی کردم مقدمه ای از مطالبی که در ادامه قراره با کتابخونه scikit-learn  انجام بدیم بیان کنم منبع اصلی برای مطالب این کتابی هست که معرفی می کنم . Hands-on Machine Learning  with Scikit-Learn, Keras and TensoFlow ترتیب مطالب و الگوریتم هایی هم که قراره پوشش بدیم  شبیه به مسیر راه شکل زیره امیدوارم این مطلب مفید واقع شده باشه. </description><category>Hesam Mohebi</category><author>Hesam Mohebi</author><pubDate>Wed, 02 Mar 2022 02:27:05 +0330</pubDate></item></channel></rss>