В этом примере показано, как создать автономную библиотеку C из кода MATLAB ®, которая реализует простой фильтр Собеля, выполняющий обнаружение краев изображений. Пример также показывает, как генерировать и тестировать функцию MEX в MATLAB перед генерацией кода C для проверки того, что код MATLAB пригоден для генерации кода.
sobel Функция sobel.m функция принимает изображение (представленное в виде двойной матрицы) и пороговое значение и возвращает изображение с обнаруженными краями (на основе порогового значения).
type sobel% edgeImage = sobel(originalImage, threshold) % Sobel edge detection. Given a normalized image (with double values) % return an image where the edges are detected w.r.t. threshold value. function edgeImage = sobel(originalImage, threshold) %#codegen assert(all(size(originalImage) <= [1024 1024])); assert(isa(originalImage, 'double')); assert(isa(threshold, 'double')); k = [1 2 1; 0 0 0; -1 -2 -1]; H = conv2(double(originalImage),k, 'same'); V = conv2(double(originalImage),k','same'); E = sqrt(H.*H + V.*V); edgeImage = uint8((E > threshold) * 255);
Создайте функцию MEX с помощью codegen команда.
codegen sobelCode generation successful.
Перед созданием кода C необходимо сначала протестировать функцию MEX в MATLAB, чтобы убедиться, что она функционально эквивалентна исходному коду MATLAB и что ошибки во время выполнения не возникают. По умолчанию codegen генерирует функцию MEX с именем sobel_mex в текущей папке. Это позволяет протестировать код MATLAB и функцию MEX и сравнить результаты.
Использовать стандарт imread команда.
im = imread('hello.jpg');
image(im);
Преобразование цветного изображения (показано выше) в эквивалентное изображение в оттенках серого с нормализованными значениями (0,0 для черного, 1,0 для белого).
gray = (0.2989 * double(im(:,:,1)) + 0.5870 * double(im(:,:,2)) + 0.1140 * double(im(:,:,3)))/255;
Передача нормализованного изображения и порогового значения.
edgeIm = sobel_mex(gray, 0.7);
im3 = repmat(edgeIm, [1 1 3]); image(im3);

codegen -config coder.config('lib') sobel
Code generation successful.
Используя codegen с -config coder.config('lib') создает автономную библиотеку C. По умолчанию код, созданный для библиотеки, находится в папке codegen/lib/sobel/.
type codegen/lib/sobel/sobel.c/*
* File: sobel.c
*
* MATLAB Coder version : 5.2
* C/C++ source code generated on : 21-Apr-2021 01:21:29
*/
/* Include Files */
#include "sobel.h"
#include "conv2AXPYSameCMP.h"
#include "sobel_data.h"
#include "sobel_emxutil.h"
#include "sobel_initialize.h"
#include "sobel_types.h"
#include <math.h>
/* Function Definitions */
/*
* Arguments : const emxArray_real_T *originalImage
* double threshold
* emxArray_uint8_T *edgeImage
* Return Type : void
*/
void sobel(const emxArray_real_T *originalImage, double threshold,
emxArray_uint8_T *edgeImage)
{
emxArray_real_T *H;
emxArray_real_T *V;
int k;
int nx;
if (!isInitialized_sobel) {
sobel_initialize();
}
emxInit_real_T(&H, 2);
emxInit_real_T(&V, 2);
/* edgeImage = sobel(originalImage, threshold) */
/* Sobel edge detection. Given a normalized image (with double values) */
/* return an image where the edges are detected w.r.t. threshold value. */
conv2AXPYSameCMP(originalImage, H);
b_conv2AXPYSameCMP(originalImage, V);
nx = H->size[0] * H->size[1];
for (k = 0; k < nx; k++) {
H->data[k] = H->data[k] * H->data[k] + V->data[k] * V->data[k];
}
emxFree_real_T(&V);
nx = H->size[0] * H->size[1];
for (k = 0; k < nx; k++) {
H->data[k] = sqrt(H->data[k]);
}
k = edgeImage->size[0] * edgeImage->size[1];
edgeImage->size[0] = H->size[0];
edgeImage->size[1] = H->size[1];
emxEnsureCapacity_uint8_T(edgeImage, k);
nx = H->size[0] * H->size[1];
for (k = 0; k < nx; k++) {
edgeImage->data[k] = (unsigned char)((H->data[k] > threshold) * 255U);
}
emxFree_real_T(&H);
}
/*
* File trailer for sobel.c
*
* [EOF]
*/