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

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

Для этого примера требуется лицензия MATLAB Coder.

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

Об основах генерации кода можно узнать с помощью Coder™ MATLAB ® из примера Введение в генерацию кода с сопоставлением функций и регистрацией.

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

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

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

Реструктурированный код для основного алгоритма примера Depth Estimation From Stereo Video находится в функции, называемой 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. Можно задать опцию '-report', чтобы сгенерировать отчет компиляции, в котором показан оригинальный код 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 объект как вход.