پردازش تصویر opencv همواره در ابزار های کارآمد و جالبی بوده که از این ابزار در پروژه های مخلف استفاده میشد، اما همواره از این مزیت ها برای ثبت اطلاعات و ایجاد تغییرات در سیستم اجرایی بوده اما اگر بتوانیم در صورت پردازش ایجاد شده تغییرات در محیط خارج از سیستم اجرا شده ایجاد کنیم مطمئنا بسیار کارآمد خواهد بود، هدف این پروژ] کنترل سرور موتور در صورت تشخیص چهره انسان است. با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
اوپن سی وی OpenCV
OpenCV یک کتابخانه نرم افزار بینایی رایانه ای و یادگیری ماشین منبع باز است. OpenCV به منظور ایجاد زیرساخت مشترک برای برنامه های دید رایانه ای و تسریع در استفاده از ادراک ماشین در محصولات تجاری ساخته شده است. OpenCV به عنوان یک محصول دارای مجوز BSD ، استفاده و اصلاح کد را برای مشاغل آسان می کند. OpenCV یا Open Computer Vision Library مجموعه ای از کتابخانههای برنامهنویسی پردازش تصویر و یادگیری ماشین است. این مجموعه بیشتر بر پردازش تصویر بی درنگ یا Real Time تمرکز دارد. در ابتدا توسط اینتل ساخته و پشتیبانی میشد و هماکنون توسط Willow Garage و Itseez پشتیبانی میگردد. توسط سیستم عاملهای ویندوز، لینوکس، مک اواس، آی او اِس و اندروید پشتیبانی میشود. همچنین دارای رابط برنامهنویسی به زبانهای c/c++، پایتون، جاوا و متلب میباشد.
یادگیری ماشینی pre-trained models
در یادگیری ماشین مبحثی به نام model وجود دارد که در واقع اشیا و مواردی هست که ما قصد تشخیص دادن آن هارا داریم، برای مثال تشخیص صورت انسان، خب برای این مورد باید به ماشین خود آموزش دهیم که ظاهر یک انسان، زن یا مرد، کوچک یا بزرگ، پیر یا جوان به چه شکل است. برای این مورد باید تصاویر مختلفی را به ماشین خود معرفی کنیم که توانایی تشخیص ماشین ما بالا تر برود. به این نتیجه این فرآیند مدل میگویند که مشخصه تشخیص ماشین ما است و در ادامه همه این مدل ها باید لیبل بندی شده تا نتیجه برای کاربر از نظر نمایشی قابل فهم باشد.
برد آردوینو Arduino
مجموعه بردهای آردوینو از جمله بردهای توسعه پرطرفدار بین مهندسین امبدد هستند که در مدل های مختلفی از جمله Micro , proMini , Nano , Uno و همچنین Mega قابل تهیه هستند، هسته مرکزی این برد های محبوب از سری AtMega328 می باشد. آردوینو پلتفرم سختافزاری و نرمافزاری متنباز است. همان طور که قبل تر اشاره کردیم، پلتفرم آردوینو شامل یک میکروکنترلر تکبردی متنباز است که قسمت سختافزار آردوینو را تشکیل میدهد. علاوه بر این، پلتفرم آردوینو یک نرمافزار آردوینو IDE که به منظور برنامهنویسی برای بردهای آردوینو طراحی شدهاست و یک بوت لودر نرمافزاری که بر روی میکروکنترلر بارگذاری میشود را در بر میگیرد.
روش کار پروژه OpenCV با آردوینو
در پروژه سروو موتور با پردازش تصویر OpenCV از دو کد مختلف استفاده میکنیم، یک کد برای آردوینو که وظیفه فرمان دهی به سروو sg90 را دارد و کد دوم یک کد پایتون است که در سیستم شما اجرا میشود و متغییر های مربوط به سروو را تغییر میدهد با توجه به موقعیت چهره شما در تصویر و همچنین به کمک pyserial آردوینو و کد پایتون با یکدیگر ارتباط برقرار میکنند.
وسایل مورد نیاز
کتابخانه های مورد نیاز
برای اجرای پروژه ابتدا در نرم افزار Arduino IDE اقدام به نصب کتابخانه مرجع Servo می پردازیم. مراحل زیر را دنبال کنید.
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه Servo را جستجو کنید.
- کتابخانه را نصب کنید.
- این کتابخانه معمولا بصورت پیشفرض نصب میباشد.
در کد پایتون نیاز دارید چند کتابخانه را در محیط ادیتور خود نصب کنید، من از ادیتور pycharm استفاده میکنم. پکیج هایی که در تصویر مشخص شده را جستجو و نصب کنید. و این مورد را در نظر داشته باشید برای پردازش تصویر نیاز به پایتون ورژن ۳٫۷ داریم تا همزمان با pyserial قابل استفاده باشد.
اتصالات پروژه OpenCV با آردوینو
در پروژه openCV با آردوینو برای طول و عرض مرکز تصویر با چهره تشخیص داده شده از دو عدد سروو موتور استفاده میکنیم، یکی از آنها به پین ۹ دیگری به پین ۱۰ در آردوینو متصل شوند، تا در نتیجه با حرکت در حالت افقی و عمودی اقدام به تنظیم چهره شما در مرکز تصویر و دنبال کردن آن باشند.
کد های پروژه
-
کد آردوینو
- در این بخش از کد با استفاده از پروتکل سریال مختصات تشخیص داده از چهره در تصویر یا x و y در آردوینو خوانده میشود.
if (Serial.available() > 0) { int x_mid, y_mid; if (Serial.read() == 'X') { x_mid = Serial.parseInt(); if (Serial.read() == 'Y') y_mid = Serial.parseInt(); }
- این بخش از کد وظیفه تنظیم سروو در ناحیه مربع را دارد اگر مختصات خارج از محدوده مقادیر آن باشد.
if (x_mid > width / 2 + 30) xpos += angle; if (x_mid < width / 2 - 30) xpos -= angle; if (y_mid < height / 2 + 30) ypos -= angle; if (y_mid > height / 2 - 30) ypos += angle;
- این بخش از کد مانند کد بالا وظیه تنظیم سروو با مربع موجود در تصویر را دارد با این تفاوت که اگر درجه سروو ها خارج از محدوده مقادیر باشد.
if (xpos >= 180) xpos = 180; else if (xpos <= 0) xpos = 0; if (ypos >= 180) ypos = 180; else if (ypos <= 0) ypos = 0;
- کد آماده آپلود در آردوینو.
[/restrict]
#include<Servo.h> Servo x, y; int width = 640, height = 480; int xpos = 180, ypos = 180; void setup() { Serial.begin(9600); x.attach(9); y.attach(10); x.write(xpos); y.write(ypos); } const int angle = 2; void loop() { if (Serial.available() > 0) { int x_mid, y_mid; if (Serial.read() == 'X') { x_mid = Serial.parseInt(); if (Serial.read() == 'Y') y_mid = Serial.parseInt(); } if (x_mid > width / 2 + 30) xpos += angle; if (x_mid < width / 2 - 30) xpos -= angle; if (y_mid < height / 2 + 30) ypos -= angle; if (y_mid > height / 2 - 30) ypos += angle; if (xpos >= 180) xpos = 180; else if (xpos <= 0) xpos = 0; if (ypos >= 180) ypos = 180; else if (ypos <= 0) ypos = 0; x.write(xpos); y.write(ypos); } }
-
کد پایتون
- در اولین قسمت از کد پایتون دوربین مورد استفاده را مشخص میکنیم، در صورت عدم وجود تصویر عدد موجود را تغییر دهید.
cap=cv2.VideoCapture(2)
- در این بخش پورت آردوینو مه از استفاده میکنیم را مشخص میکنیم، با تغییر مقدار موجود در کد زیر.
ArduinoSerial=serial.Serial('com6',9600,timeout=0.1)
- این خط کد وظیفه ارسال مقادیر x و y بدست آمده از تصویر به آردوینو به منظور به حرکت درآوردن سروو ها را دارد.
string='X{0:d}Y{1:d}'.format((x+w//2),(y+h//2))
- کد پایتون آماده اجرا در ادیتور مدنظر.
import cv2 import serial,time face_cascade= cv2.CascadeClassifier('haarcascade_frontalface_default.xml') cap=cv2.VideoCapture(2) ArduinoSerial=serial.Serial('com6',9600,timeout=0.1) time.sleep(1) while cap.isOpened(): ret, frame= cap.read() frame=cv2.flip(frame,1) gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) faces= face_cascade.detectMultiScale(gray,1.1,6) for x,y,w,h in faces: string='X{0:d}Y{1:d}'.format((x+w//2),(y+h//2)) print(string) ArduinoSerial.write(string.encode('utf-8')) cv2.circle(frame,(x+w//2,y+h//2),2,(0,255,0),2) cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),3) cv2.rectangle(frame,(640//2-30,480//2-30), (۶۴۰//۲+۳۰,۴۸۰//۲+۳۰), (۲۵۵,۲۵۵,۲۵۵),۳) cv2.imshow('img',frame) if cv2.waitKey(10)&0xFF== ord('q'): break cap.release() cv2.destroyAllWindows()
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
نکته: دقت داشته باشید پردازش تصویر در این پروژه نیاز به مدل هایی از پیش تعریف شده دارد و در پروژه ما مدلی برای تشخیص تصویر صورت انسان، برای این منظور از فایل زیر در کنار کد پایتون استفاده کنید. frontface model
نتیجه نهایی
پس آپلود کد در آردوینو و اجرای کد پایتون در صورتی که تمام موارد ذکر شده به درستی انجام شده باشد، در ادیتور صفحه وبکم برای شما باز خواهد شد که قادر به تشخیص چهره شما خواهد بود و در همین بین مقادیر برای آردوینو به کمک ارتباط سریال ارسال خواهد شد، و با توجه به شرط های موجود آردوینو با فرمان دهی به سروو ها سعی خواهد کرد تا موقعیت سروو ها با توجه به حرکت چهره شما در تصویر تغییر کند.
کلام آخر با سایفر
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام مهندس اگر بخواهیم ارتباط بین opencv و آردوینو با ماژول بلوتوث باشه باید چیکار کنیم
سلام، باید از دو برد آردوینو و HC05 استفاده کنیم و دیتای سریال را بین این دو برد جابجا کنیم.
با سلام و وقت بخیر
من این پروژه رو دارم میسازم ولی توی قسمت پایتون ارور دارم موقع اجرای برنامه
[ WARN:[email protected]] global D:\a\opencv-python\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (539) `anonymous-namespace’::SourceReaderCB::~SourceReaderCB terminating async callback
در اخر هم این رو مینویسه
Process finished with exit code 0
ممنون میشم راهنمایی کنید
سلام، به نظر مشکل از پکیج نصب شده است، همچنین این مورد را در نظر داشته باشید کد پایتون را با پایتون ورژن ۳٫۷ اجرا کنید.
در ادامه نوشته قبلیم این فایل frontface model چه جوری توی پایتون میشه استفاده کرد ؟
این مدل رو باید کنار فایل کد اصلی قرار بدید که در یک آدرس یکسان باشند.
سلام مهندس ببخشید در آردوینو این امکان وجود داره که پردازش ویدئو انجام بشه
به طور مشخص شناسایی و تعقیب اهداف متحرک به صورت بلادرنگ
سلام بله این امکان وجود دارد ولی آردوینو به کمک سیستم شما، یعنی کد پردازش تصویر در سیستم شما اجرا میشود و باقی کد در آردوینو و از طریق سریال باهم ارتباط برقرار میکنند.
ممنونم
اگه بخوام تمام عملیات روی یک سیستم انجام بشه چی؟
یعنی عملیات پردازش نمیتونه روی آردوینو صورت بگیره؟
چه ماژولی شما پیشنهاد میدید؟
به کمک برد های ESP32cam چند آموزش در رابطه با پردازش تصویر نوشتم، اون هارو مطالعه کنید. با کمی کد نویسی میتونید کد اون پروژه هارو برای پروژه خودتون شخصی سازی کنید.
سلام مجدد پس توانایی اینکه به صورت تکی عمل کنه نداره
ماژول دیگری می تونه این کار رو انجام بده
سلام.یعنی مثلا شما اخم کنید،دو سرو موتور ابروها را به سمت پایین میچرخانند؟
با سلام
چنین موردی امکان پذیر است ولی این پروژه متفاوت هست.