Генерация кода с обнаружением ячейки

Этот пример показывает, как сгенерировать код С с помощью MATLAB® Coder™ от приложений MATLAB то использование функции Image Processing Toolbox™. Пример описывает, как установить вашу среду MATLAB, подготовить ваш код MATLAB к генерации кода и работать вокруг любых проблем, с которыми вы можете столкнуться в своем коде MATLAB, которые предотвращают генерацию кода.

Setup ваш компилятор

Этот пример показывает, как задать, какой компилятор C/C++ вы хотите использовать с MATLAB Coder, чтобы сгенерировать код.

Используйте функцию mex с опцией -setup, чтобы задать компилятор C/C++, который вы хотите использовать с MATLAB Coder.

mex -setup
MEX configured to use 'Microsoft Visual C++ 2010 (C)' for C language compilation.
Warning: The MATLAB C and Fortran API has changed to support MATLAB
	 variables with more than 2^32-1 elements. In the near future
	 you will be required to update your code to utilize the
	 new API. You can find more information about this at:
	 https://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.

To choose a different C compiler, select one from the following:
Microsoft Visual C++ 2012 (C)  mex -setup:C:\matlab\bin\win64\mexopts\msvc2012.xml C
Intel C++ Composer XE 2013 with Microsoft Visual Studio 2012 (C)  mex -setup:C:\matlab\bin\win64\mexopts\intel_c_13_vs2012.xml C
Intel C++ Composer XE 2011 with Microsoft Visual Studio 2010 (C)  mex -setup:C:\mexopts\intel_c_12_vs2010.xml C
Intel C++ Composer XE 2013 with Microsoft Visual Studio 2010 (C)  mex -setup:C:\matlab\bin\win64\mexopts\intel_c_13_vs2010.xml C
Microsoft Visual C++ 2010 (C)  mex -setup:C:\MATLAB\R2015a\mex_C_win64.xml C

To choose a different language, select one from the following:
 mex -setup C++ 
 mex -setup FORTRAN mex -setup FORTRAN

Сгенерируйте код

Этот пример показывает, как сгенерировать код С из кода MATLAB, который включает функции Image Processing Toolbox с помощью MATLAB Coder. Чтобы проиллюстрировать процесс, код, используемый этим примером, включает некоторые проблемы готовности и проблемы сборки, которые необходимо преодолеть, прежде чем можно будет сгенерировать код.

Скопируйте следующий код в файл и сохраните его, дав ему имя cellDetectionMATLAB.m.

function BWfinal = cellDetectionMATLAB(I)
%cellDetectionMATLAB - detect cells using image segmentation.

[~, threshold] = edge(I, 'sobel');
fudgeFactor = .5;
BWs = edge(I,'sobel', threshold * fudgeFactor);
figure
imshow(BWs)
title('binary gradient mask');

se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);

BWsdil = imdilate(BWs, [se90 se0]);
figure
imshow(BWsdil)
title('dilated gradient mask');

BWdfill = imfill(BWsdil, 'holes');
figure
imshow(BWdfill);
title('binary image with filled holes');

BWnobord = imclearborder(BWdfill, 4);
figure
imshow(BWnobord)
title('cleared border image');

