حذف هوشمند اشیا وجادوی پردازش تصویر در روباتیک- قسمت 8

مهندس ماجد اسدی
دی ماه 84 شماره 19

اشاره :
در این شماره برآنیم تا چند تمرین در زمینه پردازش تصویر را باهم به انجام برسانیم. بعد از انجام این تمرینات خواهید توانست، با کمی تلاش، تمامی آنچه را که در ذهنتان است، عملی نمایید. درصورتیکه مقالات قبلی را مطالعه نموده باشید خواهید دید که موضوع این ماه، جمع بندی مطالب گذشته است. حال بهتر است وارد مبحث اصلی شویم.


تصاویری که به آن نیاز داریم یکی تصویر زمینه و دیگری تصویری است که پردازش ما بر روی آن انجام می گیرد. تصویر زمینه می تواند هر تصویری باشد و می توانید آنرا به دلخواه انتخاب نمایید. تصویر دوم را، برای راحتی، به گونه ای انتخاب یا طراحی می کنیم که تنها از رنگ های سیاه و سفید تشکیل شده باشد. شکل 1 نمونه ای از تصاویری هستند که در این کار از آنها بهره می بریم.


شکل 1:
عکس بیل گیتس بعنوانِ زمینه (راست) و عکس پردازش شونده (چپ)

لطفا توجه نمایید که سایز عکس ها باید یکسان باشند، اگر چه می توانید در آینده، خود برنامه را به گونه ای تغییر دهید که نیاز به هم اندازه بودن عکس ها نباشد.

توجه:
از آنجا که این کار نسبتا ساده است، برای زیباتر نمودن آن از Timer استفاده می کنیم.

با این کار می توانیم حالت گرافیکی زیبایی به برنامه خود بدهیم.
در ابتدا قصد داریم کاری کنیم که، بیننده تنها توان مشاهده تصویر زمینه را داشته باشد و بعد از کلیک کردن روی یکی از دکمه هایی که در ادامه توضیح خواهم داد، پردازش بر روی تصویرها آغاز می شود. حال بهتر است به توضیح روند کلی کار بپردازیم:• Simple Mode : در این حالت تصویر پردازش شونده به تدریج بصورت عمودی (و یا افقی) تصویر زمینه را می پوشاند.در شکل 2 می تواند نمونه ای از کار Simple Mode که در حال انجام است و هنوز به پایان نرسیده، را در حالت عمودی مشاهده نمایید: 
شکل 2
 Black and white :در حرکت عمودی (Vertical) این مدل، تنها محوطه ای از عکس پردازش شونده که رنگ سفید دارد بر روی عکس زمینه قرار می گیرد و بقیه جاها دست نخورده باقی می مانند. در حالت افقی ( Horizontal ) تنها قسمت های سیاه رنگ تصویر پردازش شونده بر روی تصویر زمینه قرار می گیرند و بقیه قسمت های تصویر زمینه بدون تغییر باقی می مانند.به نمونه این مدل در شکل 3 و 4 دقت نمایید.


شکل 3 :
پردازش عمودی تصویر در مدل Black and white

شکل 4 :
پردازش افقی تصویر در مدل Black and white  Negative :در اینجا، از تصویر پردازش شونده هیچ استفاده ای نمی شود و پردازش بر روی تصویر زمینه اعمال می شود. همانطور که از اسم آن نیز پیداست، تصویر زمینه بعد از کلیک بر روی یکی از دکمه ها Vertical  و یا Horizontal نگاتیو می شود.

به شکل 5 نگاه کنید.



شکل 5


در صورتی که، در مدل نگاتیو، ابتدا حالت عمودی و سپس در نیمه مسیر، حالت افقی را انتخاب نمایید، شاهد شکل 6 خواهید بود.



