exponenta event banner

Используйте здесь данные карты HD Live для проверки конфигураций полос движения

В этом примере показано, как считывать и визуализировать конфигурации полос движения для записанного маршрута движения с помощью услуги HERE HD Live Map (HERE HDLM). Эта визуализация может быть использована для проверки конфигураций полос, обнаруженных системой восприятия бортового датчика, такого как монокулярная камера.

В этом примере показано, как получить доступ к слоям мозаики из службы HDLM и определить соответствующую топологию, геометрию и атрибуты уровня дороги и полосы движения.

Для считывания данных используется hereHDLMReader объект. Для использования сервиса HERE HD Live Map требуются действительные учетные данные HERE HDLM. Необходимо заключить отдельное соглашение с HERE, чтобы получить доступ к услугам HDLM и получить необходимые учетные данные (access_key_id и access_key_secret) для использования услуги HERE.

Обзор

Карты высокой четкости (HD) относятся к картографическим службам, разработанным специально для автоматизированных приложений вождения. Точная геометрия этих карт (с разрешением до 1 см вблизи экватора) делает их подходящими для автоматизированных рабочих процессов вождения, выходящих за рамки применения традиционных дорожных карт при планировании маршрутов. Такие рабочие процессы включают проверку на уровне полосы движения, локализацию и планирование путей. В этом примере показано, как проверить производительность системы обнаружения полос с помощью информации уровня полос из данных отображения HD.

Точность данных отображения HD позволяет использовать их в качестве источника данных истинности земли для проверки бортовых систем восприятия датчиков. Такая высокая точность позволяет быстрее и точнее проверять существующие развернутые алгоритмы.

HERE HD Live Map (HERE HDLM) - облачный сервис карт HD, разработанный компанией HERE Technologies для поддержки высокоавтоматизированного вождения. Данные состоят из слоев мозаичного отображения, которые обеспечивают доступ к точной геометрии и надежным атрибутам дорожной сети. Слои сгруппированы в следующие модели:

  • Модель осевой линии дороги: обеспечивает топологию дороги (заданную как узлы и связи на графике), геометрию формы и другие атрибуты уровня дороги.

  • HD-модель полосы движения: обеспечивает топологию полосы движения (как группы полос движения и соединители групп полос движения), высокую точность геометрии и атрибуты уровня полосы движения.

  • HD Localization Model: Предоставляет функции для поддержки стратегий локализации транспортных средств.

Обзор слоев HERE HDLM см. в разделе Слои HERE HD Live Map.

Камеры используются в автоматизированном вождении для сбора семантической информации о топологии дороги вокруг транспортного средства. Определение границ полос движения, классификация типов полос движения и алгоритмы обнаружения дорожных знаков составляют ядро такого конвейера обработки камер. Вы можете воспользоваться услугой HERE HDLM вместе с высокоточным GPS, установленным на транспортном средстве, чтобы оценить точность таких алгоритмов и проверить их работоспособность.

В этом примере показано, как:

  1. Считывание информации о дороге и полосе движения из услуги HERE HDLM для записанной последовательности GPS.

  2. Примените эвристический подход согласования маршрутов к записанным данным GPS. Поскольку данные GPS часто неточны, необходимо решить проблему согласования записанных географических координат с представлением дорожной сети.

  3. Определение экологических характеристик транспортного средства. После успешного нахождения транспортного средства в контексте карты можно использовать атрибуты дороги и полосы движения, относящиеся к транспортному средству, для проверки данных, записанных датчиком бортовой камеры транспортного средства.

Загрузка и отображение данных камеры и GPS

Начните с загрузки данных с записанного диска. Записанные в этом примере данные взяты из набора данных о вождении, собранного командой Udacity ® Self-Driving Car. Эти данные включают в себя видео, снятое фронтальной монокулярной камерой, и положения и скорости транспортного средства, регистрируемые GPS.

Загрузить centerCamera.avi видеоданные камеры и соответствующие метки времени видеоизображения.

recordedData = fullfile(toolboxdir('driving'), 'drivingdata', ...
    'udacity', 'drive_segment_09_29_16');
[videoReader, videoTime] = helperLoadCameraData(fullfile(recordedData));

% Show the first frame of the camera data
imageFrame = readFrame(videoReader);
imshow(imageFrame, 'Border', 'tight');

Загрузка данных GPS из gpsSequence.mat MAT-файл.

