_core.pyi 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. """
  2. This library provides a collection of minimal solvers for camera pose estimation.
  3. """
  4. from __future__ import annotations
  5. import collections.abc
  6. import numpy
  7. import numpy.typing
  8. import typing
  9. __all__: list[str] = [
  10. "BundleOptions",
  11. "Camera",
  12. "CameraPose",
  13. "Image",
  14. "ImagePair",
  15. "PairwiseMatches",
  16. "RansacOptions",
  17. "essential_matrix_5pt",
  18. "essential_matrix_8pt",
  19. "estimate_1D_radial_absolute_pose",
  20. "estimate_absolute_pose",
  21. "estimate_absolute_pose_pnpl",
  22. "estimate_fundamental",
  23. "estimate_generalized_absolute_pose",
  24. "estimate_generalized_relative_pose",
  25. "estimate_homography",
  26. "estimate_hybrid_pose",
  27. "estimate_relative_pose",
  28. "estimate_shared_focal_relative_pose",
  29. "focals_from_fundamental",
  30. "focals_from_fundamental_iterative",
  31. "gen_relpose_6pt",
  32. "gen_relpose_upright_4pt",
  33. "gp3p",
  34. "gp4ps",
  35. "gp4ps_camposeco",
  36. "gp4ps_kukelova",
  37. "motion_from_homography",
  38. "p1p2ll",
  39. "p2p1ll",
  40. "p2p2pl",
  41. "p3ll",
  42. "p3p",
  43. "p4pf",
  44. "p5lp_radial",
  45. "p6lp",
  46. "refine_absolute_pose",
  47. "refine_absolute_pose_pnpl",
  48. "refine_fundamental",
  49. "refine_generalized_absolute_pose",
  50. "refine_generalized_relative_pose",
  51. "refine_homography",
  52. "refine_relative_pose",
  53. "relpose_5pt",
  54. "relpose_8pt",
  55. "relpose_upright_3pt",
  56. "relpose_upright_planar_2pt",
  57. "relpose_upright_planar_3pt",
  58. "shared_focal_relpose_6pt",
  59. "ugp2p",
  60. "ugp3ps",
  61. "ugp4pl",
  62. "up1p2pl",
  63. "up2p",
  64. "up4pl",
  65. ]
  66. class Camera:
  67. @typing.overload
  68. def __init__(self) -> None: ...
  69. @typing.overload
  70. def __init__(
  71. self,
  72. arg0: str,
  73. arg1: collections.abc.Sequence[typing.SupportsFloat],
  74. arg2: typing.SupportsInt,
  75. arg3: typing.SupportsInt,
  76. ) -> None: ...
  77. def __repr__(self) -> str: ...
  78. def focal(self) -> float:
  79. """
  80. Returns the camera focal length.
  81. """
  82. def focal_x(self) -> float:
  83. """
  84. Returns the camera focal_x.
  85. """
  86. def focal_y(self) -> float:
  87. """
  88. Returns the camera focal_y.
  89. """
  90. def initialize_from_txt(self, arg0: str) -> int:
  91. """
  92. Initialize camera from a cameras.txt line
  93. """
  94. def model_name(self) -> str:
  95. """
  96. Returns the camera model name.
  97. """
  98. def principal_point(
  99. self,
  100. ) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[2, 1]"]:
  101. """
  102. Returns the camera principal point.
  103. """
  104. def project(
  105. self, arg0: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  106. ) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 2]"]: ...
  107. def project_with_jac(
  108. self, arg0: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  109. ) -> tuple[
  110. typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 2]"],
  111. list[typing.Annotated[numpy.typing.NDArray[numpy.float64], "[2, 2]"]],
  112. ]: ...
  113. def unproject(
  114. self, arg0: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  115. ) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 2]"]: ...
  116. @property
  117. def height(self) -> int: ...
  118. @height.setter
  119. def height(self, arg0: typing.SupportsInt) -> None: ...
  120. @property
  121. def model_id(self) -> int: ...
  122. @model_id.setter
  123. def model_id(self, arg0: typing.SupportsInt) -> None: ...
  124. @property
  125. def params(self) -> list[float]: ...
  126. @params.setter
  127. def params(self, arg0: collections.abc.Sequence[typing.SupportsFloat]) -> None: ...
  128. @property
  129. def width(self) -> int: ...
  130. @width.setter
  131. def width(self, arg0: typing.SupportsInt) -> None: ...
  132. class CameraPose:
  133. def __init__(self) -> None: ...
  134. def __repr__(self) -> str: ...
  135. def center(self) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 1]"]:
  136. """
  137. Returns the camera center (c=-R^T*t).
  138. """
  139. @property
  140. def R(self) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 3]"]: ...
  141. @R.setter
  142. def R(
  143. self, arg1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"]
  144. ) -> None: ...
  145. @property
  146. def Rt(self) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 4]"]: ...
  147. @Rt.setter
  148. def Rt(
  149. self, arg1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 4]"]
  150. ) -> None: ...
  151. @property
  152. def q(self) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[4, 1]"]: ...
  153. @q.setter
  154. def q(
  155. self, arg0: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[4, 1]"]
  156. ) -> None: ...
  157. @property
  158. def t(self) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 1]"]: ...
  159. @t.setter
  160. def t(
  161. self, arg0: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 1]"]
  162. ) -> None: ...
  163. class Image:
  164. camera: Camera
  165. pose: CameraPose
  166. def __init__(self) -> None: ...
  167. def __repr__(self) -> str: ...
  168. class ImagePair:
  169. camera1: Camera
  170. camera2: Camera
  171. pose: CameraPose
  172. def __init__(self) -> None: ...
  173. def __repr__(self) -> str: ...
  174. class PairwiseMatches:
  175. def __init__(self) -> None: ...
  176. def __repr__(self) -> str: ...
  177. @property
  178. def cam_id1(self) -> int: ...
  179. @cam_id1.setter
  180. def cam_id1(self, arg0: typing.SupportsInt) -> None: ...
  181. @property
  182. def cam_id2(self) -> int: ...
  183. @cam_id2.setter
  184. def cam_id2(self, arg0: typing.SupportsInt) -> None: ...
  185. @property
  186. def x1(self) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 2]"]: ...
  187. @x1.setter
  188. def x1(
  189. self, arg0: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  190. ) -> None: ...
  191. @property
  192. def x2(self) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 2]"]: ...
  193. @x2.setter
  194. def x2(
  195. self, arg0: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  196. ) -> None: ...
  197. def BundleOptions(opt: dict = {}) -> dict:
  198. """
  199. Options for non-linear refinement.
  200. """
  201. def RansacOptions(opt: dict = {}) -> dict:
  202. """
  203. Options for RANSAC.
  204. """
  205. def essential_matrix_5pt(
  206. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  207. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  208. ) -> list[typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 3]"]]: ...
  209. def essential_matrix_8pt(
  210. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  211. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  212. ) -> typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 3]"]: ...
  213. def estimate_1D_radial_absolute_pose(
  214. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  215. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  216. ransac_opt: dict = {},
  217. bundle_opt: dict = {},
  218. initial_pose: CameraPose | None = None,
  219. ) -> tuple[CameraPose, dict]:
  220. """
  221. Absolute pose estimation for the 1D radial camera model with non-linear refinement.
  222. """
  223. @typing.overload
  224. def estimate_absolute_pose(
  225. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  226. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  227. camera: Camera,
  228. ransac_opt: dict = {},
  229. bundle_opt: dict = {},
  230. initial_pose: CameraPose | None = None,
  231. ) -> tuple[CameraPose, dict]:
  232. """
  233. Absolute pose estimation with non-linear refinement.
  234. """
  235. @typing.overload
  236. def estimate_absolute_pose(
  237. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  238. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  239. camera_dict: dict,
  240. ransac_opt: dict = {},
  241. bundle_opt: dict = {},
  242. initial_pose: CameraPose | None = None,
  243. ) -> tuple[CameraPose, dict]:
  244. """
  245. Absolute pose estimation with non-linear refinement.
  246. """
  247. @typing.overload
  248. def estimate_absolute_pose_pnpl(
  249. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  250. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  251. lines2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  252. lines2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  253. lines3D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  254. lines3D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  255. camera: Camera,
  256. ransac_opt: dict = {},
  257. bundle_opt: dict = {},
  258. initial_pose: CameraPose | None = None,
  259. ) -> tuple[CameraPose, dict]:
  260. """
  261. Absolute pose estimation with non-linear refinement from points and lines.
  262. """
  263. @typing.overload
  264. def estimate_absolute_pose_pnpl(
  265. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  266. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  267. lines2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  268. lines2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  269. lines3D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  270. lines3D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  271. camera_dict: dict,
  272. ransac_opt: dict = {},
  273. bundle_opt: dict = {},
  274. initial_pose: CameraPose | None = None,
  275. ) -> tuple[CameraPose, dict]:
  276. """
  277. Absolute pose estimation with non-linear refinement from points and lines.
  278. """
  279. def estimate_fundamental(
  280. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  281. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  282. ransac_opt: dict = {},
  283. bundle_opt: dict = {},
  284. initial_F: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"]
  285. | None = None,
  286. ) -> tuple[typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 3]"], dict]:
  287. """
  288. Fundamental matrix estimation with non-linear refinement. Note: if you have known intrinsics you should use estimate_relative_pose instead!
  289. """
  290. @typing.overload
  291. def estimate_generalized_absolute_pose(
  292. points2D: collections.abc.Sequence[
  293. typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  294. ],
  295. points3D: collections.abc.Sequence[
  296. typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"]
  297. ],
  298. camera_ext: collections.abc.Sequence[CameraPose],
  299. cameras: collections.abc.Sequence[Camera],
  300. ransac_opt: dict = {},
  301. bundle_opt: dict = {},
  302. initial_pose: CameraPose | None = None,
  303. ) -> tuple[CameraPose, dict]:
  304. """
  305. Generalized absolute pose estimation with non-linear refinement.
  306. """
  307. @typing.overload
  308. def estimate_generalized_absolute_pose(
  309. points2D: collections.abc.Sequence[
  310. typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  311. ],
  312. points3D: collections.abc.Sequence[
  313. typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"]
  314. ],
  315. camera_ext: collections.abc.Sequence[CameraPose],
  316. camera_dicts: collections.abc.Sequence[dict],
  317. ransac_opt: dict = {},
  318. bundle_opt: dict = {},
  319. initial_pose: CameraPose | None = None,
  320. ) -> tuple[CameraPose, dict]:
  321. """
  322. Generalized absolute pose estimation with non-linear refinement.
  323. """
  324. @typing.overload
  325. def estimate_generalized_relative_pose(
  326. matches: collections.abc.Sequence[PairwiseMatches],
  327. camera1_ext: collections.abc.Sequence[CameraPose],
  328. cameras1: collections.abc.Sequence[Camera],
  329. camera2_ext: collections.abc.Sequence[CameraPose],
  330. cameras2: collections.abc.Sequence[Camera],
  331. ransac_opt: dict = {},
  332. bundle_opt: dict = {},
  333. initial_pose: CameraPose | None = None,
  334. ) -> tuple[CameraPose, dict]:
  335. """
  336. Generalized relative pose estimation with non-linear refinement.
  337. """
  338. @typing.overload
  339. def estimate_generalized_relative_pose(
  340. matches: collections.abc.Sequence[PairwiseMatches],
  341. camera1_ext: collections.abc.Sequence[CameraPose],
  342. camera1_dict: collections.abc.Sequence[dict],
  343. camera2_ext: collections.abc.Sequence[CameraPose],
  344. camera2_dict: collections.abc.Sequence[dict],
  345. ransac_opt: dict = {},
  346. bundle_opt: dict = {},
  347. initial_pose: CameraPose | None = None,
  348. ) -> tuple[CameraPose, dict]:
  349. """
  350. Generalized relative pose estimation with non-linear refinement.
  351. """
  352. def estimate_homography(
  353. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  354. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  355. ransac_opt: dict = {},
  356. bundle_opt: dict = {},
  357. initial_H: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"]
  358. | None = None,
  359. ) -> tuple[typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 3]"], dict]:
  360. """
  361. Homography matrix estimation with non-linear refinement.
  362. """
  363. @typing.overload
  364. def estimate_hybrid_pose(
  365. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  366. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  367. matches_2D_2D: collections.abc.Sequence[PairwiseMatches],
  368. camera: Camera,
  369. map_ext: collections.abc.Sequence[CameraPose],
  370. map_cameras: collections.abc.Sequence[Camera],
  371. ransac_opt: dict = {},
  372. bundle_opt: dict = {},
  373. initial_pose: CameraPose | None = None,
  374. ) -> tuple[CameraPose, dict]:
  375. """
  376. Hybrid camera pose estimation (both 2D-3D and 2D-2D correspondences to the map) with non-linear refinement.
  377. """
  378. @typing.overload
  379. def estimate_hybrid_pose(
  380. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  381. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  382. matches_2D_2D: collections.abc.Sequence[PairwiseMatches],
  383. camera_dict: dict,
  384. map_ext: collections.abc.Sequence[CameraPose],
  385. map_camera_dicts: collections.abc.Sequence[dict],
  386. ransac_opt: dict = {},
  387. bundle_opt: dict = {},
  388. initial_pose: CameraPose | None = None,
  389. ) -> tuple[CameraPose, dict]:
  390. """
  391. Hybrid camera pose estimation (both 2D-3D and 2D-2D correspondences to the map) with non-linear refinement.
  392. """
  393. @typing.overload
  394. def estimate_relative_pose(
  395. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  396. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  397. camera1: Camera,
  398. camera2: Camera,
  399. ransac_opt: dict = {},
  400. bundle_opt: dict = {},
  401. initial_pose: CameraPose | None = None,
  402. ) -> tuple[CameraPose, dict]:
  403. """
  404. Relative pose estimation with non-linear refinement.
  405. """
  406. @typing.overload
  407. def estimate_relative_pose(
  408. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  409. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  410. camera1_dict: dict,
  411. camera2_dict: dict,
  412. ransac_opt: dict = {},
  413. bundle_opt: dict = {},
  414. initial_pose: CameraPose | None = None,
  415. ) -> tuple[CameraPose, dict]:
  416. """
  417. Relative pose estimation with non-linear refinement.
  418. """
  419. def estimate_shared_focal_relative_pose(
  420. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  421. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  422. pp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[2, 1]"] = ...,
  423. ransac_opt: dict = {},
  424. bundle_opt: dict = {},
  425. initial_image_pair: ImagePair | None = None,
  426. ) -> tuple[ImagePair, dict]:
  427. """
  428. Relative pose estimation with unknown equal focal lengths with non-linear refinement.
  429. """
  430. def focals_from_fundamental(
  431. F: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"],
  432. pp1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[2, 1]"],
  433. pp2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[2, 1]"],
  434. ) -> tuple[Camera, Camera]: ...
  435. @typing.overload
  436. def focals_from_fundamental_iterative(
  437. F: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"],
  438. camera1: Camera,
  439. camera2: Camera,
  440. max_iters: typing.SupportsInt = 50,
  441. weights: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[4, 1]"] = ...,
  442. ) -> tuple[Camera, Camera, int]: ...
  443. @typing.overload
  444. def focals_from_fundamental_iterative(
  445. F: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"],
  446. camera1_dict: dict,
  447. camera2_dict: dict,
  448. max_iters: typing.SupportsInt = 50,
  449. weights: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[4, 1]"] = ...,
  450. ) -> tuple[Camera, Camera, int]: ...
  451. def gen_relpose_6pt(
  452. p1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  453. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  454. p2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  455. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  456. ) -> list[CameraPose]: ...
  457. def gen_relpose_upright_4pt(
  458. p1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  459. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  460. p2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  461. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  462. ) -> list[CameraPose]: ...
  463. def gp3p(
  464. p: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  465. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  466. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  467. ) -> list[CameraPose]: ...
  468. def gp4ps(
  469. p: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  470. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  471. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  472. filter_solutions: bool,
  473. ) -> tuple[list[CameraPose], list[float]]: ...
  474. def gp4ps_camposeco(
  475. p: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  476. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  477. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  478. ) -> tuple[list[CameraPose], list[float]]: ...
  479. def gp4ps_kukelova(
  480. p: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  481. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  482. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  483. filter_solutions: bool,
  484. ) -> tuple[list[CameraPose], list[float]]: ...
  485. def motion_from_homography(
  486. H: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"],
  487. ) -> tuple[
  488. list[CameraPose], typing.Annotated[numpy.typing.NDArray[numpy.float64], "[m, 3]"]
  489. ]: ...
  490. def p1p2ll(
  491. xp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  492. Xp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  493. l: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  494. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  495. V: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  496. ) -> list[CameraPose]: ...
  497. def p2p1ll(
  498. xp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  499. Xp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  500. l: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  501. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  502. V: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  503. ) -> list[CameraPose]: ...
  504. def p2p2pl(
  505. xp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  506. Xp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  507. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  508. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  509. V: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  510. ) -> list[CameraPose]: ...
  511. def p3ll(
  512. l: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  513. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  514. V: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  515. ) -> list[CameraPose]: ...
  516. def p3p(
  517. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  518. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  519. ) -> list[CameraPose]: ...
  520. def p4pf(
  521. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  522. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  523. filter_solutions: bool,
  524. ) -> tuple[list[CameraPose], list[float]]: ...
  525. def p5lp_radial(
  526. l: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  527. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  528. ) -> list[CameraPose]: ...
  529. def p6lp(
  530. l: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  531. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  532. ) -> list[CameraPose]: ...
  533. @typing.overload
  534. def refine_absolute_pose(
  535. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  536. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  537. initial_pose: CameraPose,
  538. camera: Camera,
  539. bundle_options: dict = {},
  540. ) -> tuple[CameraPose, dict]:
  541. """
  542. Absolute pose non-linear refinement.
  543. """
  544. @typing.overload
  545. def refine_absolute_pose(
  546. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  547. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  548. initial_pose: CameraPose,
  549. camera_dict: dict,
  550. bundle_options: dict = {},
  551. ) -> tuple[CameraPose, dict]:
  552. """
  553. Absolute pose non-linear refinement.
  554. """
  555. @typing.overload
  556. def refine_absolute_pose_pnpl(
  557. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  558. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  559. lines2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  560. lines2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  561. lines3D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  562. lines3D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  563. initial_pose: CameraPose,
  564. camera: Camera,
  565. bundle_opt: dict = {},
  566. line_bundle_opt: dict = {},
  567. ) -> tuple[CameraPose, dict]:
  568. """
  569. Absolute pose non-linear refinement from points and lines.
  570. """
  571. @typing.overload
  572. def refine_absolute_pose_pnpl(
  573. points2D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  574. points3D: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  575. lines2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  576. lines2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  577. lines3D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  578. lines3D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  579. initial_pose: CameraPose,
  580. camera_dict: dict,
  581. bundle_opt: dict = {},
  582. line_bundle_opt: dict = {},
  583. ) -> tuple[CameraPose, dict]:
  584. """
  585. Absolute pose non-linear refinement from points and lines.
  586. """
  587. def refine_fundamental(
  588. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  589. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  590. initial_F: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"],
  591. bundle_options: dict = {},
  592. ) -> tuple[typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 3]"], dict]:
  593. """
  594. Fundamental matrix non-linear refinement.
  595. """
  596. @typing.overload
  597. def refine_generalized_absolute_pose(
  598. points2D: collections.abc.Sequence[
  599. typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  600. ],
  601. points3D: collections.abc.Sequence[
  602. typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"]
  603. ],
  604. initial_pose: CameraPose,
  605. camera_ext: collections.abc.Sequence[CameraPose],
  606. cameras: collections.abc.Sequence[Camera],
  607. bundle_opt: dict = {},
  608. ) -> tuple[CameraPose, dict]:
  609. """
  610. Generalized absolute pose non-linear refinement.
  611. """
  612. @typing.overload
  613. def refine_generalized_absolute_pose(
  614. points2D: collections.abc.Sequence[
  615. typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"]
  616. ],
  617. points3D: collections.abc.Sequence[
  618. typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"]
  619. ],
  620. initial_pose: CameraPose,
  621. camera_ext: collections.abc.Sequence[CameraPose],
  622. camera_dicts: collections.abc.Sequence[dict],
  623. bundle_opt: dict = {},
  624. ) -> tuple[CameraPose, dict]:
  625. """
  626. Generalized absolute pose non-linear refinement.
  627. """
  628. @typing.overload
  629. def refine_generalized_relative_pose(
  630. matches: collections.abc.Sequence[PairwiseMatches],
  631. initial_pose: CameraPose,
  632. camera1_ext: collections.abc.Sequence[CameraPose],
  633. cameras1: collections.abc.Sequence[Camera],
  634. camera2_ext: collections.abc.Sequence[CameraPose],
  635. cameras2: collections.abc.Sequence[Camera],
  636. bundle_opt: dict = {},
  637. ) -> tuple[CameraPose, dict]:
  638. """
  639. Generalized relative pose non-linear refinement.
  640. """
  641. @typing.overload
  642. def refine_generalized_relative_pose(
  643. matches: collections.abc.Sequence[PairwiseMatches],
  644. initial_pose: CameraPose,
  645. camera1_ext: collections.abc.Sequence[CameraPose],
  646. camera1_dict: collections.abc.Sequence[dict],
  647. camera2_ext: collections.abc.Sequence[CameraPose],
  648. camera2_dict: collections.abc.Sequence[dict],
  649. bundle_opt: dict = {},
  650. ) -> tuple[CameraPose, dict]:
  651. """
  652. Generalized relative pose non-linear refinement.
  653. """
  654. def refine_homography(
  655. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  656. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  657. initial_H: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[3, 3]"],
  658. bundle_options: dict = {},
  659. ) -> tuple[typing.Annotated[numpy.typing.NDArray[numpy.float64], "[3, 3]"], dict]:
  660. """
  661. Homography non-linear refinement.
  662. """
  663. @typing.overload
  664. def refine_relative_pose(
  665. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  666. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  667. initial_pose: CameraPose,
  668. camera1: Camera,
  669. camera2: Camera,
  670. bundle_options: dict = {},
  671. ) -> tuple[CameraPose, dict]:
  672. """
  673. Relative pose non-linear refinement.
  674. """
  675. @typing.overload
  676. def refine_relative_pose(
  677. points2D_1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  678. points2D_2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 2]"],
  679. initial_pose: CameraPose,
  680. camera1_dict: dict,
  681. camera2_dict: dict,
  682. bundle_options: dict = {},
  683. ) -> tuple[CameraPose, dict]:
  684. """
  685. Relative pose non-linear refinement.
  686. """
  687. def relpose_5pt(
  688. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  689. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  690. ) -> list[CameraPose]: ...
  691. def relpose_8pt(
  692. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  693. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  694. ) -> list[CameraPose]: ...
  695. def relpose_upright_3pt(
  696. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  697. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  698. ) -> list[CameraPose]: ...
  699. def relpose_upright_planar_2pt(
  700. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  701. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  702. ) -> list[CameraPose]: ...
  703. def relpose_upright_planar_3pt(
  704. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  705. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  706. ) -> list[CameraPose]: ...
  707. def shared_focal_relpose_6pt(
  708. x1: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  709. x2: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  710. ) -> list[ImagePair]: ...
  711. def ugp2p(
  712. p: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  713. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  714. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  715. ) -> list[CameraPose]: ...
  716. def ugp3ps(
  717. p: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  718. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  719. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  720. filter_solutions: bool,
  721. ) -> tuple[list[CameraPose], list[float]]: ...
  722. def ugp4pl(
  723. p: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  724. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  725. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  726. V: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  727. ) -> list[CameraPose]: ...
  728. def up1p2pl(
  729. xp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  730. Xp: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  731. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  732. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  733. V: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  734. ) -> list[CameraPose]: ...
  735. def up2p(
  736. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  737. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  738. ) -> list[CameraPose]: ...
  739. def up4pl(
  740. x: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  741. X: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  742. V: typing.Annotated[numpy.typing.ArrayLike, numpy.float64, "[m, 3]"],
  743. ) -> list[CameraPose]: ...
  744. __version__: str = "2.0.5"