Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

hasNewKeyFrame

Comprobar si se agregó un nuevo fotograma clave en el objeto SLAM visual

Desde R2025a

    Descripción

    hasAdded = hasNewKeyFrame(vslam) devuelve un valor lógico que indica si se ha agregado un nuevo fotograma clave dentro del objeto de localización y mapeo visual simultáneo (vSLAM) vslam.

    ejemplo

    Ejemplos

    contraer todo

    Realice la localización y el mapeo visual simultáneo monocular (vSLAM) utilizando los datos del TUM RGB-D Benchmark. Puede descargar los datos a un directorio temporal utilizando un navegador web o ejecutando este código:

    baseDownloadURL = "https://cvg.cit.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_long_office_household.tgz"; 
    dataFolder = fullfile(tempdir,"tum_rgbd_dataset",filesep); 
    options = weboptions(Timeout=Inf);
    tgzFileName = dataFolder+"fr3_office.tgz";
    folderExists = exist(dataFolder,"dir");
    
    % Create a folder in a temporary directory to save the downloaded file
    if ~folderExists  
        mkdir(dataFolder) 
        disp("Downloading fr3_office.tgz (1.38 GB). This download can take a few minutes.") 
        websave(tgzFileName,baseDownloadURL,options); 
        
        % Extract contents of the downloaded file
        disp("Extracting fr3_office.tgz (1.38 GB) ...") 
        untar(tgzFileName,dataFolder); 
    end

    Crea un objeto imageDatastore para almacenar todas las imágenes RGB.

    imageFolder = dataFolder+"rgbd_dataset_freiburg3_long_office_household/rgb/";
    imds = imageDatastore(imageFolder);

    Especifique los parámetros intrínsecos de su cámara y utilícelos para crear un objeto SLAM visual monocular.

    intrinsics = cameraIntrinsics([535.4 539.2],[320.1 247.6],[480 640]);
    vslam = monovslam(intrinsics,TrackFeatureRange=[30,120]);

    Procese cada fotograma de la imagen y visualice las poses de la cámara y los puntos del mapa 3D. Tenga en cuenta que el objeto monovslam ejecuta varias partes del algoritmo en subprocesos separados, lo que puede introducir una latencia en el procesamiento de un cuadro de imagen agregado mediante la función addFrame.

    for i = 1:numel(imds.Files)
        addFrame(vslam,readimage(imds,i))
    
        if hasNewKeyFrame(vslam)
            % Display 3-D map points and camera trajectory
            plot(vslam);
        end
    
        % Get current status of system
        status = checkStatus(vslam);
    end 

    Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 12 objects of type line, text, patch, scatter. This object represents Camera trajectory.

    Grafique los resultados intermedios y espere hasta que se procesen todas las imágenes.

    while ~isDone(vslam)
        if hasNewKeyFrame(vslam)
            plot(vslam);
        end
    end

    Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 12 objects of type line, text, patch, scatter. This object represents Camera trajectory.

    Una vez procesadas todas las imágenes, puedes recopilar los puntos del mapa 3D finales y las poses de la cámara para un análisis posterior.

    xyzPoints = mapPoints(vslam);
    [camPoses,addedFramesIdx] = poses(vslam);
    
    % Reset the system
    reset(vslam)

    Compare la trayectoria estimada de la cámara con la ground-truth para evaluar la precisión.

    % Load ground truth
    gTruthData = load("orbslamGroundTruth.mat");
    gTruth     = gTruthData.gTruth;
    
    % Evaluate tracking accuracy
    mtrics = compareTrajectories(camPoses, gTruth(addedFramesIdx), AlignmentType="similarity");
    disp(['Absolute RMSE for key frame location (m): ', num2str(mtrics.AbsoluteRMSE(2))]);
    Absolute RMSE for key frame location (m): 0.20043
    
    % Plot the absolute translation error at each key frame
    figure
    ax = plot(mtrics, "absolute-translation");
    view(ax, [2.70 -49.20]); 

    Figure contains an axes object. The axes object with title Absolute Translation Error, xlabel X, ylabel Y contains 2 objects of type patch, line. These objects represent Estimated Trajectory, Ground Truth Trajectory.

    Argumentos de entrada

    contraer todo

    Objeto SLAM visual, especificado como un objeto monovslam.

    Argumentos de salida

    contraer todo

    Nuevo estado de fotograma clave, devuelto como 0 (false) o 1 (true). Un valor de true indica que se ha agregado un nuevo fotograma clave dentro del objeto SLAM visual vslam. Un valor de false indica que no se ha agregado ningún nuevo fotograma clave. El objeto considera que un fotograma de imagen es un fotograma clave si la cantidad de puntos de características rastreados en el fotograma actual satisface una de estas condiciones:

    • La cantidad de puntos característicos rastreados está dentro de los límites especificados por la propiedad TrackFeatureRange del objeto monovslam, vslam.

    • La cantidad de puntos característicos rastreados es mayor que el límite superior especificado por la propiedad TrackFeatureRange del objeto monovslam, vslam, y la cantidad de cuadros omitidos desde que se agregó el último cuadro clave es igual al valor SkipMaxFrames.

    La función de objeto hasNewKeyFrame devuelve true una vez por cada nuevo fotograma clave agregado. Por ejemplo, si el objeto monovslam agrega solo un fotograma clave, entonces dos llamadas consecutivas a hasNewKeyFrame devuelven true y false, respectivamente.

    Historial de versiones

    Introducido en R2025a

    Consulte también

    Objetos

    Funciones