Введение в генерацию кода с совпадением функций и регистрацией

В этом примере показано, как использовать Coder™ MATLAB ® для генерации кода С для файла MATLAB. Пример объясняет, как изменить код MATLAB, используемый в примере Find Image Rotation и Scale Using Automated Feature Matching, так что он поддерживается для генерации кода. В примере описываются некоторые общие требования к генерации кода, а также некоторые конкретные действия, которые вы должны предпринять, чтобы подготовить код MATLAB. Когда код MATLAB готов к генерации кода, вы используете codegen (MATLAB Coder) для генерации функции C-MEX. Наконец, чтобы проверить результаты, в примере показано, как запустить сгенерированную функцию C-MEX в MATLAB и сравнить ее вывод с выходом кода MATLAB.

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

Настройте компилятор C

Чтобы запустить этот пример, вы должны иметь доступ к компилятору C, и вы должны настроить его с помощью команды 'mex -настройка'. Для получения дополнительной информации смотрите Запуск с MATLAB Coder (MATLAB Coder).

Решите, запускаться ли в MATLAB или как автономное приложение

Сгенерированный код может запускаться внутри окружения MATLAB как файла MEX на C или вне окружения MATLAB как независимый исполняемый файл или общая утилита, которая будет связана с другим независимым исполняемым файлом. Для получения дополнительной информации об установке опций генерации кода смотрите опцию -config codegen (MATLAB Coder) команда.

Исполняемые файлы MEX

Этот пример генерирует исполняемый файл MEX, который запускается в среде MATLAB.

Генерация исполняемого файла C-MEX для запуска внутри MATLAB также может быть отличным первым шагом в рабочем процессе, который в конечном счете приводит к автономному коду. Входы и выходы файла MEX доступны для проверки в среде MATLAB, где легко доступны визуализация и другие виды инструментов для верификации и анализа. У вас также есть выбор выполнения отдельных команд либо в виде сгенерированного кода C, либо через движок MATLAB. Чтобы запустить через MATLAB, объявите соответствующие команды следующим coder.extrinsic (MATLAB Coder), что означает, что сгенерированный код будет повторно входить в окружение MATLAB, когда ему нужно запустить эту конкретную команду. Это полезно в случаях, когда либо изолированная команда еще не имеет поддержки генерации кода, либо если вы хотите встраивать определенные команды, которые не генерируют код (такие как команда plot).

Независимые исполняемые файлы

Если целью является развертывание кода в другом приложении, то потребуется независимый исполняемый файл. Первым шагом является соответствующее конфигурирование MATLAB Coder. Для примера один из способов сказать, что вы хотите независимого исполняемого файла, это создать проект MATLAB Coder с помощью IDE MATLAB Coder и сконфигурировать этот проект, чтобы сгенерировать модуль или исполняемый файл. Сделать это можно с помощью статической библиотеки C/C + + или исполняемых опций C/C + + из виджета Тип сборки на странице Сгенерировать. Эта среда IDE доступна путем навигации следующим образом:

- Нажмите вкладку APPS - Прокрутка вниз до MATLAB Coder - В диалоговом окне MATLAB Coder Project, нажмите OK

Можно также задать объект config, используя

a=coder.config('exe')

и передайте этот объект в команду coder в командной строке MATLAB. Когда вы создаете независимый исполняемый файл, вы должны написать свой собственный main.c (или main.cpp). Обратите внимание, что при создании независимого исполняемого файла нет готовых утилит для импорта или экспорта данных между исполняемым файлом и окружением MATLAB. Один из опций - использовать printf/fprintf в файл (в рукописном main.c), а затем импортировать данные в MATLAB, используя 'load -ascii' с вашим файлом.

Выключите вычислительную часть алгоритма в отдельную функцию MATLAB

MATLAB Coder требует, чтобы код MATLAB был в форме функции, порядка для генерации Кода С. Обратите внимание, что обычно нет необходимости генерировать код С для всего рассматриваемого кода MATLAB. Часто желательно разделить код на основной вычислительный фрагмент, от которой желательна генерация кода C, и обвязку или драйвер, который не должен генерировать код С - этот код будет запускаться в MATLAB. Обвязка может содержать средства визуализации и другие средства верификации, которые фактически не являются частью тестируемой системы. Код для основного алгоритма этого примера находится в функции, называемой visionRecovertformCodeGeneration_kernel

