В этом примере показано, как использовать Coder™ MATLAB ® для создания кода C для файла MATLAB. В этом примере объясняется, как изменить код MATLAB, используемый в примере «Найти поворот изображения и масштаб с помощью автоматического сопоставления элементов», чтобы он поддерживался для создания кода. В этом примере рассматриваются некоторые общие требования к созданию кода, а также некоторые конкретные действия, которые необходимо выполнить для подготовки кода MATLAB. После того, как код MATLAB готов к созданию кода, используется codegen (Кодер MATLAB) для создания функции C-MEX. Наконец, для проверки результатов в примере показано, как запустить сгенерированную функцию C-MEX в MATLAB и сравнить ее вывод с выводом кода MATLAB.
В этом примере требуется лицензия кодера MATLAB.
Для выполнения этого примера необходимо иметь доступ к компилятору C и настроить его с помощью команды «mex -setup». Дополнительные сведения см. в разделе Начало работы с кодером MATLAB (MATLAB Coder).
Сгенерированный код может выполняться в среде MATLAB как файл C-MEX или вне среды MATLAB как автономный исполняемый файл или совместно используемая утилита для связи с другим автономным исполняемым файлом. Дополнительные сведения об установке параметров генерации кода см. в разделе -config codegen (Кодер MATLAB).
Исполняемые файлы MEX
В этом примере создается исполняемый файл MEX для выполнения в среде MATLAB.
Создание исполняемого файла C-MEX для запуска внутри MATLAB также может быть отличным первым шагом в рабочем процессе, который в конечном итоге приводит к автономному коду. Входные и выходные данные MEX-файла доступны для проверки в среде MATLAB, где легко доступны визуализация и другие виды инструментов для проверки и анализа. Можно также выбрать выполнение отдельных команд либо в виде сгенерированного кода C, либо через механизм MATLAB. Для выполнения через MATLAB объявите соответствующие команды как coder.extrinsic (Кодер MATLAB), что означает, что сгенерированный код повторно войдет в среду MATLAB при необходимости выполнения этой конкретной команды. Это полезно в тех случаях, когда либо изолированная команда еще не поддерживает генерацию кода, либо если требуется встроить определенные команды, которые не генерируют код (например, команду plot).
Автономные исполняемые файлы
Если целью является развертывание кода в другом приложении, то потребуется автономный исполняемый файл. Первым шагом является соответствующая настройка кодера MATLAB. Например, одним из способов создания автономного исполняемого файла является создание проекта кодера MATLAB с помощью среды кодера MATLAB и настройка этого проекта для создания модуля или исполняемого файла. Для этого можно использовать статическую библиотеку C/C + + или исполняемые параметры C/C + + из графического элемента «Тип сборки» на странице «Создание». Эта среда IDE доступна путем навигации следующим образом:
- Перейдите на вкладку APPS - Прокрутите вниз до MATLAB Coder - В диалоговом окне MATLAB Coder Project нажмите кнопку OK
Можно также определить объект конфигурации с помощью
a=coder.config('exe')и передайте этот объект команде coder в командной строке MATLAB. При создании автономного исполняемого файла необходимо написать собственный main.c (или main.cpp). Обратите внимание, что при создании автономного исполняемого файла нет готовых утилит для импорта или экспорта данных между исполняемым файлом и средой MATLAB. Один из вариантов - использовать printf/fprintf в файле (в вашем рукописном main.c), а затем импортировать данные в MATLAB, используя load -ascii с вашим файлом.
Кодер MATLAB требует, чтобы код MATLAB имел форму функции для генерации кода C. Следует отметить, что обычно нет необходимости генерировать код C для всего рассматриваемого кода MATLAB. Часто желательно разделить код на основную вычислительную часть, из которой требуется генерация кода C, и жгут или драйвер, который не нуждается в генерации кода C - этот код будет выполняться в MATLAB. Жгут может содержать средства визуализации и другие средства проверки, которые фактически не являются частью тестируемой системы. Код основного алгоритма этого примера находится в функции, называемой visionRecovertformCodeGeneration_kernel
После изменения архитектуры кода, как описано выше, необходимо проверить, что в остальном коде используются возможности, поддерживаемые кодером MATLAB. Список поддерживаемых команд см. в разделе Функции и объекты кодера MATLAB, поддерживаемые для генерации кода C/C + + (кодер MATLAB). Список поддерживаемых языковых конструкций см. в разделе Языковые функции MATLAB, поддерживаемые для генерации кода C/C + + (кодер MATLAB).
Может быть удобно иметь ограниченную визуализацию или какую-либо другую возможность, которая не поддерживается кодером MATLAB, присутствующим в функции, содержащей основной алгоритм, который мы надеемся скомпилировать. В этих случаях можно объявить эти элементы «внешними» (с помощью coder.extrinsic). Такая возможность возможна только в том случае, если код C создается в файле MATLAB MEX, и эти функции фактически выполняются в интерпретируемом режиме MATLAB. При генерации кода для автономного использования внешние функции либо игнорируются, либо генерируются ошибки, в зависимости от того, определяет ли механизм генерации кода, что они влияют на результаты. Таким образом, код должен быть надлежащим образом сконструирован таким образом, чтобы внешние функции не оказывали существенного влияния на рассматриваемый код, если в конечном итоге требуется автономный исполняемый файл.
В оригинальном примере для визуализации результатов используются программы sunMatchedFeatures и 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



Теперь используйте codegen (MATLAB Coder) для компиляции функции visionRecovertformCodeGeneration_kernel в MEX-файл. Можно указать параметр «» -report «» для создания отчета о компиляции, в котором отображается исходный код MATLAB и связанные файлы, созданные во время создания кода C. Можно создать временный каталог, в котором MATLAB Coder может создавать новые файлы. Обратите внимание, что созданный файл MEX имеет то же имя, что и исходный файл MATLAB с добавленными _mex, если для указания имени исполняемого файла не используется параметр -o.
Для кодера MATLAB необходимо указать свойства всех входных параметров. Одним из простых способов этого является определение входных свойств на примере в командной строке с помощью параметра -args. Дополнительные сведения см. в разделе Определение входных свойств по примеру в командной строке (кодер MATLAB). С момента ввода в% 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 и CODEGEN, как показано выше, находятся в пределах разумного допуска. Кроме того, совпадающие точки идентичны, как показано ниже:
isequal(matchedOriginalLocCG, matchedOriginalLoc) isequal(matchedDistortedLocCG, matchedDistortedLoc)
ans = logical 1 ans = logical 1
В этом примере используются следующие вспомогательные функции.