data = load(fullfile(recordedData, 'gpsSequence.mat'));
gpsData = data.gpsTT;

% Plot the full route and the first position recorded from the GPS
gpsPlayer = geoplayer(gpsData.Latitude(1), gpsData.Longitude(1), 18);
plotRoute(gpsPlayer, gpsData.Latitude, gpsData.Longitude);
plotPosition(gpsPlayer, gpsData.Latitude(1), gpsData.Longitude(1));

Соответствие зарегистрированного положения транспортного средства дороге

Создайте считывающее устройство для чтения плиток HERE HD Live Map, которые охватывают все записанные местоположения GPS в дисководе. Если ранее не были настроены учетные данные HERE HDLM, появится диалоговое окно с предложением ввести их. Введите идентификатор ключа доступа и секрет ключа доступа, полученные из HERE Technologies, и нажмите кнопку ОК.

reader = hereHDLMReader(gpsData.Latitude, gpsData.Longitude);

Считывание и печать данных топологии дороги из TopologyGeometry слой. Этот уровень представляет конфигурацию дорожной сети. Узлы сети соответствуют пересечениям и тупикам. Связи между узлами представляют форму соединяющих улиц в виде полилиний. Связность и геометрия для этих элементов содержатся в LinksStartingInTile и NodesInTile поля.

topologyLayer = read(reader, 'TopologyGeometry')

figure('Name', 'TopologyGeometry');
topologyAxes = plot(topologyLayer);
hold(topologyAxes, 'on');
geoplot(topologyAxes, gpsData.Latitude, gpsData.Longitude, ...
    'bo-', 'DisplayName', 'Route');
topologyLayer = 
  TopologyGeometry with properties:

   Data:
                    HereTileId: 309106790
          IntersectingLinkRefs: [44×1 struct]
           LinksStartingInTile: [895×1 struct]
                   NodesInTile: [651×1 struct]
    TileCenterHere2dCoordinate: [37.3865 -122.1130]
   Metadata:
                       Catalog: 'hrn:here:data::olp-here-had:here-hdlm-protobuf-na-2'
                CatalogVersion: 4601
  Use plot to visualize TopologyGeometry data.

Функциональные возможности печати фиксируются в helperPlotLayer функция, которая визуализирует доступные данные из уровня HD Live Map с записанным накопителем на тех же географических осях. Эта функция, определенная в конце примера, будет использоваться для печати последующих слоев.

Учитывая местоположение GPS, записанное вдоль диска, можно использовать алгоритм согласования маршрутов, чтобы определить, какой дороге в сети соответствует записанное положение. В этом примере используется эвристический алгоритм согласования маршрутов, который рассматривает ближайшие линии связи пространственно к записанной географической точке. Алгоритм применяет направление движения транспортного средства для определения наиболее вероятной линии связи. Этот подход согласования маршрутов не учитывает связность дорог, доступ к транспортным средствам или данные GPS с высокой погрешностью позиционирования. Поэтому этот подход может применяться не ко всем сценариям.

helperGetGeometry извлекает геометрическую информацию из заданного слоя топологии и возвращает эту информацию в таблице с соответствующими связями.

topologyTable = helperGetGeometry(topologyLayer.LinksStartingInTile, ...
    {'LinkId', 'Geometry.Here2dCoordinateDiffs'});
topologyTable.Properties.VariableNames = {'LinkId', 'Geometry'};

HelperLinkMatcher класс создает средство согласования связей, которое содержит геометрию формы для каждой связи в нужной плитке карты. Этот класс использует базовый пространственный анализ, чтобы сопоставить записанное положение с координатами формы дорожных связей.

linkMatcher = HelperLinkMatcher(topologyTable);

% Match first point of the recorded route to the most probable link
[linkId, linkLat, linkLon] = match(linkMatcher, gpsData.Latitude(1), ...
    gpsData.Longitude(1), gpsData.Velocity(1,1:2));

% Plot the shape geometry of the link
geoplot(gpsPlayer.Axes, linkLat, linkLon, 'r.-');

Получение ограничения скорости по согласованной дороге

Характеристики, общие для всех полос вдоль данной дороги, приписываются элементу связи, который описывает эту дорогу. Один из таких признаков, ограничение скорости, описывает максимальную законную скорость для транспортных средств, путешествующих по линии связи. Как только данная географическая координата сопоставляется со связью, можно определить ограничение скорости вдоль этой связи. Поскольку такие функции, как ограничения скорости, часто изменяются по длине канала, эти атрибуты идентифицируются для определенных диапазонов канала.