شکل 6
 اگر فرصت دارید حتما قبل از خواندن ادامه مقاله، خودتان را با نوشتن برنامه محک بزنید تا با اشکالات و نقص برنامه نویسی خود آشنا شوید. در ادامه، شما بعد از خواندن مقاله به پاسخ سوالات خود می رسید و گر نه چیزی به معلوماتِ بلندمدت شما افزوده نخواهد شد! این یک تهدید نیست، بلکه یک هشدار است!

بسیار خوب، حال به مرحله برنامه نویسی می رسیم. ابتدا بهتر است فرم برنامه خود را در حالت طراحی ببینیم.
                   
                          

                              شکل 7: فرم در C++ Builder و Delphi
 
همانگونه که قبلا اشاره شده و هم اکنون نیزمشاهده می کنید، هیچگونه فرقی  میان دو فرم و شکل آنها وجود ندارد.
 متغییرهای که باید بصورت فراگیر( Global ) تعریف شوند( کد 1) :xH و yH موقعیت پیکسلی را که بصورت افقی پردازش می شود، مشخص می کنند.xV و yV موقعیت پیکسلی را که بصورت عمودی پردازش می شود، مشخص می کنند.


   

    

حال ببینیم با شروع اجرای برنامه چه اتفاق های باید در ابتدا رخ دهد( کد 2):


   

    

در ادامه اتفاقاتی که با فعال شدن تایمر verTimer بوجود می آید را بررسی میکنیم.


    

    

حال موقعیتی را بررسی می کنیم که تایمر horTimer فعال شده باشد( کد4 ) :


    

    

در کدهای زیر، شیوه فعال و غیر فعال نمودن تایمرها را در مشاهده می کنیم که در واقع بدین صورت .

اگر دکمه Vertical را فشار دهید، تایمر verTimer فعال شده و تایمر horTimer غیر فعال می شود.در صورتیکه دکمه Horizontal را فشار دهید، تایمر horTimer فعال شده و تایمر verTimer غیر فعال می شود.


   

   

در آخرین قسمت برنامه نویسی، کد دکمه Reset را مشاهده کنید( کد 6 ) :


  

  

