به نام خدا : سلام، این دومین مطلب مربوط به opencv هستش تو مطلب قبلی یه سری منابع آموزشی معرفی کردم(معرفی منابع آموزش فارسی و انگلیسی opencv)، تو این مطلب از آموزش opencv میخوایم یه پروژه ساده opencv رو با هم ببینیم و یه عکس در opencv نمایش بدیم، و به بررسی توابع کتابخانه highgui هم میپردازیم.
داستان کربلا رفتن ما : وقتی رفتیم لب مرز از اونجا ماشین سوار شدیم(حالا دنگ و فنگش بماند برای بعد) و تو ماشین ما رفتیم ته ماشین نشستیم(4 نفر بودیم ما) این ماشین ها رو چی بهش میگن ون میگن چی میگن، 4 نفری کل اون ردیف آخر ماشین رو گرفته بودیم(نشسته بودیم^_^) تو ماشین 1 اصفحانی بود، ما هم دیدیم طرف داره یه چیزی میخوره^_^ هیچی یه نیم ساعتی رو مخش راه رفتیم و اضیتش کردیم تا آخر سر تمام آجیل هاش رو داد ما خوردیم^_^ (البته یه 2-3 تا خانم هم بودن- سن بالا- جای مادرمون – که خداییش خیلی آدمای خوبی بودن، با ما همکاری میکردن و این اصفحانی هه رو تحریک میکردن ^_^ این کیفی کردیم) یادمه رفیقم شروع کرد به خوندن زیادرت عاشورا – هیچی بنده خدا وسط کار صداش گرفت ^_^ لامسب صداش درنمیومد که، هیچی ما هم چیزی دستمون نبود و یه لیوان آب سرد دادیم بهش خورد ^_^ هیچی تا آخر کار با همون صداش خوند زیارت رو، صدای ماشین یه طرف و صدای این داش ما هم یه طرف، من که بقلش بودم فقط صداش رو میشنیدم^_^ بنده خدا صداش در نمیومد، آخر سر هم که 10 دقیقه مونده بود به محل مد نظر در نجف برسیم آنچنان گریه ای کردم که ملت انگشت به دهن …^_^ ، بعد رفتیم حرم امام علی و بعد زیارت دیگه شب شده بود و وقت خواب، رفتیم یه حسینیه ای پیدا کردیم(لامسب جمعیت این قدر زیاد بود که جا برا خواب پیدا نمیشد) رفتیم اونجا داخل حسینیه، سر بسته بود(حیاطش سقف داشت) بچه ها رفتن داخل اتاق و خوابیدن و برا من جا نشد که برم هیچی ما گرفتیم تو حیاط خابیدیم، یه مبل 2 نفره بود که وسطش خیس بود، دو نفری(با یه اصفحانیه….فک کنم اصفحانی بود، بچه باحالی بود، تا 3 شب باهاش صحبت میکردم) رو اون مبله گرفتیم خوابیدیم. دو نفر رو یه مبل دو نفره گرفتن خوابیدن^_^(خودتون فکرش رو بکنید)، چقدر با این بنده خدا من حرف زدم، میگفت من طلبه هستم(هم طلبه بود و هم یه رشته دیگه میخوند فک کنم) و میگفت من فکم قوی هستش و از این جور حرفا(چون بهش فک کنم گفته بودم مشکلی نداری با هم حرف بزنیم و صحبت کنیم طرف این حرفو زد) هیچی طرف ما رو نمیشناخت، این قدر باهاش صحبت کردیم که دیگه اخر سر بنده خدا کم ابرد^_^ ، یادمه براش داستان تعریف میکردم و وسط داستان گفتن من خوابم میبرد و بعد یه به حالت هوشیاری برمیگشتم بهمش میگفتم من داستان رو چی و چطور تعریف کردم و بعد اون میگفت اینا رو گفتی و منم گفتم درست گفتم(خودم کیف کردم که تو حالت نیمه هوشیاری داستان رو درست گفتم^_^) خب هیچی آقا از اونجا رفتیم و پیاده روی اربعین ما از اونجا شروع شد، از نجف پیاده رفتیم کربلا، 3 روز تو راه بودیم O_o ؛ متر به متر عراقی ها موکب زده بودن و از زائران استقبال میکردن(موکب شبیه ایستگاه صلواتی های سیار تو ایران هستش)…
خب دیگه داستان گفتن بسه بریم سر اصل مطلب…
خب کد زیر حداقل کد مورد نیاز برای ایجاد یه عکس هستش.
1 2 3 4 5 6 7 8 |
#include <opencv2/highgui/highgui.hpp> int main() { cv::Mat image= cv::imread("E:/MAHDE/AKS_MOVIE_SOUND/Aks/DMF.jpg"); cv::imshow("My Image",image); cv::waitKey(); return 1; } |
خط 1 : فراخونی کتابخونه مورد نیاز برای نمایش عکس.
خط 5 : عکسی که میخوایم نمایش بدیم رو آدرسش رو به عنوان پارامتر به تابع imread میدیم و این عکس در متغییر image از نوع Mat ذخیره میشه.
خط 6 : نمایش عکس در یه پنجره با نام تعیین شده ی “My Image”
خط 8 : این قسمت باعث میشه پنجره نمایش عکس بسته نشه، پارامتری که ما بهش میدیم زمان بر حسب ms هستش، و اگه پارامتری بهش ندیم(عددی ندیم بهش) و یا 0 بدیم، به عنوان زمان “بی نهایت” تلقی میشه، مثلا اگه کد زیر رو بنویسیم، پنجره بعد از 3 ثانیه بسته میشه.(این تابع همون delay خودمون هستش که باعث میشه کامپایلر یه زمانی رو وایسه و بقیه کد های برنامه رو اجرا نکنه)
1 |
cv::waitKey(3000); |
خط 9 : کامپایلر وقتی به این خط برسه برنامه رو میبنده.
توجه : اینا رو یادتون باشه چون تو مطلب بعدی تکرار نمیکنم.
مطالب مرتبط : Loading an image in OpenCV
لیست توابع این کتابخانه opencv به صورت زیر هستش.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
CV_EXPORTS_W void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE); CV_EXPORTS_W void destroyWindow(const String& winname); CV_EXPORTS_W void destroyAllWindows(); CV_EXPORTS_W int startWindowThread(); CV_EXPORTS_W int waitKey(int delay = 0); CV_EXPORTS_W void imshow(const String& winname, InputArray mat); CV_EXPORTS_W void resizeWindow(const String& winname, int width, int height); CV_EXPORTS_W void moveWindow(const String& winname, int x, int y); CV_EXPORTS_W void setWindowProperty(const String& winname, int prop_id, double prop_value); CV_EXPORTS_W void setWindowTitle(const String& winname, const String& title); CV_EXPORTS_W double getWindowProperty(const String& winname, int prop_id); CV_EXPORTS void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0); CV_EXPORTS int getMouseWheelDelta(int flags); CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0); CV_EXPORTS_W int getTrackbarPos(const String& trackbarname, const String& winname); CV_EXPORTS_W void setTrackbarPos(const String& trackbarname, const String& winname, int pos); CV_EXPORTS_W void setTrackbarMax(const String& trackbarname, const String& winname, int maxval); CV_EXPORTS void imshow(const String& winname, const ogl::Texture2D& tex); CV_EXPORTS void setOpenGlDrawCallback(const String& winname, OpenGlDrawCallback onOpenGlDraw, void* userdata = 0); CV_EXPORTS void setOpenGlContext(const String& winname); CV_EXPORTS void updateWindow(const String& winname); CV_EXPORTS QtFont fontQt(const String& nameFont, int pointSize = -1, Scalar color = Scalar::all(0), int weight = QT_FONT_NORMAL, int style = QT_STYLE_NORMAL, int spacing = 0); CV_EXPORTS void addText( const Mat& img, const String& text, Point org, const QtFont& font); CV_EXPORTS void displayOverlay(const String& winname, const String& text, int delayms = 0); CV_EXPORTS void displayStatusBar(const String& winname, const String& text, int delayms = 0); CV_EXPORTS void saveWindowParameters(const String& windowName); CV_EXPORTS void loadWindowParameters(const String& windowName); CV_EXPORTS int startLoop(int (*pt2Func)(int argc, char *argv[]), int argc, char* argv[]); CV_EXPORTS void stopLoop(); CV_EXPORTS int createButton( const String& bar_name, ButtonCallback on_change, void* userdata = 0, int type = QT_PUSH_BUTTON, bool initial_button_state = false); |
خب دیگه بریم مورد به مورد توابع بالا رو توضیح بدیم و ببینیم چی هستن این همه تابع و کار هر کدومشون چی هستش.
1 |
CV_EXPORTS_W void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE); |
1) تابع namedWindow برای ایجاد یه پنجره جدید هستش.
پارامتر اول : نام پنجره
پارامتر دوم : این برا تعیین حالت پنجره(اندازش) هستش، اون پارامتر آخر رو من دقیقا نحوه استفادش رو بلد نیستم چون ازش استفاده میکنم برنامه ارور میده، حالا بعدا اگه یادم بود میرم روش ه تحقیقی میکنم(فعلا نه وقتش رو دارم و نه حسش)
1 2 3 4 5 6 |
cv::namedWindow("Image1", cv::WINDOW_AUTOSIZE); cv::namedWindow("Image2", cv::WINDOW_FREERATIO); cv::namedWindow("Image3", cv::WINDOW_FULLSCREEN); cv::namedWindow("Image4", cv::WINDOW_KEEPRATIO); cv::namedWindow("Image5", cv::WINDOW_NORMAL); cv::namedWindow("Image6", cv::WINDOW_OPENGL); |
1 |
CV_EXPORTS_W void destroyWindow(const String& winname); |
2) تابع destroyWindow برای نابود کردن یه پنجره هستش(که به کمک تابع namedWindow ساختیمش)
پارامتر اول : نام پنجره ای که قراره نابود بشه.
1 2 3 4 5 6 7 8 9 |
#include <opencv2/highgui/highgui.hpp> int main() { cv::namedWindow("My Image2", 1); cv::waitKey(2000); cv::destroyWindow("My Image2"); cv::waitKey(); return 1; } |
1 |
CV_EXPORTS_W void destroyAllWindows(); |
3) تابع destroyAllWindows برای نابود کردن تمام پنجره های باز به کار میره.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <opencv2/highgui/highgui.hpp> int main() { cv::namedWindow("Image1"); cv::namedWindow("Image2"); cv::namedWindow("Image3"); cv::namedWindow("Image4"); cv::namedWindow("Image5"); cv::namedWindow("Image6"); cv::waitKey(2000); cv::destroyAllWindows(); cv::waitKey(); return 1; } |
1 |
CV_EXPORTS_W int waitKey(int delay = 0); |
4) تابع waitKey برای ایجاد یه تاخیر زمانی هستش که در بالا به وفور ازش استفاده کردم و توضیح دادمش.
همون طور که یادتونه گفتم اگه 0 بدیم یا مقداری به تابع ندیم، تابع به مقدار بنهایت وای میسته(یه تاخیر زمانی بی نهایت)، چون همون طور که در تابع بالا میبینید پارامتر رو مقدار اولیه 0 دادن و لذا اگه شما مقدار 0 بدید و یا مقدار ندید هر دو مورد یکسان و یکی هستش.
1 |
CV_EXPORTS_W void imshow(const String& winname, InputArray mat); |
5) تابع imshow برای نمایش یه عکس هستش که در اول برنامه یه مثال براش گزاشتم و توضیح هم دادم.
پارامتر اول : نام پنجره
پارامتر دوم : عکس ما(که قراره توسط این تابع نمایش داده بشه)
توجه : اگه قبل از این تابع پنجره ای ایجاد نشه(به کمک تابع namedWindow) این تابع خودش یه پنجره با مقدار CV_WINDOW_AUTOSIZE ایجاد میکنه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <opencv2/highgui/highgui.hpp> int main() { cv::Mat image= cv::imread("E:/MAHDE/AKS_MOVIE_SOUND/Aks/DMF.jpg"); cv::namedWindow("WINDOW_AUTOSIZE", cv::WINDOW_AUTOSIZE); cv::imshow("WINDOW_AUTOSIZE",image); cv::namedWindow("WINDOW_FREERATIO", cv::WINDOW_FREERATIO); cv::imshow("WINDOW_FREERATIO",image); cv::namedWindow("WINDOW_FULLSCREEN", cv::WINDOW_FULLSCREEN); cv::imshow("WINDOW_FULLSCREEN",image); cv::namedWindow("WINDOW_KEEPRATIO", cv::WINDOW_KEEPRATIO); cv::imshow("WINDOW_KEEPRATIO",image); cv::namedWindow("WINDOW_NORMAL", cv::WINDOW_NORMAL); cv::imshow("WINDOW_NORMAL",image); /*cv::namedWindow("WINDOW_OPENGL", cv::WINDOW_OPENGL); cv::imshow("WINDOW_OPENGL",image); cv::waitKey(2000);*/ cv::waitKey(); return 1; } |
1 |
CV_EXPORTS_W void resizeWindow(const String& winname, int width, int height); |
6) تابع resizeWindow برای تغییر اندازه پنجره هستش(اندازه پنجره نمایش عکس رو تغییر میده و نه اندازخ عکس رو، دقت کنید)
پارامتر اول : نام پنجره(یا عکس، نام پنجره و عکس باید یکسان باشد)
پارامتر دوم : عرض عکس (اندازه افقی!)
پرامتر سوم : طول یا همون ارتفاع عکس (اندازه عمودی!)
توجه 1 : The specified window size is for the image area. Toolbars are not counted
توجه 2 : تمام پنجره های ایجاد شده با هر فلگی غیر از CV_WINDOW_AUTOSIZE رو میتونید تغییر سازش بدید.
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <opencv2/highgui/highgui.hpp> int main() { cv::Mat image= cv::imread("E:/MAHDE/AKS_MOVIE_SOUND/Aks/DMF.jpg"); cv::imshow("my image",image); cv::waitKey(2000); cv::resizeWindow("my image", 200, 200); cv::waitKey(2000); cv::resizeWindow("my image", image.cols, image.rows); cv::waitKey(); return 1; } |
جنگ ما فتح قدس را در پی خواهد داشت (امام خمینی) >>>>>> اگر از صدام بگذریم، اگر مسأله قدس را فراموش کنیم، اگر از جنایت های امریکا بگذریم از آل سعود نخواهیم گذشت. انشاالله اندوه دلمان را را در وقت مناسب با انتقام از امریکا و ال سعود برطرف خواهیم کرد و داغ و حسرت حلاوت این جنایت بزرگ را بر دلشان خواهیم گذاشت و با برپایی جشن پیروزی حق بر جنود کفر و نفاق و آزادی کعبه از دست نااهلان و نامحرمان به مسجد الحرام وارد خواهیم شد (امام خمینی)
فعلا دارم رو USB و میکرو LPC کار میکنم، 3 تا موضوع مطرح هستش ( که تو ذهنمه هر3شو برم ) :
1) میکرو در نقش Device ( فعلا محوریت کار من این مورد هستش )
2) میکرو در نقش Host
3) میکرو در نقش OTG
و باز 2 تا موضوع مطرح هستش، برا راه اندازی usb دو تا راه داریم ( که تو ذهنمه هر2شو برم ) :
1) استفاده از میکروکنترلر ( فعلا محوریت کار من این مورد هستش که از LPC1768 استفاده میکنم )
2) استفاده از آیسی های مختص اینکار.
فعلا کارم با دیتاشیت usb تموم شده، دارم کلاس های usb رو مطالعه میکنم، کلاس cdc رو ماستمالی کردیم و یه پروژه ازش منتشر کردیم، الان رو کلاس HID ریز شدم و دارم مطالعه میکنمش و پروژه ازش میزارم تو سایت.
جزئیات داستان رو در لینک زیر میتویند ببینید :
سوالی داشتید در قسمت نظرت مطرح کنید؛ بلد باشم حتما جواب میدم ( اکثر مواقع آنلاین هستم و در کمتر از 1 ساعت جواب میدم )
سلام
خدا قوت خیلی عالیه. اگه امکانش هست،ادامه بدید مباحثی مثل تشخیص صورت،چهره،آدم و …
اگه امکانش هست،یه آموزش هم از تولید فایل exe با c++ هم بذارید تا بشه برنامه هایی که می نویسیم رو روی رسپری یا هر کامپیوتر دیگه اجرا کنیم.
با تشکر فراوون
سلام
قسمت دمت حرفت رو متوجه نشدم.
aliiiiii bod mohandes khoda qovat
سلام.ببخشید وقتی من می خوام برنامه ای رو که نوشتم رو run کنم.مینویسه که فایل PDB رو پیدا نمیکنه!! شما میدونید مشکلش کجاست؟؟کتابخونه های open cv فرقی نداره تو کدوم درایو نصب بشه؟؟؟؟
سلام.من وقتی یه برنامه رو می خوام run کنم مینویسه فایل PDB رو پیدا نمیکنه!!!شما میدونید مشکلش چیه؟؟
ان شاالله
موفق وموید باشی
واقعا عالی گفتی من یک سال بعد لیسانس تازه وارد این عرصه شدم وشروع کردم..حرف نداری ان شاالله ماهم بتونیم برای امام زمان عج مون کاری کردده باشیم..یاحق
سلام من یه سوال از حضورتون داشتم
وقتی یه سون سگمنت رو بخوایم به میکرو وصل کنیم میآیم از آی سی 7447 استفاده میکنیم که پایه زیادی از میکرو اشغال نشه
خب اعداد در مبنای دو 4 بیتی میشن
حالا سوال من اینه که :
4 بیت عدد به ای سی وارد میشن و 4 بیت بعدی به میکرو؟؟!!!!! هرچندعدد 8 بیتی که نیست 4 بیته
یا عدد خودش 4 بیته و این 4 بیت وارد ای سی میشن و همین 4 بیت به میکرو وصل میشن؟؟؟؟
آخه میخواد بدونم به چه علت وقتی دوتا سون سگمنت داریم فقط از یه پورت مثلا B استفاده میکنیم
خودم فکر میکنم دومی درسته ولی استادمون یه چیز مث اولی گفته من الان هنگم