SpeedAttributes содержит информацию об ожидаемой скорости транспортного средства на линии связи, включая установленный предел скорости.

speedLayer = read(reader, 'SpeedAttributes');

helperGetSpeedLimits функция извлекает данные ограничения скорости для соответствующей длины и направления линии связи. Как и при извлечении геометрической информации для связи, для конкретного захвата данных ограничения скорости требуется специализированный код.

speedTable = helperGetSpeedLimits(speedLayer);

% Find the speed limit entry for the matched link
speed = speedTable(speedTable.LinkId == linkId, :);

Сопоставить записанное положение с группой полос движения

Модель полосы HD содержит геометрию на уровне полосы и атрибуты дороги, предоставляя детали, необходимые для поддержки автоматизированных приложений вождения. Подобно модели осевой линии дороги, модель полосы HD также следует схеме использования топологии для описания дорожной сети на уровне полосы движения. Затем к элементам этой топологии относят особенности групп полос. В модели полосы HD основным топологическим элементом является группа полос.

Считывание и печать данных топологии полос движения из LaneTopology слой. Этот слой представляет топологию полос в виде групп полос и соединителей групп полос. Группы полос представляют группу полос в пределах звена (сегмента дороги). Соединители групп полос соединяют отдельные группы полос. Связность и геометрия для этих элементов содержатся в LaneGroupsStartingInTile и LaneGroupConnectorsInTile для групп полос и соединителей групп полос соответственно.

laneTopologyLayer = read(reader, 'LaneTopology')
laneAxes = helperPlotLayer(laneTopologyLayer, ...
    gpsData.Latitude, gpsData.Longitude);
geolimits(laneAxes, [37.3823, 37.3838], [-122.1151, -122.1128]);
laneTopologyLayer = 
  LaneTopology with properties:

   Data:
                    HereTileId: 309106790
     IntersectingLaneGroupRefs: [56×1 struct]
     LaneGroupConnectorsInTile: [1174×1 struct]
      LaneGroupsStartingInTile: [1783×1 struct]
    TileCenterHere2dCoordinate: [37.3865 -122.1130]
   Metadata:
                       Catalog: 'hrn:here:data::olp-here-had:here-hdlm-protobuf-na-2'
                CatalogVersion: 4601
  Use plot to visualize LaneTopology data.

Группа полос представляет несколько полос. Поэтому геометрия этого элемента задается многоугольной формой группы, выраженной левой и правой границами группы полос. Получение этой геометрии полосы движения из границ полосы движения с помощью helperGetGeometry функция.

laneGroupFields = {'LaneGroupId', ...
    'BoundaryGeometry.LeftBoundary.Here2dCoordinateDiffs', ...
    'BoundaryGeometry.RightBoundary.Here2dCoordinateDiffs'};
laneTopologyTable = helperGetGeometry(laneTopologyLayer.LaneGroupsStartingInTile, ...
    laneGroupFields);
laneTopologyTable.Properties.VariableNames = {'LaneGroupId', ...
    'LeftGeometry', 'RightGeometry'};

Как и при разработке алгоритма согласования для идентификации наиболее вероятной линии связи, сопоставление данных GPS с наиболее вероятной группой полос движения может следовать множественным подходам. Описанный здесь подход использует два уровня: LaneRoadReferences и LaneTopology.

  • LaneRoadReferences позволяет перевести положение на модели осевой линии дороги (заданной звеном) в соответствующее положение на модели полосы HD (заданной группой полос). Поскольку ссылка была идентифицирована ранее, можно фильтровать кандидатов для сопоставления группы полос с меньшим подмножеством всех групп полос, доступных в плитке.

  • LaneTopology слой дает геометрические данные, которые можно использовать для учета данных, пространственно существующих в границах каждой группы полос кандидатов. Как и при пространственном согласовании данных GPS с линиями связи, такой подход подвержен ошибкам и зависит от точности записанных данных GPS. Помимо сопоставления с группой полос, необходимо также сопоставить вектор направления транспортного средства с ориентацией группы полос. Этот шаг необходим, поскольку атрибуты полос определяются относительно ориентации топологии.

