exponenta event banner

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

В этом примере показано, как использовать Coder™ MATLAB ® для создания кода C для функции MATLAB, которая использует stereoParameters объект, созданный приложением Stereo Camera Calibrator или estimateCameraParameters функция. В примере объясняется, как изменить код MATLAB в примере «Оценка глубины из стереовидения» для поддержки генерации кода.

В этом примере требуется лицензия кодера MATLAB.

Создание кода

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

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

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

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

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

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 необходимо указать свойства всех входных параметров. Одним из простых способов этого является определение входных свойств на примере в командной строке с помощью параметра -args. Дополнительные сведения см. в разделе Определение входных свойств по примеру в командной строке (кодер MATLAB).

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

Резюме

В этом примере показано, как создать код C из кода MATLAB, который принимает cameraParameters или stereoParameters объект в качестве входных данных.