Генерация кода для оценки глубины от видео стерео

В этом примере показано, как использовать MATLAB® Coder™, чтобы сгенерировать код С для функции MATLAB, которая использует stereoParameters объект производится приложением Stereo Camera Calibrator или estimateCameraParameters функция. Пример объясняет, как изменить код MATLAB по Оценке Глубины Из Видео примера Стерео, чтобы поддержать генерацию кода.

Этот пример требует лицензии MATLAB Coder.

Генерация кода

Можно узнать об основах генерации кода, использующей MATLAB® Coder™ от Введения до Генерации кода с примером Соответствия и Регистрации Функции.

Реструктуризация кода MATLAB для генерации кода C

MATLAB Coder требует, чтобы код MATLAB был в форме функции для того, чтобы сгенерировать код С. Кроме того, аргументы функции не могут быть объектами MATLAB.

Это представляет проблему для генерации кода из кода MATLAB, который использует cameraParameters или stereoParameters объекты, которые обычно создаются заранее во время калибровки фотоаппарата. Чтобы решить эту задачу, используйте toStruct() метод, чтобы преобразовать cameraParameters или stereoParameters объект в struct. Struct может затем быть передан в сгенерированный код.

Реструктурированный код для основного алгоритма Оценки Глубины Из Видео примера Стерео находится в функции, вызванной depthEstimationFromStereoVideo_kernel.m. Обратите внимание на то, что depthEstimationFromStereoVideo_kernel функция, которая берет struct, созданный из stereoParameters объект. Обратите внимание также, что это не отображает восстановленное 3-D облако точек, потому что showPointCloudFunction не поддерживает генерацию кода.

Загрузите параметры стереофотоаппарата

Загрузите stereoParameters объект, который является результатом калибровки камеры с помощью любого stereoCameraCalibrator приложение или estimateCameraParameters функция.

% Load the stereoParameters object.
load('handshakeStereoParams.mat');

% Visualize camera extrinsics.
showExtrinsics(stereoParams);

% Convert the object into a struct, which can be passed into generated
% code.
stereoParamsStruct = toStruct(stereoParams);

Распакуйте видеофайлы

На Macintosh VideoReader не поддерживает генерацию кода для чтения сжатого видео. Распакуйте видеофайлы и сохраните их во временной директории.

if strcmp(computer(), 'MACI64')
    % Uncompress the left video.
    videoFileLeft = 'handshake_left.avi';
    reader = VideoReader(videoFileLeft);
    writer = vision.VideoFileWriter(videoFileLeft);
    while hasFrame(reader)
        frame = readFrame(reader);
        step(writer, frame);
    end
    release(reader);
    release(writer);

    % Uncompress the right video.
    videoFileRight = 'handshake_right.avi';
    reader = VideoReader(videoFileRight);
    writer = vision.VideoFileWriter(videoFileRight);
    while hasFrame(reader)
        frame = readFrame(reader);
        step(writer, frame);
    end
    release(reader);
    release(writer);
end

Скомпилируйте функцию MATLAB в файл MEX

Используйте функцию codegen, чтобы скомпилировать depthEstimationFromStereoVideo_kernel функция в файл MEX. Можно задать '-отчет' опция, чтобы сгенерировать отчет компиляции, который показывает оригинальный код MATLAB и связанные файлы, которые были созданы во время генерации кода C. Можно хотеть создать временную директорию, где MATLAB Coder может хранить сгенерированные файлы. Обратите внимание на то, что сгенерированный файл MEX имеет то же имя как исходный файл MATLAB с добавленным _mex, если вы не используете-o опцию, чтобы задать имя исполняемого файла.

MATLAB Coder требует, чтобы вы задали свойства всех входных параметров. Один простой способ сделать это должно задать входные свойства на примере в командной строке с помощью-args опции. Для получения дополнительной информации смотрите, Задают Входные свойства на примере в Командной строке (MATLAB Coder).

compileTimeInputs  = {coder.typeof(stereoParamsStruct)};

% Generate code.
codegen depthEstimationFromStereoVideo_kernel -args compileTimeInputs;

Запустите сгенерированный код

player = vision.VideoPlayer('Position', [100 200 750 560]);
eofReached = false;
while ~eofReached
    [eofReached, dispFrame] = depthEstimationFromStereoVideo_kernel_mex(stereoParamsStruct);

    % Hold the last frame.
    if ~eofReached
      step(player, dispFrame);
    end
end

Очистка

clear depthEstimationFromStereoVideo_kernel_mex;
release(player);

Сводные данные

Этот пример показал, как сгенерировать код С из кода MATLAB, который берет cameraParameters или stereoParameters возразите, как введено.