Используйте helperGetReferences для создания таблицы всех групп полос, существующих, по крайней мере, для некоторой длины звена.

referenceLayer = read(reader, 'LaneRoadReferences');
referenceTable = helperGetReferences(referenceLayer);

Создайте средство сопоставления групп полос, содержащее геометрию границ для каждой группы полос в нужной плитке карты. HelperLaneGroupMatcher класс создает средство сопоставления групп полос, содержащее геометрию формы границ для каждой группы полос в нужной плитке карты. Она также содержит справочную таблицу связей с группами полос движения. Как и в случае HelperLinkMatcher этот класс использует простой подход пространственного анализа, чтобы определить, существует ли данная зарегистрированная координата в границах группы полос.

laneGroupMatcher = HelperLaneGroupMatcher(referenceTable, laneTopologyTable);

% Match the lane group and relative direction
[laneGroupId, isForward, boundGeometry] = match(laneGroupMatcher, linkId, ...
    gpsData.Latitude(1), gpsData.Longitude(1), gpsData.Velocity(1,1:2));

% Plot the boundary geometry of the lane group
geoplot(gpsPlayer.Axes, boundGeometry(:,1), boundGeometry(:,2), 'm.-');

Извлечение конфигураций полос для группы согласованных полос

Как и в случае атрибутов скорости, которые сопоставляются связям по идентификатору, атрибуты полосы также назначают элементы группам полос с помощью идентификатора группы полос. LaneAttributes содержит информацию о группах полос, включая типы каждой полосы в группе и характеристики границ полос.

Используйте helperGetLaneAttributes используется для извлечения различных типов полос и разметки границ полос для каждой группы полос в плитке.

laneAttributesLayer = read(reader, 'LaneAttributes');
laneAttributesTable = helperGetLaneAttributes(laneAttributesLayer);

% Find the lane attribute entry for the matched lane group
laneAttribute = laneAttributesTable.LaneGroupId == laneGroupId;

Визуализация и проверка записанного диска с помощью HERE HDLM Data

Алгоритмы согласования и таблицы, генерируемые для идентификации свойств дороги и полосы движения, могут быть расширены до последовательности записанных координат GPS. Для каждого временного шага положение транспортного средства сопоставляется с группой звеньев и полос движения на дороге. Кроме того, вместе с соответствующими изображениями с камеры отображаются ограничения скорости и конфигурации полос движения.

HelperHDLMUI класс создает инструмент для потоковой передачи видео и данных GPS с записанного накопителя и отображения релевантной информации из выбранных слоев HERE HD Live Map в каждом записанном положении транспортного средства.

hdlmUI = HelperHDLMUI(gpsData.Latitude(1), gpsData.Longitude(1));

% Synchronize the camera and GPS data into a common timetable
synchronizedData = synchronize(videoTime, gpsData);
videoReader.CurrentTime = 0;
maxDisplayRate = videoReader.FrameRate * 5;

% Initialize some variables to maintain history
prevLinkId      = 0;
prevLaneGroupId = 0;

for idx = 1 : height(synchronizedData)

    timeStamp = synchronizedData.Time(idx);

    % Check if the current timestamp has GPS data
    hasGPSFrame = ~(ismissing(synchronizedData.Latitude(idx)) || ...
        ismissing(synchronizedData.Longitude(idx)));

    if hasGPSFrame
        latitude  = synchronizedData.Latitude(idx);
        longitude = synchronizedData.Longitude(idx);
        velocity  = synchronizedData.Velocity(idx, 1:2);

        % Match GPS position to link
        [linkId, linkLat, linkLon] = match(linkMatcher, ...
            latitude, longitude, velocity);

        if linkId ~= prevLinkId
            % Update link
            updateLink(hdlmUI, linkLat, linkLon);
            prevLinkId = linkId;

            % Update speed limit
            speed = speedTable(speedTable.LinkId == linkId, :);
            updateSpeed(hdlmUI, speed.Value);
        end

        % Match GPS position to lane group
        [laneGroupId, isForward, boundGeometry] = match(laneGroupMatcher, linkId, ...
            latitude, longitude, velocity);

        if laneGroupId ~= prevLaneGroupId
            % Update lane group
            updateLaneGroup(hdlmUI, boundGeometry);
            prevLaneGroupId = laneGroupId;

            % Update lane types and boundary markings
            laneAttribute = laneAttributesTable.LaneGroupId == laneGroupId;
            plotLanes(hdlmUI, laneAttributesTable.Lanes{laneAttribute}, ...
                laneAttributesTable.LaneBoundaries{laneAttribute}, isForward);
        end

        updatePosition(hdlmUI, latitude, longitude);
    else
        % Read frame of the video
        imageFrame = readFrame(videoReader);
    end

    updateImage(hdlmUI, imageFrame);
    updateTime(hdlmUI, timeStamp);
    pause(1/maxDisplayRate);
