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