seD = strel('diamond',1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
figure
imshow(BWfinal)
title('segmented image');

Протестируйте пример кода с демонстрационным изображением. Используйте файл cell.tif, включенный с Image Processing Toolbox (matlab\toolbox\images\imdata\cell.tif).

I = imread('cell.tif');

Iseg = cellDetectionMATLAB(I);

% Display the original image and the segmented image side-by-side.
imshowpair(I,Iseg,'montage')

Создайте копию своего кода MATLAB прежде, чем сгенерировать код С. Поскольку вы изменяете этот код для генерации кода, хорошо работать с копией.

copyfile('cellDetectionMATLAB.m','cellDetectionCodeGeneration.m');

Откройте версию генерации кода функции в редакторе MATLAB. Как первый шаг, измените имя функции в функциональной подписи, чтобы совпадать с именем файла и добавить директиву компиляции MATLAB Coder %#codegen в конце функциональной подписи. Эта директива дает анализатору кода MATLAB команду диагностировать проблемы, которые запретили бы успешную генерацию кода.

function BWfinal = cellDetectionCodeGeneration(I) %#codegen
.
.
.

Откройте приложение MATLAB Coder. В MATLAB выберите вкладку Apps, перейдите Генерации кода и кликните по приложению MATLAB Coder. (Также можно ввести coder в подсказке команды MATLAB.)

Задайте имя своей функции точки входа, cellDetectionCodeGeneration, и нажмите Enter.

Определите готовность своего кода для генерации кода. Нажмите Next (в правом нижнем углу окна кодера). MATLAB Coder идентифицирует любые проблемы, которые могут предотвратить генерацию кода. Пример кода содержит пять неподдерживаемых вызовов функции.

Рассмотрите проблемы готовности. Нажмите Review Issues. В отчете MATLAB Coder отображает ваш код в окне редактирования с проблемами готовности описанное ниже, отмечающее использование функции imshow, которая не поддерживает генерацию кода.

Решите проблемы готовности. Удалите вызовы imshow и связанного кода отображения от вашего примера. Операторы отображения не необходимы для операции сегментации. Можно отредактировать пример кода в MATLAB Coder. Когда вы удалите код, нажмите Save, чтобы сохранить ваши редактирования и повторно выполнить проверку готовности. После повторного выполнения проверки готовности MATLAB Coder отображает сообщение No issues found.

Задайте размер и тип данных входных параметров к вашей функции. Каждый вход к вашему коду должен быть задан, чтобы иметь фиксированный размер, переменный размер или константу. Существует несколько способов задать размер вашего входного параметра, но самый легкий путь путем предоставления MATLAB Coder примера вызывания функции. Введите скрипт, который вызывает вашу функцию в поле ввода текста. В данном примере введите следующий код и нажмите Enter.

I = imread('cell.tif'); 
Iseg = cellDetectionCodeGeneration(I);

Для получения дополнительной информации об определении входных параметров, см. документацию MATLAB Coder. После того, как MATLAB Coder возвращается с входным определением типа, нажмите Next.

Проверяйте на проблемы во время выполнения. Даже при том, что вы выполнили проверки готовности MATLAB Coder, дополнительные проблемы могут возникнуть во время процесса сборки, который может предотвратить генерацию кода. В то время как взгляд проверок готовности на функциональные зависимости, чтобы определить готовность, процесс сборки исследует шаблоны кодирования. Можно использовать тот же код, который вы ввели к входным define типам (который предварительно загружен в диалоговое окно). Нажмите Check for Issues.

Этот пример содержит проблему сборки: это передает массив объектов strel к imdilate, и массивы объектов не поддержаны для генерации кода.

Решите идентифицированные проблемы сборки. В данном примере необходимо изменить вызов imdilate, чтобы не передавать массив объектов strel. Это выполняется, заменяя один вызов imdilate с двумя отдельными вызовами imdilate, куда вы передаете один объект strel с каждым вызовом, подсвеченным в следующей фигуре.

Повторно выполните тестовую сборку, чтобы убедиться, что ваши изменения устранили проблему. Нажмите Check for Issues. MATLAB Coder отображает сообщение, объявляя, что никакие проблемы не были обнаружены. Вы теперь готовы сгенерировать код. Нажмите Next.

Выберите тип кода, вы хотите сгенерировать и выбрать целевую платформу. MATLAB Coder может сгенерировать C или исходный код C++, файл MEX, статическую библиотеку, разделяемую библиотеку или независимый исполняемый файл. Для Производственного Оборудования можно выбрать из многих вариантов включая процессоры ARM и Intel. В данном примере выберите Source Code и, для языка, оставьте опцию C выбранной и выберите Generic для производственного оборудования и Хост - компьютер MATLAB для типа устройства. Когда вы выбираете MATLAB Host Computer, MATLAB Coder генерирует код, который зависит от предварительно скомпилированной разделяемой библиотеки. Функции Image Processing Toolbox пользуются разделяемой библиотекой, чтобы сохранить оптимизацию производительности. Когда вы сделаете свои выборы, нажмите Generate.

Сгенерируйте код. Когда это сделано, MATLAB Coder отображает сгенерированный код.

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

type codegen\dll\cellDetectionCodeGeneration\cellDetectionCodeGeneration.h
/*
 * cellDetectionCodeGeneration.h
 *
 * Code generation for function 'cellDetectionCodeGeneration'
 *
 */

#ifndef __CELLDETECTIONCODEGENERATION_H__
#define __CELLDETECTIONCODEGENERATION_H__
/* Include files */
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>

#include "rtwtypes.h"
#include "cellDetectionCodeGeneration_types.h"

/* Function Declarations */
#ifdef __cplusplus
extern "C" {
#endif
extern void cellDetectionCodeGeneration(const unsigned char I[30369], boolean_T BWfinal[30369]);
#ifdef __cplusplus
}
#endif
#endif
/* End of code generation (cellDetectionCodeGeneration.h) */

Функциональная представленная подпись указывает, что существует два входных параметров. Первым входом I, как ожидают, будет unsigned char с 30 369 элементами. Это используется, чтобы передать входное изображение, на котором должно быть выполнено обнаружение ячейки. Тип входного изображения в MATLAB (uint8) представлен как unsigned char. Размер изображения является 159 x 191, т.е. 30 369 элементами. Число элементов задано через интерфейс, поскольку вход был задан, чтобы быть фиксированным размером. Вторым входом BWfinal, как ожидают, будет boolean_T с 30 369 элементами. Это используется, чтобы передать указатель на выходное изображение.

Обратите внимание на то, что существует различие в пути MATLAB и массивы хранилища C в памяти. MATLAB хранит массивы в порядке развертывания по столбцам, и C хранит массивы в главном строкой порядке. Чтобы проиллюстрировать, рассмотрите следующий массив:

[ 1  2
  3  4 ]

MATLAB хранит массив в памяти как [1 3 2 4 ], где C хранит элементы как [1 2 3 4 ]. Необходимо объяснить это различие при работе с массивами.

Можно также сгенерировать независимый исполняемый файл с помощью "Исполнимой опции" C/C++. В этом случае основная функция, которая вызывает сгенерированный код, должна быть задана. Обратите внимание на то, что нет никаких готовых утилит для того, чтобы импортировать данные. Для примера обратитесь к Использованию Динамического выделения памяти для Симуляции "Атомов" в документации MATLAB Coder.

Нажмите Next, чтобы завершить процесс. MATLAB Coder отображает информацию о том, что это сгенерировало. По умолчанию MATLAB Coder создает подпапку codegen в вашей папке работы, которая содержит сгенерированный вывод. Для получения дополнительной информации о генерации кода, см. документацию MATLAB Coder.

Похожие темы