Cum să găsiți poziția camerei din trei puncte înspaţiu

trei
De ceva timp am avut ideea unui scenariu pentru Blender care să găsească poziția camerei în spațiu din puncte cunoscute din capul meu.

Acestea. avem o fotografie, în acest caz a unui scaun. Mi se pare posibil, cunoscând poziția punctelor în spațiu, cunoscând coordonatele acelorași puncte din fotografie (precum și unghiul de vedere al camerei), să găsim poziția camerei. Dar nu înțeleg cum să abordez această problemă. Fragmente de gânduri precum „secțiunea piramidei”, „proiecție centrală” și alte „stereometrie” se învârt în capul meu.

Solicitați în ce direcție să sapi? Scriptul va fi scris în al treilea python, poate există câteva pachete utile?

Polinomul are doar puteri pare ale lui z, coeficientul lui z^8 este (a^2+b^2+c^2-2*a*b*c-1)^2. Mă întreb ce este.

Mrrl: Este imposibil de spus că totul merge bine, nu este foarte stabil. Poate se acumulează eroarea de calcul, dualismul soluțiilor unui polinom de grad egal poate afecta. din cinci puncte, de obicei 3 sunt determinate aproximativ normal, 2 sunt plutitoare - cel mai apropiat dintre cele două puncte se poate dovedi a fi mai îndepărtat sau, în general, punctul zboară din scenă.

Rezolvarea se realizează prin înlocuirea variabilelor polinomiale a1*z^8 + a2*z^6 + a3*z^4 + a4*z^2 + a5 = 0 cu z1 = z^8, z2 = z^6, z3 = z^4 , z4 = z^2 și calculul ulterior al matricei inverse a sistemului liniar, compusă din aceste 5 puncte. Condițiile z3

Mrrl: Distanța Z a primit atenție în modul în care ați menționat - altfel probabil că nu ar fi fost posibil să obțineți aceste rezultate modeste, dar sperăm că promițătoare.

Multiplicitatea nu-mi oferă totuși liniște sufletească - se află în ecuațiile teoremei cosinusului, geometric poți avea o astfel de imagine imediatimaginați-vă:

poziția
Este ușor de observat că punctele A3 și A3' satisfac orice condiții ale teoremei cosinusului, nu doar într-o pereche separată de puncte, ci și într-o mulțime mai complexă a acestora ( în acest caz, 3 puncte).

Mrrl: Mi se pare că cel mai probabil rădăcinile vor fi apropiate, ceea ce rezultă și din ilustrarea geometrică a problemei - este punctul n situat pe dZ mai aproape sau mai departe decât vecinii săi din populație?

Nu vreau să iau un număr mare de puncte - la urma urmei, complexitatea de calcul a algoritmului este vizibilă, calculul tuturor coeficienților unei ecuații este de aproximativ o mie de operații de adunare și înmulțire, un sistem de 4 ur pentru unul punct, împreună cu soluția matricei inverse, este deja mai mult de 5 mii de operații și ar trebui să funcționeze în timp real pe iPad/iPhone. Da, iar punctele de referință mai trebuie luate undeva, mai ales în primele iterații.

Pe de altă parte, modelul nu folosește cea mai importantă regulă - că centrul camerei, punctul din spațiu și proiecția punctului sunt pe aceeași linie dreaptă. Proiecția punctului poate fi exprimată în coordonate reale condiționate prin coordonatele pixelilor în conformitate cu matricele de rotație a camerei: C + (cos(Rz)*cos(Ry)*Ux - sin(Rx)*sin(Ry)* cos (Rz)-Uy*cos(Rx)*sin(Rz), sin(Rz)*cos(Ry)*Ux-sin(Rx)*sin(Ry)*sin(Rz)+Uy*cos ( Rx)*cos(Rz), -Ux*sin(Ry)-cos(Ry)*sin(Rx) ) ), С - centrul camerei dorit, U este calculat din coordonatele pixelilor punctului ca (tg(uv.x-W/2)/W*fov_x,tg(uv.y-H/2)/H*fov_y))

Am încercat să compun un sistem liniar prin ecuația unei drepte, ținând cont de date pe trei puncte - centrul camerei, un punct în spațiu și un punct proiectiv, dar până acum s-au obținut doar sisteme omogene, undeva trebuie să ia termenul liber.