После перестроения кода, как описано выше, необходимо проверить, что в остальной части кода используются возможности, поддерживаемые MATLAB Coder. Список поддерживаемых команд см. в разделах Функции MATLAB Coder и Объекты, поддерживаемые для генерации кода C/C + + (MATLAB Coder). Список поддерживаемых конструкций языка см. в разделе Функции языка MATLAB, поддерживаемые для генерации кода C/C + + (MATLAB Coder).

Может быть удобно иметь ограниченную визуализацию или некоторую другую возможность, которая не поддерживается MATLAB Coder, присутствующим в функции, содержащей основной алгоритм, который мы надеемся скомпилировать. В этих случаях можно объявить эти элементы 'extinsic' (используя coder.extrinsic). Такая возможность возможна только, когда вы генерируете код С в MATLAB файл MEX, и эти функции будут фактически запускаться в интерпретированном режиме MATLAB. При генерации кода для автономного использования внешние функции либо игнорируются, либо генерируют ошибку, в зависимости от того, определяет ли механизм генерации кода, что они влияют на результаты. Таким образом, код должен быть правильно спроектирован так, чтобы внешние функции не оказывали существенного влияния на рассматриваемый код, если независимый исполняемый файл в конечном счете желательно.

Исходный пример использует showMatchedFeatures и imshowpair стандартных программ для визуализации результатов. Эти стандартные программы извлекаются в новую функцию featureMatchingVisualization_extrinsic. Эта функция объявлена внешней.

Запуск симуляции

Файл ядра visionRecovertformCodeGeneration_kernel.m имеет два входных параметра. Первый вход является оригинальным изображением, а второй вход является изображением, искаженным поворотом и шкалой.

% define original image
original = imread('cameraman.tif');
% define distorted image by resizing and then rotating original image
scale = 0.7;
J = imresize(original, scale);
theta = 30;
distorted = imrotate(J, theta);
% call the generated mex file
[matchedOriginalLoc, matchedDistortedLoc,...
    thetaRecovered, ...
  scaleRecovered, recovered] = ...
    visionRecovertformCodeGeneration_kernel(original, distorted);
scaleRecovered = 0.701003

thetaRecovered = 30.235065

Скомпилируйте функцию MATLAB в файл MEX

Теперь используйте codegen (MATLAB Coder) для компиляции функции visionRecovertformCodeGeneration_kernel в файл MEX. Можно задать опцию '-report', чтобы сгенерировать отчет компиляции, в котором показан оригинальный код MATLAB и связанные файлы, которые были созданы во время генерации кода C. Можно хотеть создать временную директорию, в котором MATLAB Coder может создавать новые файлы. Обратите внимание, что сгенерированный Файл MEX имеет то же имя что и исходный ФАЙЛ MATLAB с _mex добавлением, если вы не используете опции -o, чтобы задать имя исполняемого файла.

MATLAB Coder требует, чтобы вы задали свойства всех параметров входа. Один из простых способов сделать это - задать входные свойства на примере в командной строке с помощью опции -args. Для получения дополнительной информации смотрите Задать входные свойства по примеру в командной строке (MATLAB Coder). Поскольку входы в% visionRecovertformCodeGeneration_kernel являются парой изображений, мы задаем оба входов со следующими свойствами:

  • Переменный размер во время выполнения с верхней границей [1000 1000]

  • тип данных uint8

% Define the properties of input images
imageTypeAndSize = coder.typeof(uint8(0), [1000 1000],[true true]);
compileTimeInputs  = {imageTypeAndSize, imageTypeAndSize};

codegen visionRecovertformCodeGeneration_kernel.m -report -args compileTimeInputs;
Code generation successful: To view the report, open('codegen/mex/visionRecovertformCodeGeneration_kernel/html/report.mldatx').

Запуск сгенерированного кода

[matchedOriginalLocCG, matchedDistortedLocCG,...
   thetaRecoveredCG, scaleRecoveredCG, recoveredCG] = ...
   visionRecovertformCodeGeneration_kernel_mex(original, distorted);
scaleRecovered = 0.701003

thetaRecovered = 30.235065

Очистка

clear visionRecovertformCodeGeneration_kernel_mex;

Сравнение кодегена с кодом MATLAB

Восстановленные шкала и theta для MATLAB и CODEGEN, как показано выше, находятся в пределах разумного допуска. Кроме того, совпадающие точки идентичны, как показано ниже:

isequal(matchedOriginalLocCG, matchedOriginalLoc)
isequal(matchedDistortedLocCG, matchedDistortedLoc)
ans =

  logical

   1


ans =

  logical

   1

Приложение

В этом примере используются следующие вспомогательные функции.