سلام به همه شما دوستان عزیز: ) تو این پست قراره بازی رو با پایتون پیاده کنیم اما این بازی یه نکته متمایز کننده نسبت به بقیه flappy bird ها داره، اونم اینه که قراره برای کنترل پرنده از بینایی ماشین استفاده کنید. شاید الان با خودتون بگین که خب پس ولش کن این مطلب به درد ما نمی خوره، چون یا بینایی ماشین رو با اون الگوریتم های ریاضی سختش بلد نیستید یا کتابخانه هایی مثل opencv رو بلد نیستید. اما در جواب باید بگم هیچ کدوم لازم نیست: ) شاید با تعجب بگین چطوری؟ ؟ ؟ ؟ گوگل چند وقت پیش یه فریمورک به نام منتشر کرد که کار مارو خیلی ساده می کنه. یعنی دیگه لازم نیست کتاب های طویل بینایی ماشین و یادگیری ماشین رو بخونید تا بتونید همچین پروژه ای را انجام بدید، (مثل من) بتونه پروژه های خودش را به سادگی پیاده سازی کنه. خب دیگه بحث کافیه بریم سراغ آموزش. نصب پیش نیاز ها با این دستور خود mediapipe و تمام نیاز هاش مثل numpy نصب میشه شروع ساخت اول از همه main پروژه رو می سازیم اول کتابخانه های opencv و mediapipe و. رو اضافه میکنیم چون لازمشون داریم، و بعد به main ساده می سازیم. حالا نیاز به تصویر داریم برای همین وبکم رو کانفیگ می کنیم و بعد ازش تصویر میگیریم با چند تا ریزه کاری دیگه در یک اقدام عجیب همین اول میریم game over رو می نویسیم الان تصویری که بهتون خروجی میده شاید هنگام بازی گیجتون کنه چون رو به روی شماست پس راست شما میشه چپ تصویر و چپ تصویر میشه راست شما برای همین تصویر رو قرینه ( flip ) می کنیم حالا که تصویر داریم باید چیکار کنیم؟ ؟ درسته حدس زدید! (هرچند نمی دونم چی گفتین: |) الان باید چهره شخص رو شناسایی کنیم چون قرار پرنده روی دماغ شما پرواز کنه! گیج نشید، وحشت نکنید، ناراحت ام نشدید. بیاد قدم به قدم پیش بریم. اول از همه از mediapipe سلوشن مربوط به صورت رو با نام face باز کردیم (چی گفتم =|) بعد ابعاد تصویر رو از میگیریم و پس از اون ترکیب رنگ تصویر رو به RGB تغییر میدیم، شاید بپرسید چرا؟ ؟ میدیاپایپ می تونه تصاویر RGB رو پردازش کنه در حالی که خروجی webcom ما BGR است (اگه نمی دونید اینا چین به گوگل مراجعه کنید) و اینجا با یه دستور ساده چهره شخص رو پردازش می کنیم به همین سادگی دیدید سخت نبود حالا یه شرط می بینید که میگه اگر چهره ای تو تصویر نبود بازی کن را تمام کن، چرا؟ چون افراد تقلب کار ممکنه صورتشون رو از تصویر خارج کنن اینطوری پرنده ای ظاهر نمیشه و در نتیجه ام نمی بازن حالا مکان بینی شخص داخل تصویر رو پیدا می کنیم، چطوری؟ mediapipe داخل خروجی هاش درقالب یک لیست به landmark هایی رو میده که هر کدوم مربوط به عضوی از بدن هستن. ایدکس شماره این لیست مربوط به بینی است کار تموم شد؟ نه! مختصاتی که mediapipe به ما میده یه عدد اعشاری بین و است که در واقیه به نسبت ابعاد تصویره ولی ما به یه عدد صحیح نیاز داریم پس با ضرب کردن این عداد در ابعاد واقعی تصویر مختصات صحیح به دست میاد سوالی که پیش میاد اینه که پرنده را از کجا بیارین؟ ؟ خب همون طور که می بینید یه تابع نوشتیم به نام که از طریق اون از یک فایل عکس پرنده رو می خونیم و سپس اون رو resize می کنیم تا خیلی بزرگ نشه در اخر هم با تابع پرنده رو نمایش می دیم، اول یکم مختصات را تغییر میدیم تا پرنده دقیق روی بینی قرار بگیره بعد هم برای اینکه دور پرنده شفاف باشه نقاط سیاه رنگ پس زمینه عکس پرنده رو یعنی جایی که کد رنگش باشه رو با نقاط تصویر اصلی عوض می کنیم و تصویر حاصل رو روی بینی شخص قرار میدیم الان بازی تا جای خوبی پیشرفته ولی خب مثل بازی اصلی نشده داخل بازی اصلی یه سری دیوار هایی سر راه ما سبز میشن که اگه به اونا برخورد کنیم می میریم (اما نه تو دنیا واقعی) پس بیاید بنویسیمش اوه چی بود چی شد =| اولش که خیلی اسونه هر فریم یه دیوار می سازیم (فقط Y پایین فاصله دو دیوار بالا و پایین رو رندم می سازیم بقیش قابل محاسبه است) و به بافر دیوار های اضافه اش می کنیم بعد میگیم دیوار هارو نمایش بده (در واقع ما تو لیست دیوار ها فقط مقدار y بخش پایینی فضای خالی دیوار هارو داریم و بقیه مقادیر رو محاسبه می کنیم) انیجاش میایم دیوار هارو حرکت میدیم خیلی ام ساده است حالا بررسی می کنیم ببینیم با دیواری برخورد کردیم یا نه؟ اگه خورده بودیم به دیوار که باختیم ولی اگه از وسطش رد شدیم امتیاز میگیریم. (داخل تابع اش میایم تمام دیوار هارو مورد بررسی قرارا می دیم تا ببینیم بینشون هستیم یا روشون) امتیاز ها چی شد پس؟ خب همین طور که می بینید با یه خط امتیاز رو گوشیه تصویر نمایش دادیم، تمام: ) سخن پایانی خب دوستان خیلی خوشحالم که تا اینجا کنار ما بودید. شما می تونید این پروژه رو داخل github بنده ببینید (خوشحال میشم مشارکت کنید یا ستاره بدین) جهت یادگیری بهتر این فریم ورک می تونید به دوره اموزشی بنده در وبسایت جت اموز مراجعه کنید التماس دعا خدا نگهدار.