1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-28 23:03:03 +04:00
Files
opencv/samples/slam/visual_odometry.py
T
2026-06-23 15:14:58 +05:30

76 lines
2.8 KiB
Python

'''
Monocular visual odometry with cv.slam.VisualOdometry (ALIKED + LightGlue).
Example:
python visual_odometry.py --aliked aliked.onnx --lightglue lg.onnx --images ./seq
'''
import argparse
import time
import numpy as np
import cv2 as cv
def build_K(fx, fy, cx, cy):
return np.array([[fx, 0., cx],
[0., fy, cy],
[0., 0., 1.]], dtype=np.float64)
def main():
parser = argparse.ArgumentParser(
description='Monocular visual odometry using ALIKED + LightGlue')
parser.add_argument('--aliked', required=True,
help='Path to ALIKED ONNX model')
parser.add_argument('--lightglue', required=True,
help='Path to LightGlue ONNX model')
parser.add_argument('--images', required=True,
help='Path to directory with input images')
parser.add_argument('--output', default='vo_out',
help='Output directory for trajectory and map (default: vo_out)')
parser.add_argument('--fx', type=float, default=718.856,
help='Camera focal length X (default: KITTI-00)')
parser.add_argument('--fy', type=float, default=718.856,
help='Camera focal length Y (default: KITTI-00)')
parser.add_argument('--cx', type=float, default=607.1928,
help='Camera principal point X (default: KITTI-00)')
parser.add_argument('--cy', type=float, default=185.2157,
help='Camera principal point Y (default: KITTI-00)')
parser.add_argument('--min-parallax', type=float, default=1.5,
help='Minimum initialisation parallax in degrees (default: 1.5)')
parser.add_argument('--min-points', type=int, default=50,
help='Minimum initialisation map points (default: 50)')
args = parser.parse_args()
det_params = cv.ALIKED.Params()
det_params.inputSize = (640, 640)
det_params.engine = cv.dnn.ENGINE_NEW
detector = cv.ALIKED.create(args.aliked, det_params)
matcher = cv.LightGlueMatcher.create(
args.lightglue, 0.0,
cv.dnn.DNN_BACKEND_DEFAULT,
cv.dnn.DNN_TARGET_CPU)
vo_params = cv.slam.OdometryParams()
vo_params.minInitParallaxDeg = args.min_parallax
vo_params.minInitPoints = args.min_points
K = build_K(args.fx, args.fy, args.cx, args.cy)
vo = cv.slam.VisualOdometry.create(
detector, matcher,
args.images, args.output,
K, np.array([]), vo_params)
t0 = time.perf_counter()
ok = vo.run()
elapsed = time.perf_counter() - t0
print(f"run={'ok' if ok else 'FAILED'} frames={len(vo.getTrajectory())} elapsed={elapsed:.2f}s")
print(f"output -> {args.output}")
if __name__ == '__main__':
main()