end

Заключение

В этом примере рассматриваются следующие способы:

  1. Доступ к данным отображения HD для данной последовательности GPS из сервиса HERE HD Live Map и импорт этих данных в MATLAB.

  2. Сопоставление записанных данных GPS с данными импортированной дорожной сети для поиска соответствующей связи и группы полос для каждой географической координаты.

  3. Запрос атрибутов согласованной линии связи и группы полос, таких как ограничение скорости и типы полос, для разработки инструмента визуальной проверки характеристик дороги по записанным данным камеры.

Способы, обсуждаемые в этом примере, могут быть дополнительно расширены для поддержки автоматической проверки алгоритмов восприятия.

Вспомогательные функции

helperPlotLayer строит график данных слоя и трассы на географическом графике.

function gx = helperPlotLayer(layer, latitude, longitude)
%helperPlotLayer Create geographic plot with layer data and route
%   gx = helperPlotLayer(layer, latitude, longitude) creates a geographic
%   axes plot with the plottable HDLM layer and the route given by latitude
%   and longitude on a new figure.

figure;

% Plot layer
gx = plot(layer);

% Enable adding data to the plot
hold(gx, 'on');

% Plot latitude, longitude data
geoplot(gx, latitude, longitude, 'bo-', 'DisplayName', 'Route');
hold(gx, 'off');
end

helperGetGeometry извлекает геометрию для элементов топологии из слоя в виде таблицы.

function geometryTable = helperGetGeometry(layer, fields)
%helperGetGeometry Create a table with geometry for topology elements
%   geometryTable = helperGetGeometry(layer, fields) returns a table
%   formatted with the specified geometry fields of the TopologyGeometry
%   and LaneTopology layers.

% Pre-allocate struct
S = repmat(struct, size(layer));

for field = fields
    C = strsplit(field{:}, '.');
    for idx = 1:numel(layer)
        fieldname = strjoin(C, '');
        S(idx).(fieldname) = getfield(layer, {idx}, C{:});
    end
end

geometryTable = struct2table(S);
end

helperGetSpeedLimits извлекает данные ограничения скорости из слоя в виде таблицы.

function speedTable = helperGetSpeedLimits(layer)
%helperGetSpeedLimits Create a data table with speed limits
%   speedTable = helperGetSpeedLimits(layer) returns a table formatted with
%   the speed limit start, end, direction, and value along a specified link
%   as given by the SpeedAttributes layer object specified by layer.

speed = struct(...
    'LinkId',       {}, ...
    'Start',        {}, ...
    'End',          {}, ...
    'Direction',    {}, ...
    'Value',        {});

for idx = 1 : numel(layer.LinkAttribution)

    % Assign the link ID
    link            = layer.LinkAttribution(idx);
    attributions    = link.ParametricAttribution;

    % Examine each attribute assigned to the link
    for attrIndex = 1 : numel(attributions)

        linkAttr = vertcat(attributions.LinkParametricAttribution);

        % For each attribute, check if the speed limit information is
        % listed. If speed limit is provided, make an entry.
        for linkAttrIndex = 1 : numel(linkAttr)

            if ~isempty(linkAttr(linkAttrIndex).SpeedLimit)

                % Assign speed limit to specified link
                speedLimit = struct;
                speedLimit.LinkId       = link.LinkLocalRef;
                speedLimit.Start        = attributions(attrIndex).AppliesToRange.RangeOffsetFromStart;
                speedLimit.End          = attributions(attrIndex).AppliesToRange.RangeOffsetFromEnd;
                speedLimit.Direction    = attributions(attrIndex).AppliesToDirection;
                speedLimit.Value        = linkAttr(linkAttrIndex).SpeedLimit.Value;

                % Convert KPH to MPH
                if strcmpi(linkAttr(linkAttrIndex).SpeedLimit.Unit, 'KILOMETERS_PER_HOUR')
                    speedLimit.Value = speedLimit.Value / 1.609;
                end

                if strcmpi(speedLimit.Direction, 'BOTH')
                    speed = [speed; speedLimit]; %#ok<AGROW>
                end
            end
        end

    end
