إحداثيات بكسل إلى خط ثلاثي الأبعاد (OpenCV)
-
29-09-2019 - |
سؤال
لدي صورة معروضة على الشاشة غير مصممة عبر cvinitundistortmap & cvremap (بعد معايرة الكاميرا) ، وينقر المستخدم على ميزة في الصورة. لذلك لدي إحداثيات البيكسل (U ، V) للميزة ، ولدي أيضًا المصفوفة الجوهرية ومصفوفة التشويه.
ما أبحث عنه هو معادلة الخط ثلاثي الأبعاد في إحداثيات الكاميرا/العالم الحقيقي التي يجب أن تكمن عليها الميزة التي نقرها المستخدم. لدي بالفعل المسافة العمودية بين مستوى صورة الكاميرا والميزة ، لذلك يمكنني الجمع بين ذلك مع المعادلة المذكورة أعلاه لإعطائي إحداثيات (X ، Y ، Z) للميزة في الفضاء.
تبدو سهلة (مصفوفة جوهرية عكسية أو شيء من هذا القبيل؟) ولكن لا يمكنني العثور على إرشادات خطوة بخطوة في أي مكان. C ++ أو C# رمز المفضل.
المحلول
هذا سؤال قديم بعض الشيء ولكنه قد لا يزال مفيدًا لشخص ما. جميع الخطوط تمر عبر النقطة (0،0،0) ، هكذا:
line.x0 = 0 ؛ line.y0 = 0 ؛ line.z0 = 0 ؛
ناقل الاتجاه هو كما يلي: line.a = (u/fx) - (cx/fx) ؛ line.b = (v/fy) - (cy/fy) ؛ line.c = 1 ؛
CX ، CY ، FX ، FY هي معلمات من مصفوفة الكاميرا. يتم شرح المعادلات في كتاب "تعلم OpenCV".