В этом примере показано, как использовать Coder™ MATLAB ® для генерации кода С для функции MATLAB, которая использует stereoParameters
объект, произведенный приложением Stereo Camera Calibrator или estimateCameraParameters
функция. Пример объясняет, как изменить код MATLAB в примере Depth Estimation From Stereo Video, чтобы поддержать генерацию кода.
Для этого примера требуется лицензия MATLAB Coder.
Об основах генерации кода можно узнать с помощью Coder™ MATLAB ® из примера Введение в генерацию кода с сопоставлением функций и регистрацией.
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
Используйте функцию 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
объект как вход.