حال حالتی را در نظر بگیرید که در یک تصویر ارسال شده از یک رویات، می خواهید تمامی تصاویر نامربوط را حذف نموده و تنها موقعیت اعضای تیم قرمز رنگ را مورد بررسی قرار دهید. حال می توانید این کار را انجام داده و آنرا با موقعیت های دیگر نیز بسنجید.                                             پاسخ به خوانندگان شاید برای دوستانی که هنوز در انتخاب زبان برنامه نویسی مشکل دارند جالب باشد قسمتی از ایمیل این دوست گرامی را بخوانند:

 
من  الان  دانشجوی  ترم  چهارم هستم و با  زبان های 
C ، C++  ،C++ Builder و Java  بطور  جسته  گریخته  کار  کرده ام  اما اصلا  از  خودم  در  این  زمینه  راضی‌  نیستم. می‌خواستم  شروع  کنم  به  یاد  گرفتن  یه  زبان  جدیدتر، اما  بعد  از کمی‌ فکر به این نتیجه رسیدم که زبان  اصلا  مهم  نیست  بلکه  اصول  کلی‌  برنامه نویسی و الگوریتم  برنامه  مهم  است، بعد  تصمیم  گرفتم  که  با  همان  C++ Builder کار  کنم  تا  در آن  زمینه  حرفی‌  برای  گفتن  داشته  باشم  بعد  اگه  خدا  بخواد  سوئیچ  کردن  روی  زبان دیگه  کار  راحتیه. منتها  یه  مشکلی‌  هست  که  چون  با  چند  نفر  دیگه  می خواهیم این کار را  خارج  از  محدودهٔ  دروس  دانشکده  انجام  بدیم  نمی دونیم  از  کجا  شروع  کنیم  یعنی‌  برای  انتخاب  پروژه  یا  برنامه  مشکل  داریم ، اگه  امکان دارد  شما  به  ما  در  انتخاب  پروژه  یا  دادن  منبع  که  بتواند این کار را  انجام دهد کمک  کنید. خلاصه عزم مان را  جزم  کردیم  که  حداقل  2 ساله  دیگه  که  درسمان  تمام  می شود فقط  "مدرک  مهندسی‌  را  با  خودمان  یدک  نکشیم". به  امید  روزی  که  همهٔ  ما  قانون  جاذبه را درک و باور  کنیم.
از اینکه به مرحله ای رسیده اید که نوع زبان برنامه نویسی، یک مرحله بعد از خلاقیت قرار گرفته به شما تبریک می گویم.برای پیشرفت در زمینه پردازش تصویر می توانید کار را با مقالات روباتیک آغاز نمایید، مخصوصا شماره ای که در مورد "تشخیص موقعیت اشیا" نوشته شده بود. این مقاله کمی از دیگر مقالات ساده تر است و در عین حال جای کار برای پیشرفت را در اختیارتان قرار می دهد.از اینکه قانون جاذبه شما را مجذوب کرد بسیار خوشحالم.به امید اینکه تا دو سال دیگر نام شما را بعنوان یکی از فعالان با نشاط دنیای برنامه نویسی ببینم.  چرا از ابزار TBitMap برای کار با تصاویر استفاده می شود؟ آیا این تنها راه است و اینکه آیا TBitMap برای تصاویری که فرمتی غیر از .BMP دارند نیز کاربرد دارد؟از انجا که TBitMap توسط خود شرکت بورلند برای کارهای پردازش تصویر طراحی و ساخته شده است، تعدادی از توابعی را که معمولا در پردازش تصویر مورد استفاده می باشند نیز بهمراه آن عرضه کرده اند که موجبات راحتی کار را فراهم آورده است. درمورد اینکه آایا TBitMap تنها وسیله کار برای پردازش تصویر است یا خیر، باید بگوییم که ابزارهای دیگری نیز وجود دارد اما به راحتی TBitMap نمی باشند. از انجا که هدف ما در این آموزش آشنایی با کلیات پردازش تصویر است، راحت ترین، کوتاه ترین و جامع ترین راه را برگزیدیم، تا مورد استفاده همگان باشد.  کدها را از کجا تهیه کرده اید؟ من می خواستم همین کدها را با استفاده از زبان Visual C++ انجام دهم، اما نتوانستم معادل این کدها را در MSDN پیدا کنم؟از اظهار لطف تان ممنونم! همانطور که قبلا نیز خدمتتان عرض کرده بودم، این کدها را برای علاقمندان به رشته روباتیک آماده کردم. هدفم شکستن این غول بود و اینکه عزیزانی که زمانی مثل خود من داغدیده فراق روبا تها بودند به مقصود برسند. اما اینکه چرا معادل آنها را جای دیگری پیدا نکردید، باید بگویم که خود کدها را هم جای دیگری غیر از "رایانه خبر" پیدا نمی کنید چه رسد به معادل آنها! البته، این سوال را می شد با عصبانیت هم جواب داد ;)   چرا در مقالات آموزشی خود از بیت مپی استفاده می کنید که هر پیکسل آن از سه بایت تشکیل شده است؟ بهتر نیست از بیت مپی استفاده کنید که هر پیکسل آن یک بایت باشد؟استفاده از ورژن یک پیکسلی نیز امکان پذیر است اما در دنیای خارجی (دنیای غیر تئوری) کاربرد بسیار محدودی دارد و نمی تواند در عرصه پهناور روباتیک، که نیاز به انعطاف پذیری فراوان دارد، مورد استفاده قرار گیرد. همانطور که قبلا نیز اشاره کرده بودم، تمام تلاشمان بر این اساس است که این مقالات هم آموزشی باشند و هم در دنیای عمل بهترین بازدهی را داشته باشند. تنها در این صورت است که می توان به آموزشی و عملی بودن این مجموعه افتخار نمود. آیا در سیستم عامل های دیگر نیز می توان این آموزش ها را پیاده کرد؟بله! یکی از کارهایی که سعی نمودیم مدنظر داشته باشیم این بود که همیشه از روند منطقی کار (الگوریتم) شروع کنیم و بعد همان روند را بصورت عملی توسط کد اجرا نماییم. در نتیجه شما می توانید تنها با فراگیری دستور العمل های ویژه زبان مقصد، تمامی این کارها را انجام دهید. منظور از دستور العمل، چند دستور محدود در رابطه با فراخوانی پیکسل ها و دسترسی به آنهاست. هرگاه خواستید مصداقی بر این گفته بیابید، در زبان برنامه نویسی جدید خود، چند فرمان مورد نیاز برای پردازش تصویر را یافته و در آنجا خواهید توانست بدون استثنا تمامی مواردی را که در این مجموعه فرا گرفته اید، اجرا نمایید.یک خبر خوب اینکه کدهای Delphi و C++ Builder را می توان در سیستم عامل Linux نیز با کمی تغییرات اجرا نمود. تنها باید Kylix را نصب نمایید (مجموعه Kylix دو زبان Delphi و C++ Builder را در خود جای داده است). آیا کار با پیکسل ها و پردازش تصویر، تنها اصول کامپیوتری در روباتیک بشمار می آیند؟یکی از فاکتورهای مورد نیاز در روباتیک آشنایی با پردازش تصویر و کار با پیکسل ها است که معمولا برای پروژه های دانشجویی کفایت می کند. اما هنگامی که بحث از روبات های پیشرفته و هوشمند به میان می آید عوامل دیگری غیر از عامل بینایی (یا همان پردازش تصویر) نیز مطرح می شود. هوش مصنوعی یکی از این موارد است که متاسفانه بدلیل سنگین بودن اصول ان در این مجال نمی گنجد. هوش مصنوعی در جایی استفاده می شود که دسترسی به هوش طبیعی (هوش آدمیزاد) وجود ندارد و مجبوریم اختیاراتی را به روبات بدهیم تا بر اساس یک سری از دستور العمل های از قبل تعیین شده، فعالیت خود را ادامه داده و منتظر دستور باقی نماند. حال اگر بخواهیم روبات را در جایی قرار دهیم که بصورت مکرر با موقعیت های جدیدی دست به گریبان است، آنگاه مجبوریم برای تعلیم این موجود مکانیکی سرکش از "شبکه های عصبی" نیز بهره ببریم. دانشمندان با استفاده از شبیه سازی "شبکه های عصبی" در مغز، سعی در بوجود آوردن حالتی دارند که توان یادگیری را در موجودات مکانیکی را نیز خلق و تقویت نمایید. بعنوان مثال در صورتی که بچه ای کار ناشایستی انجام دهد، توبیخی از جانب مادر خانواده در انتظار اوست (که می تواند یک صحبت دوستانه باشد و یا یک نوازش اساسی!). بعد از این نصیحت یا نوازش، آن بچه دیگر عمراً اگر به سراغ آن عمل ناشایست برود. همین حالت را برای یک روبات در نظر بگیرید که همچون یک کودک، تمامی آنچه را که آزمایش می کند دسته بندی می کند و در کارهای بعدی مطمئن می شود کاری که قصد انجام آن را دارد در دسته "کارهای بد" نباشند!در نتیجه، علاوه بر پردازش تصویر، هوش مصنوعی و شبکه عصبی نیز مورد نیاز است.  تیم های روباتیک (همچون روبوکاپ) تخصص چه افرادی را لازم دارد؟البته این سوال بسیار کلی است و نمی توان بصورت کامل آن را پاسخ داد، زیرا روباتیک بسیار گسترده است و تنها در حیطه فعالیت های فنی نیست و دامنه آن حتی درآاستانه ورود به قلمروی روانشناسی نیز می باشد. اما بطور کلی، رشته کامپیوتر برای انجام کارهای مرتبط به برنامه نویسی مورد استفاده قرار میگیرد (البته در سطوح بیشرفته، برنامه نویسی هوش مصنوعی و شبکه عصبی در اولویت کار مهندسان کامپیوتر قرار دارد). علاوه بر کامپیوتر، علاقمندان، دانشجویان و فارغ التحصیلان رشته الکترونیک می بایست نیازهای الکترونیکی را برطرف نمایند. از میان این نیازها می توان به ارتباط پورتی کامپیوتر با روبات، آماده سازی مقدمات ارتباط بی سیم اجزا با یکدیگر و غیره اشاره نمود. با وجود دو تخصص کامپیوتر و الکترونیک، تنها نیاز باقیمانده، مکانیک خواهد بود که میبایست قدرت حرکت، چرخش و مانور فیزیکی روبات را طراحی نماید. البته همانطور که قبلا نیز اشاره شد، این سه تخصص، در همه موارد، تنها نیازهای یک گروه روباتیک نیست.   چرا در همه برنامه ها، تمامی پردازش ها بر اساس تک تک پیکسل ها انجام می شود؟ آیا می توان بلوک بلوک پردازش را انجام داد؟بله! امکان پردازش بلوکی تصویر نیز وجود دارد، اما زبان های برنامه نویسی مورد استفاده، تابع های مورد نیاز اینگونه پردازشها را فراهم نکرده اند و فرد میبایست خود با نوشتن این تابع ها این نیاز خود را برطرف نماید (که البته کار سختی نیست). زبان برنامه نویسی MATLAB (Matrix Laboratory) امکان پردازش بلوکی تصاویر را به برنامه نویسان خود داده است، که البته استفاده از این زبان را برای عزیزانی که تازه کار هستند توصیه نمی کنم. یکی از ایمیل هایی در این مدت دریافت کرده ام با این جمله شروع می شد: مرسی از  اینکه  ایمیل  قبلی مرا  جواب  دادین  ( راستش  اصلا  فکرشو  نمیکردم). بعد از خوندن مقالتون در ماهنامه (خصوصا شماره هفده) و آشنایی با لحن و بیان صمیمیتون، شوق مضاعفی در مکاتبه با شما پیدا کردم و ... بسیار خوشحالم که مقالات روباتیک توانسته رابطه صمیمانه ای با شما برقرار کند و خیلی و نارحت شدم از اینکه که اصلا فکر نمیکردید جوابی دریافت کنید. این قضیه بسیار دردناک است که گزینه پیش فرض (Default) حتی یکی از جوانان ما عدم دریافت پاسخ باشد. من این مسئله ننگی بر فرهنگ مان می دانم که تا برطرف نشود ما همچنان جهان سوم (یا شاید چهارم) باقی خواهیم ماند. چرا در مقالات خود از حیطه علمی خارج می شوید و وارد بحث های غیر علمی می شوید؟ بهتر نیست تنها در محدوده مسئولیتان فعالیت نمایید؟تشکر می کنم که صراحتاً نظر خود را مطرح نمودید. خوشبختانه بسیاری از خوانندگان از اینکه مجله فضایی اینگونه صمیمی با خوانندگانش دارد، قدردان کادر محترم آن هستند. اما برای اینکه پاسخی هم به این شبهه داده باشیم، خدمت شما دوست گرامی عرض می کنم: دانش بدون فرهنگ ارزشی ندارد و فرهنگ نیز بدون دانش بی ارزش است. ما (بعنوان جوانان این جامعه) چطور می توانیم شاهد این همه تضاد در رفتارهای اجتماعی باشیم و  بی تفاوت و ساکت بمانیم. چطور می توان ساکت بود در حالی که الگوی علمی خود را گم کرده ایم و تنها در یافتن الگوهای نقاشی شده و روغن کاری شده تبحر داریم. درست است که بافت اجتماعی کشور، تقویت کننده این وضعیت است، اما چطور می توان زبان در کام گرفت در حالی که بسیاری از دانشگاه های ما به مراسم بزم و عروسی و جشن فرشته های خزان بی شباهت نیستند. چرا کشورهای که مظهر رشد علمی در دنیا هستند را نمی بینیم.چرا به دانشجویان طراز اول آنها نمی نگریم. چرا نمی بینیم آنان به چه چیزهایی بها می دهند. اگر ما (به فرض مثال) واقعا آنها را الگو می ساختیم ، باز بهتر از الان جواب می گرفتیم. زیرا در حال حاضر بازیگران و هنرپیشگان را بر دیوارهای زندگیمان چسبانده ایم و الگوهای علمی بشر را از یاد برده ایم. هیچکدام از آن کشورها فرهنگ دو هزار ساله ندارند!چرا ما تنها در این کارهاست که دست همه را از پشت می بندیم. پس فرهنگ هفت هزار ساله ما کجاست!هیچ کس با مفهوم تمیزی و آراستگی پسران و دختران جوان، که قدمت شش هزار ساله دارد، مشکلی ندارد، اما هنگامی که تمیزی و آراستگی جا، پای "خود نمایی" بگذارد، باید ریشه آنرا در اعتماد به نفس پایین، اختلالات شخصیتی و یا ضعف در الگو برداری جستجو کرد. این مسئله را روانشناسان و جامعه شناسان برجسته جهانی مطرح می کنند .. متاسفانه این مسائل در محافل علمی ما مطرح نمی شود و این مسئولیت را به دوش کسانی گذاشته ایم که خود نتوانسته اند الگوی مناسبی برای جوانان فرهیخته ما باشند. تاثیرگذاری یک استاد نمونه و فرهیختة کامپیوتر چه در مقوله علم و چه در مجال فرهنگ، کم از یک جامعه شناس ندارد. یک دانشجو بیشتر از استاد روشنفکر خود تاثیر می پذیرد تا یک جامعه شناس که ممکن است یکبار در زندگی با او ملاقات نموده یا کتابی از او مطالعه نماید.یکی از واحدهای مقطع کارشناسی کامپیوتر دانشگاه های انگلستان را به این مسئله اختصاص داده اند که یک فرد نباید فقط یک برنامه نویس، یا تکنیسین باشد تا دیگران تنها از توانایی های علمی او استفاده نمایند. بلکه باید دانش یک برنامه نویس، قدرت تحلیل یک تحلیلگر و ارتباطات عمومی یک مدیر را نیز در اختیار داشته باشد. چرا تنها ما باید دانش را از فرهنگ جدا کنیم. کلاس های کسل کننده دانشگاه های ما بیداد می کنند و ما آرمیده ایم.  امیدواریم که هنوز جایی برای امید وجود داشته باشد و "انتظار"، تنها راه حل باقیمانده نباشد!جوانان ما برای انتظار آفریده نشده اند، خلاقیت و جنبش آرزوی آنهاست. هم جنبش علمی و هم جنبش فرهنگی. فردی که از مشرق زمین برمیخیزد باید افتخارات دنیا را با نام سرزمین خود به دنیا عرضه کند، به فرهنگ دیگران احترام بگذارد، دانش را بچنگ آورد و خاک خود به زادگاه شگفتی بدل نماید.افلاطون، فیلسوف بزرگ یونانی، اینگونه فاجعه زندگی را به تصویر می کشد:Plato: We can easily forgive a child who is afraid of the dark;
the real tragedy of life is when men are afraid of the light.
ما براحتی می توانیم، کودکی را که از تاریکی هراسان است، معذور بداریم.
 فاجعه واقعی زندگی زمانی است که انسان ها از نور بترسند.

  
نویسنده : ali gooliof ; ساعت ۱۱:۳٧ ‎ق.ظ روز ۱۳۸٧/٢/٢٤
تگ ها :