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.

mapPoints

Construya un mapa 3D de puntos del mundo a partir de un objeto vSLAM RGB-D

Desde R2025a

    Descripción

    xyzPoints = mapPoints(vslam) construye un mapa 3-D disperso de puntos del mundo, xyzPoints, a partir de las imágenes de entrada en el objeto de localización y mapeo visual simultáneo (vSLAM) RGB-D vslam.

    ejemplo

    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);

    Argumentos de entrada

    contraer todo

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

    Argumentos de salida

    contraer todo

    Coordenadas de puntos mundiales del mapa 3D, devueltas como una matriz de M por 3. M es el número de puntos y cada punto tiene la forma [X Y Z].

    Historial de versiones

    Introducido en R2025a