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

تصویر
اعوجاج شعاعی را می توان به شرح زیر نشان داد:
[x_ = x (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) \ y_ = y (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) ]
به طور مشابه ، اعوجاج مماس اتفاق می افتد زیرا لنز تصویربرداری کاملاً موازی با صفحه تصویربرداری نیست. بنابراین ، برخی از مناطق موجود در تصویر ممکن است نزدیکتر از حد انتظار به نظر برسند. مقدار اعوجاج مماس را می توان به شرح زیر نشان داد:
[x_ = x + [2p_1xy + p_2 (r^2 + 2x^2)] \ y_ = y + [p_1 (r^2 + 2y^2) + 2p_2xy] ]
به طور خلاصه ، ما باید پنج پارامتر پیدا کنیم ، که به عنوان ضرایب اعوجاج داده شده توسط:
[اعوجاج ؛ضرایب = (k_1 hspace k_2 hspace p_1 hspace p_2 hspace k_3) ]
علاوه بر این ، ما باید اطلاعات دیگری مانند پارامترهای ذاتی و بیرونی دوربین داشته باشیم. پارامترهای ذاتی مخصوص یک دوربین است. آنها شامل اطلاعاتی مانند فاصله کانونی ( (f_x ، f_y )) و مراکز نوری ( (c_x ، c_y )) هستند. از فاصله کانونی و مراکز نوری می توان برای ایجاد یک ماتریس دوربین استفاده کرد که می تواند برای از بین بردن اعوجاج به دلیل لنزهای یک دوربین خاص استفاده شود. ماتریس دوربین برای یک دوربین خاص منحصر به فرد است ، بنابراین پس از محاسبه ، می توان از آن در سایر تصاویر گرفته شده توسط همان دوربین استفاده کرد. به عنوان یک ماتریس 3x3 بیان شده است:
[دوربین ؛ماتریس = سمت چپ [ شروع f_x & 0 & c_x \ 0 & f_y & c_y \ 0 & 0 & 1 end right] ]
پارامترهای بیرونی با بردارهای چرخش و ترجمه مطابقت دارد که مختصات یک نقطه سه بعدی را به یک سیستم مختصات ترجمه می کند.
برای برنامه های استریو ، این تحریف ها ابتدا باید اصلاح شوند. برای یافتن این پارامترها ، باید برخی از تصاویر نمونه از یک الگوی خوب تعریف شده (به عنوان مثال یک صفحه شطرنج) را ارائه دهیم. ما برخی از نکات خاص را پیدا می کنیم که از قبل موقعیت های نسبی را می دانیم (به عنوان مثال گوشه های مربع در صفحه شطرنج). ما مختصات این نکات را در فضای دنیای واقعی می شناسیم و مختصات موجود در تصویر را می شناسیم ، بنابراین می توانیم ضرایب اعوجاج را حل کنیم. برای نتایج بهتر ، حداقل به 10 الگوی آزمون نیاز داریم.
رمز
همانطور که در بالا ذکر شد ، ما برای کالیبراسیون دوربین حداقل به 10 الگوی آزمایش نیاز داریم. OpenCV با برخی از تصاویر از یک صفحه شطرنج همراه است (به نمونه ها/داده ها/Left01. jpg - Left14. jpg مراجعه کنید) ، بنابراین ما از این موارد استفاده خواهیم کرد. تصویری از صفحه شطرنج را در نظر بگیرید. داده های مهم ورودی مورد نیاز برای کالیبراسیون دوربین مجموعه ای از نقاط جهان واقعی 3D و مختصات 2D مربوط به این نقاط در تصویر است. نقاط تصویر 2D خوب هستند که می توانیم به راحتی از تصویر پیدا کنیم.(این نقاط تصویر مکانهایی هستند که دو مربع سیاه در تابلوهای شطرنج یکدیگر را لمس می کنند)
در مورد امتیازهای سه بعدی از فضای دنیای واقعی چطور؟این تصاویر از یک دوربین استاتیک گرفته می شود و تخته های شطرنج در مکان ها و جهت گیری های مختلف قرار می گیرند. بنابراین ما باید مقادیر ((x ، y ، z) ) را بدانیم. اما برای سادگی می توانیم بگوییم که تخته شطرنج در هواپیمای XY ثابت نگه داشته شده است ، (بنابراین z = 0 همیشه) و دوربین بر این اساس جابجا می شد. این توجه به ما کمک می کند تا فقط مقادیر x ، y را پیدا کنیم. اکنون برای مقادیر x ، y ، ما به سادگی می توانیم نقاط را به عنوان (0/0) ، (1،0) ، (2،0) ، منتقل کنیم. که نشانگر موقعیت نقاط است. در این حالت ، نتیجه ای که می گیریم در مقیاس اندازه مربع تخته شطرنج خواهد بود. اما اگر اندازه مربع را بدانیم ، (مثلاً 30 میلی متر) ، می توانیم مقادیر (0/0) ، (30،0) ، (60،0) را منتقل کنیم. بشربنابراین ، ما نتایج را در MM دریافت می کنیم.(در این حالت ، ما اندازه مربع را نمی دانیم از آنجا که ما آن تصاویر را نگرفتیم ، بنابراین از نظر اندازه مربع عبور می کنیم).
نقاط سه بعدی به عنوان نقاط شیء و نقاط تصویر 2D نامیده می شوند.
برپایی
بنابراین برای یافتن الگوی در صفحه شطرنج ، می توانیم از عملکرد ، cv. findchessboardcoers () استفاده کنیم. ما همچنین باید در این مثال از شبکه 7x6 استفاده کنیم ، مانند شبکه 8x8 ، شبکه 5x5 و غیره.(به طور معمول یک تخته شطرنج دارای 8x8 مربع و گوشه های داخلی 7x7). در صورت دستیابی به الگوی ، نقاط گوشه و retval را برمی گرداند. این گوشه ها به ترتیب قرار می گیرند (از سمت چپ به راست ، از بالا به پایین)
توجه داشته باشید که این عملکرد ممکن است قادر به یافتن الگوی مورد نیاز در تمام تصاویر نباشد. بنابراین ، یک گزینه خوب نوشتن کد به گونه ای است که دوربین را شروع می کند و هر فریم را برای الگوی مورد نیاز بررسی می کند. پس از به دست آوردن الگوی ، گوشه ها را پیدا کرده و آن را در یک لیست ذخیره کنید. همچنین ، قبل از خواندن قاب بعدی ، فاصله زمانی را ارائه دهید تا بتوانیم تخته شطرنج خود را در جهت های مختلف تنظیم کنیم. این فرآیند را ادامه دهید تا تعداد مورد نیاز الگوهای خوب بدست آید. حتی در مثال ارائه شده در اینجا ، ما مطمئن نیستیم که چند تصویر از 14 داده شده خوب است. بنابراین ، ما باید تمام تصاویر را بخوانیم و فقط تصاویر خوب را بگیریم. به جای تخته شطرنج ، می توانیم از یک شبکه دایره ای استفاده کنیم. در این حالت ، برای یافتن الگوی باید از عملکرد cv. findcirclesgrid () استفاده کنیم. تصاویر کمتری برای انجام کالیبراسیون دوربین با استفاده از یک شبکه دایره ای کافی هستند.
پس از پیدا کردن گوشه ها ، می توانیم دقت آنها را با استفاده از cv. coersubpix () افزایش دهیم. ما همچنین می توانیم با استفاده از cv. drawchessboardcoers () الگوی را ترسیم کنیم. تمام این مراحل در کد زیر گنجانده شده است:
فارکس وکسب درامد...
ما را در سایت فارکس وکسب درامد دنبال می کنید
برچسب :
نویسنده : احمد قانع پور
بازدید : 33
تاريخ : شنبه
31 تير
1402 ساعت: :