مصفوفة الإسقاط ثلاثية الأبعاد إلى ثنائية الأبعاد

StackOverflow https://stackoverflow.com/questions/130829

سؤال

لدي 3 نقاط في مساحة ثلاثية الأبعاد أعرف مواقعها بالضبط.لنفترض أنهم: (x0,y0,z0), (x1,y1,z1) و (x2,y2,z2).

لدي أيضًا كاميرا تنظر إلى هذه النقاط الثلاث وأعرف المواقع ثنائية الأبعاد لتلك النقاط الثلاث على مستوى عرض الكاميرا.هكذا على سبيل المثال (x0,y0,z0) سوف يكون (x0',y0'), ، و (x1,y1,z1) سوف يكون (x1',y1') و (x2,y2,z2) سوف يكون (x2',y2') من وجهة نظر الكاميرا.

ما هي أسهل طريقة للعثور على مصفوفة الإسقاط التي ستعرض تلك النقاط ثلاثية الأبعاد إلى نقاط ثنائية الأبعاد على مستوى عرض الكاميرا.لا نعرف شيئًا عن موقع الكاميرا.

هل كانت مفيدة؟

المحلول

يمنحك هذا مجموعتين، كل واحدة من ثلاث معادلات في 3 متغيرات:

a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'

d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'

ما عليك سوى استخدام أي طريقة أسهل لحل المعادلات الآنية في موقفك (ليس من الصعب حتى حلها "يدويًا").إذن مصفوفة التحويل الخاصة بك هي ((a,b,c)(d,e,f)).

...

في الواقع، هذا أمر مبالغ فيه ويفترض أن الكاميرا تشير إلى أصل نظام الإحداثيات ثلاثي الأبعاد الخاص بك ولا يوجد منظور.

بالنسبة للمنظور، تعمل مصفوفة التحويل بشكل أشبه بما يلي:

               ( a, b, c, d )   ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
               ( i, j, k, l )   ( zt )

( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;

لكن مصفوفة 4x3 مقيدة أكثر من 12 درجة من الحرية كما ينبغي لنا

a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1

لذلك ربما يجب أن يكون لديك 4 نقاط للحصول على 8 معادلات لتغطية المتغيرات الستة لموضع الكاميرا وزاويتها ومتغير واحد آخر لقياس نقاط العرض ثنائية الأبعاد حيث سنكون قادرين على حذف الإحداثيات "المركزية" (xc,yc ).

لذا، إذا كان لديك 4 نقاط وقمت بتحويل نقاط العرض ثنائية الأبعاد لتكون مرتبطة بمركز شاشتك، فيمكنك الحصول على 14 معادلة متزامنة في 13 متغيرًا وحلها.

لسوء الحظ، ستة من المعادلات ليست معادلات خطية.ولحسن الحظ، تقتصر جميع المتغيرات في تلك المعادلات على القيم الواقعة بين -1 و1، لذلك لا يزال من الممكن حل المعادلات.

نصائح أخرى

تتمتع الكاميرا (على الأقل) بـ 7 درجات من الحرية - 3 للموضع و3 للتوجيه و1 لمجال الرؤية.أنا متأكد من أن هناك من سيصحح لي إذا كنت مخطئًا، ولكن لا يبدو أن 3 نقاط كافية للحل الكامل.

للحصول على حل عام لهذه المشكلة، ابحث عن "عرض الارتباط" في Graphics Gems II.

ما تبحث عنه يسمى خوارزمية تقدير الوضعية.ألق نظرة على تنفيذ POSIT في OpenCV: http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit

ستحتاج إلى أربع نقاط أو أكثر، ولا يجوز أن تقع في نفس المستوى.

يوجد برنامج تعليمي لهذا التنفيذ هنا:http://opencv.willowgarage.com/wiki/Posit

احرص على الرغم من ذلك:في البرنامج التعليمي، يتم استخدام إطار عرض مربع، لذا فإن جميع إحداثيات العرض تقع في النطاق -1،-1 إلى 1,1.يؤدي هذا إلى افتراض أن هذه العناصر يجب أن تكون موجودة في نظام إحداثيات الكاميرا (قبل تصحيح نسبة العرض إلى الارتفاع).هذا ليس هو الحال، لذا إذا كنت تستخدم إطار عرض على سبيل المثال.إذا كانت نسبة العرض إلى الارتفاع 4:3، فيجب أن تكون إحداثيات الإدخال في النطاق -1.3333، -1 إلى 1.3333،1.

بالمناسبة، إذا كانت النقاط الخاصة بك يجب تقع في نفس المستوى، ثم يمكنك أيضًا إلقاء نظرة على خوارزمية CameraCalibration من OpenCV، ولكن هذا يتطلب المزيد من الإعداد ويتطلب المزيد من النقاط كمدخل.ومع ذلك، فإنه سيعطيك أيضًا معلومات التشويه والمعلمات الجوهرية للكاميرا الخاصة بك.

لا أعتقد أن هناك معلومات كافية لإيجاد حل نهائي.بدون معرفة موقع الكاميرا الخاصة بك ودون معرفة مستوى العرض الخاص بك، هناك عدد لا نهائي من المصفوفات التي يمكنها حل هذه المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top