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

Этот пример показывает, как использовать 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, видении. VideoFileReader не поддерживает генерацию кода для чтения сжатого видео. Распакуйте видеофайлы и сохраните их во временной директории.

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

    % Uncompress the right video.
    videoFileRight = 'handshake_right.avi';
    reader = vision.VideoFileReader(videoFileRight);
    writer = vision.VideoFileWriter(videoFileRight);
    while ~isDone(reader)
        frame = step(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 опции. Для получения дополнительной информации смотрите Входную Спецификацию.

% Define the properties of input struct.
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, как введено.