Этот пример демонстрирует обнаружение ребра в изображении с MEX-функцией CUDA®, сгенерированной от функции MATLAB®. Алгоритм обнаружения ребра реализован с типом данных полуточности.
Необходимый
Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.
CUDA включил NVIDIA®, графический процессор с минимумом вычисляет возможность 6,0 и совместимый драйвер.
Дополнительный
Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование и Подготовку Необходимых как условие продуктов.
Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте coder.checkGpuInstall функция.
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
В алгоритме обнаружения ребра Sobel sobelEdgeDetectionAlg.m , 2D пространственная операция градиента выполняется на полутоновом изображении. Эта операция подчеркивает высокие пространственные области частоты, которые соответствуют ребрам в изображении.
type sobelEdgeDetectionAlg
function edgeImg = sobelEdgeDetectionAlg(img,thresh) %#codegen %sobelEdgeDetection Example MATLAB function for edge detection. % Copyright 2018 The MathWorks, Inc. kern = half([1 2 1; 0 0 0; -1 -2 -1]); % Finding horizontal and vertical gradients. h = conv2(img(:,:,2),kern,'same'); v = conv2(img(:,:,2),kern','same'); % Finding magnitude of the gradients. e = sqrt(h.*h + v.*v); % Threshold the edges edgeImg = uint8((e > thresh) * 240); end
Алгоритм ребра Sobel вычисляет горизонтальный градиент resX и вертикальный градиент resY из входа отображают при помощи двух ортогональных ядер фильтра maskX и maskY. После операции фильтрации алгоритм вычисляет величину градиента и применяет порог, чтобы найти области изображений, которые считаются ребрами.
Используйте стандартный imread команда, чтобы считать изображения. imread представляет каналы RGB изображения с целыми числами, один для каждого пикселя. Целые числа лежат в диапазоне от 0 до 255. Просто кастинг входных параметров к половине типа может привести к переполнению во время сверток. В этом случае мы можем масштабировать изображения к значениям между 0 и 1.
im = imread('peppers.png');
figure();
image(im);
imPacked = half(im)/255;
thresh = half(100)/255;

Сгенерировать MEX CUDA для sobelEdgeDetectionAlg функционируйте, создайте объект настройки графического процессора кода и запустите codegen команда. Чтобы сгенерировать и выполнить код с типами данных полуточности, CUDA вычисляют возможность 6,0, или выше требуется. Установите ComputeCapability свойство настройки кода возражает против '6.0'. Для полуточности выделение памяти (malloc) режим для генерации кода CUDA должно быть установлено в 'Дискретный'.
cfg = coder.gpuConfig('mex'); cfg.GpuConfig.ComputeCapability = '6.0'; cfg.GpuConfig.MallocMode = 'Discrete'; codegen -config cfg -args {imPacked,thresh} sobelEdgeDetectionAlg;
Code generation successful.
После того, как вы генерируете MEX-функцию, можно проверить, что она имеет ту же функциональность как исходная функция точки входа MATLAB. Запустите сгенерированный sobelEdgeDetectionAlg_mex и постройте результаты.
out_disp = sobelEdgeDetectionAlg_mex(imPacked,thresh); imagesc(out_disp);

Очистите статический сетевой объект, который загрузился в памяти.
clear mex;
codegen | coder.checkGpuInstall | coder.gpu.constantMemory | coder.gpu.kernel | coder.gpu.kernelfun | gpucoder.matrixMatrixKernel | gpucoder.stencilKernel