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.

addFrame

Agregue un par de imágenes de color y profundidad al objeto SLAM visual RGB-D

Desde R2025a

    Descripción

    addFrame(vslam,colorImage,depthImage) agrega el par de imágenes de color y profundidad, colorImage y depthImage respectivamente, al objeto visual SLAM RGB-D vslam. Las imágenes en color y profundidad deberán estar previamente registradas con una correspondencia uno a uno.

    Nota

    El objeto rgbdvslam se ejecuta en varios subprocesos internamente, lo que puede retrasar el procesamiento de un cuadro de imagen agregado mediante la función addFrame. Además, el objeto que se ejecuta en varios subprocesos significa que el cuadro actual que el objeto está procesando puede ser diferente del cuadro agregado recientemente.

    ejemplo

    addFrame(___,gyro,accel) agrega giroscopio IMU y mediciones de aceleración para la fusión visual-inercial.

    Ejemplos

    contraer todo

    Realice la localización y el mapeo visual simultáneos RGB-D (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://vision.in.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 dos objetos imageDatastore. Uno para almacenar las imágenes en color y el otro para almacenar las imágenes de profundidad.

    colorImageFolder = dataFolder+"rgbd_dataset_freiburg3_long_office_household/rgb/";
    depthImageFolder = dataFolder+"rgbd_dataset_freiburg3_long_office_household/depth/";
    
    imdsColor = imageDatastore(colorImageFolder);
    imdsDepth = imageDatastore(depthImageFolder);

    Seleccione el par sincronizado de imágenes de color y profundidad.

    data = load("rgbDepthPairs.mat");
    imdsColor=subset(imdsColor, data.indexPairs(:, 1));
    imdsDepth=subset(imdsDepth, data.indexPairs(:, 2));

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

    intrinsics = cameraIntrinsics([535.4 539.2],[320.1 247.6],[480 640]);
    depthScaleFactor = 5000;
    vslam = rgbdvslam(intrinsics,depthScaleFactor);

    Procese cada par de imágenes de color y profundidad y visualice las poses de la cámara y los puntos del mapa 3D.

    for i = 1:numel(imdsColor.Files)
        colorImage = readimage(imdsColor,i);
        depthImage = readimage(imdsDepth,i);
        addFrame(vslam,colorImage,depthImage);
    
        if hasNewKeyFrame(vslam)
            % Query 3-D map points and camera poses
            xyzPoints = mapPoints(vslam);
            [camPoses,viewIds] = poses(vslam);
    
            % Display 3-D map points and camera trajectory
            plot(vslam);
        end
    
        % Get current status of system
        status = checkStatus(vslam);
        
        % Stop adding frames when tracking is lost
        if status == uint8(0)
            break
        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 procesados todos los fotogramas, reinicie el sistema.

    while ~isDone(vslam)
        plot(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.

    reset(vslam);

    Realice SLAM visual-inercial RGB-D utilizando los datos del OpenLORIS-Scene Dataset. Descargue los datos a un directorio temporal usando un navegador web o ejecutando este código:

    dataFolder  = fullfile(tempdir,"OpenLORIS-Scene",filesep); 
    downloadURL = "https://ssd.mathworks.com/supportfiles/shared_nav_vision/data/OpenLORIS-Scene_corridor1-4.zip";
    zipFileName = dataFolder+"corridor1-4.zip";
    
    if ~isfolder(dataFolder)
        mkdir(dataFolder);
        disp("Downloading corridor1-4.zip (1.13 GB). This download can take a few minutes.");
        options = weboptions('Timeout', Inf);
        websave(zipFileName, downloadURL, options); 
        unzip(zipFileName, dataFolder);
    end

    Crea dos objetos imageDatastore. Uno para almacenar las imágenes en color y el otro para almacenar las imágenes de profundidad.

    imageFolder = fullfile(dataFolder,"OpenLORIS-Scene_corridor1-4");
    imdsColor = imageDatastore(fullfile(imageFolder,"color"));
    imdsDepth = imageDatastore(fullfile(imageFolder,"aligned_depth"));

    Cargue los datos de mediciones de IMU y la transformación de cámara a IMU.

    data    = load("corridor4_IMU_data.mat");
    gyro    = data.gyroDataCell;
    accel   = data.accelDataCell;
    cam2IMU = data.cam2IMU;

    Especifique las características intrínsecas de la cámara, los parámetros IMU y utilícelos para crear un objeto SLAM visual-inercial RGB-D.

    % Camera intrinsic and IMU parameters can be found in the downloaded  
    % sensors.yaml file
    intrinsics = cameraIntrinsics([6.1145098876953125e+02, 6.1148571777343750e+02],...
        [4.3320397949218750e+02, 2.4947302246093750e+02], [480, 848]);
    
    imuParams = factorIMUParameters(AccelerometerBiasNoise=2.499999936844688e-05*eye(3),...
           AccelerometerNoise=0.00026780980988405645*eye(3),...
           GyroscopeNoise=1.0296060281689279e-05*eye(3),...
           GyroscopeBiasNoise=2.499999993688107e-07*eye(3),...
           SampleRate=250);
    
    depthScaleFactor = 1000;
    vslam = rgbdvslam(intrinsics, depthScaleFactor, imuParams, SkipMaxFrames=10,...
        CameraToIMUTransform=cam2IMU, TrackFeatureRange = [30, 150], DepthRange= [0.1, 6.5], ...
        NumPosesThreshold=20, MaxNumPoints=1.2e3);

    Procesar datos de imágenes y datos IMU y visualizar las poses de la cámara y los puntos del mapa 3D.

    for i = 1:numel(imdsColor.Files)
        colorImage  = readimage(imdsColor,i);
        depthImage  = readimage(imdsDepth,i);
        addFrame(vslam, colorImage, depthImage, gyro{i}, accel{i});
    
        if hasNewKeyFrame(vslam)
            plot(vslam);
        end
    end

    Una vez procesados todos los fotogramas, reinicie el sistema.

    while ~isDone(vslam)
        if hasNewKeyFrame(vslam)
            ax = plot(vslam);
        end
    end
    view(ax, 0, 90)

    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.

    reset(vslam);

    Argumentos de entrada

    contraer todo

    Objeto SLAM visual RGB-D, especificado como un objeto rgbdvslam.

    Imagen en color, especificada como una imagen RGB o en escala de grises no dispersa. Las imágenes en color y profundidad deberán estar previamente registradas con una correspondencia uno a uno.

    Tipos de datos: single | double | int16 | uint8 | uint16 | logical

    Imagen en color, especificada como una imagen en escala de grises no dispersa. Las imágenes en color y profundidad deberán estar previamente registradas con una correspondencia uno a uno.

    Tipos de datos: single | double | int16 | uint8 | uint16 | logical

    Medición del giroscopio, especificada como una matriz N por 3. Cada fila de la matriz representa los componentes x, y y z de la medición del giroscopio para un solo fotograma, con la forma [gx,gy,gz]. N representa el número total de fotogramas. N representa el número de mediciones de IMU entre los fotogramas de la cámara anterior y actual. El número de mediciones del giroscopio y del acelerómetro debe ser igual.

    Medición de aceleración, especificada como una matriz N por 3. Cada fila de la matriz representa los componentes x, y y z de la medición de aceleración para un solo fotograma, con la forma [ax,ay,az]. N representa el número de mediciones de IMU entre los fotogramas de la cámara anterior y actual. El número de mediciones del giroscopio y del acelerómetro debe ser igual.

    Historial de versiones

    Introducido en R2025a