تبدیل Perspective با استفاده از مختصات اولیه و نهایی ۴ نقطه از تصویر

خیلی از مواقع پیش آمده است که با استفاده از دوربین گوشی همراه می خواهیم از یک برگه عکس بگیریم ولی سایه دست و گوشی باعث خراب شدن تصویر می شوند. در این پست قصد دارم یک کد ساده برای رفع این مشکل بنویسم؛ بدین صورت که حتماً لازم نیست دوربین را دقیقاً مقابل برگه بگیریم، بلکه کاری می کنیم تا تصویر گرفته شده به این حالت در بیاید. این کار را با دستورات cv2.warpPerspective و cv2.getPerspectiveTransform انجام خواهیم داد.

   اگر مختصات دکارتی چند نقطه از یک تصویر و مختصات نهایی آن نقاط را در اختیار داشته باشیم، با استفاده از تابع cv2.getPerspectiveTransform، می توان یک ماتریس انتقالی برای تمامی نقاط آن تصویر بدست آورد. سپس با استفاده از تابع cv2.warpPerspective، این انتقال را به تمامی نقاط اعمال می کنیم. تصویر سمت چپ،عکس ورودی و عکس سمت راست خروجی نهایی کد خواهد بود.

   مجهول اصلی در این تبدیل، مختصات اولیه و نهایی نقاط است. فرض می کنیم که برگه ها مستطیل شکل هستند و مختصات اولیه نقاط ( بالا-چپ، بالا-راست، پایین-راست و پایین-چپ) در دسترس هستند. بنابراین کاری که باید انجام دهیم بدست آوردن مختصال نهایی این ۴ نقطه خواهد بود. تمامی کدها توسط Python 2.7 و OpenCV 3.0.0 نوشته شده اند.

 

    ابتدا پکیج های مورد نیاز را وارد می کنیم. numpy برای numerical processing و cv2 برای opencv است.

   تابع order_points، لیست ۴ نقطه مورد نظر را در اختیار ما می گذارد. از یک آرایه خالی با ابعاد ۲*۴ به عنوان حافظه این تابع استفاده می کنیم.

   طبق ریاضیات مربوط به پرسپکتیو، نقطه بالا-چپ، دارای کوچکترین مجموع (x+y) و نقطه پایین-راست، دارای بیشترین مجموع (x+y) هستند.

   برای دو نقطه دیگر برعکس این ماجرا صدق می کند. نقطه بالا-راست، دارای کمترین مقدار تفاضل (x-y) و نقطه پایین-چپ دارای بیشترین تفاضل (x-y) هستند. در آخر تابع مقدار rect را بر می گردانیم.

 

   تابع four_point_transform، دارای دو پارامتر image و pts است. image، عکسی است که تبدیل پرسپکتیو را به آن اعمال می کنیم و pts، لیست ۴ نقطه از تصویر است. با استفاده از تابع order_points، نقاط را فراخوانی و به متغیرهایی اختصاص می دهیم.

   عرض عکس جدید، بیشترین فاصله بین نقاط پالا-چپ و راست-راست و یا بیشترین فاصله نقاط پایین-چپ و پایین-راست است.

   به صورت مشابه ارتفاع عکس جدید نیز بیشترین فاصله بین نقاط بالا-راست و پایین-راست است و یا بیشترین فاصله بین نقاط بالا-چپ و پایین-چپ خواهد بود.

   آرایه dst شامل مختصات نهایی ۴ نقطه هستند. اکنون نوبت به محاسبه ماتریس انتقال است. و پس از آن اعمال این ماتریس انتقال به تصویر اصلی است.

 

   برای تست کد از یک تصویر نمونه و مختصات اولیه نقاط آن استفاده خواهیم کرد.

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

منبع: آقای خوش نظر

mehdi sehati

در این سایت پروژه و آموزش های انواع ماژول ها و میکروکنترلر ها و نحوه ارتباط سخت افزار با نرم افزار (برنامه نویسی اندروید برای گوشی و برنامه نویسی سی شارپ برای کامپیوتر) و برنامه نویسی پایتون و رسبری پای و ماژول های وای فای قرار میگیرد همچنین دوستان برای توضیحات بیشتر و سفارش پروژه میتوانند به آی دی تلگرام بنده مراجعه کنند

مطالب مرتبط

Subscribe
Notify of
guest

0 نظرات
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x