end

speedTable = struct2table(speed);
end

helperGetReferences извлекает ссылки на дороги полосы движения из объекта-слоя в виде таблицы.

function laneRoadReferenceTable = helperGetReferences(layer)
%helperGetReferences Create a data table with lane road references
%   laneRoadReferenceTable = helperGetReferences(layer) returns a table
%   formatted with a list of all lane groups existing on a specified link
%   as given by the LaneRoadReferences layer object specified by layer.

numLinks = numel(layer.LinkLaneGroupReferences);
reference = repmat(struct('LinkId', {}, 'LaneGroupId', {}), numLinks, 1);

% Get references from links to lane groups
for idx = 1 : numLinks
    link = layer.LinkLaneGroupReferences(idx);
    laneGroups = vertcat(link.LaneGroupReferences.LaneGroupRef);

    reference(idx).LinkId = link.LinkLocalRef;
    reference(idx).LaneGroupId = [laneGroups(:).LaneGroupId]';
end

laneRoadReferenceTable = struct2table(reference);
end

helperGetLaneAttributes извлекает атрибуты полосы из объекта-слоя в виде таблицы.

function laneAttributesTable = helperGetLaneAttributes(layer)
%helperGetLaneAttributes Create a table with lane and boundary types
%   laneAttributesTable = helperGetLaneAttributes(layer) returns a table
%   formatted with the lane types and the lane boundary markings for each
%   lane group in the LaneAttributes layer object specified by layer.

for laneGroupAttrIndex = 1 : numel(layer.LaneGroupAttribution)
    laneGroup = layer.LaneGroupAttribution(laneGroupAttrIndex);
    attributes(laneGroupAttrIndex).LaneGroupId = laneGroup.LaneGroupRef; %#ok

    % Get lane types for each lane group
    for laneAttrIndex = 1 : numel(laneGroup.LaneAttribution)

        lane = laneGroup.LaneAttribution(laneAttrIndex);

        laneAttr = vertcat(lane.ParametricAttribution);
        laneAttr = vertcat(laneAttr.LaneParametricAttribution);

        for idx = 1 : numel(laneAttr)
            if ~isempty(laneAttr(idx).LaneType)
                attributes(laneGroupAttrIndex).Lanes{lane.LaneNumber} = ...
                    laneAttr(idx).LaneType;
            end
        end
    end

    % Get lane boundaries for each lane group
    for laneBoundaryIndex = 1 : numel(laneGroup.LaneBoundaryAttribution)
        laneBoundary = laneGroup.LaneBoundaryAttribution(laneBoundaryIndex);
        boundaries   = vertcat(laneBoundary.ParametricAttribution.LaneBoundaryParametricAttribution);

        attributes(laneGroupAttrIndex).LaneBoundaries{laneBoundary.LaneBoundaryNumber} = ...
            boundaries.LaneBoundaryMarking;
    end

end

laneAttributesTable = struct2table(attributes);
end

helperLoadCameraData загружает устройство чтения видео и метки времени из папки.

function [videoReader, videoTime] = helperLoadCameraData(dirName)
%helperLoadCameraData Load camera images from folder in a timetable
%   [videoReader, videoTime] = helperLoadCameraData(dirName) loads a video
%   from the folder dirName. Timestamps for the video are read from a
%   MAT-file in the folder named timeStamps.mat.

if ~isfolder(dirName)
    error('Expected dirName to be a path to a folder.')
end

matFileName = fullfile(dirName, 'centerCameraTime.mat');
if exist(matFileName, 'file') ~= 2
    error('Expected dirName to have a MAT-file named centerCameraTime.mat containing timestamps.')
end

% Load the MAT-file with timestamps
ts = load(matFileName);
fieldNames = fields(ts);
Time = ts.(fieldNames{1});

videoFileName = fullfile(dirName, 'centerCamera.avi');
if exist(matFileName, 'file') ~= 2
    error('Expected dirName to have a video file named centerCamera.avi.')
end

% Load the video file
videoTime = timetable(Time);
videoReader = VideoReader(videoFileName);
end

См. также

| |

Связанные темы