В этом примере показано, как сгенерировать CUDA ® MEX из кода MATLAB ® и выполнить соответствие функций между двумя изображениями. Этот пример использует matchFeatures
(Computer Vision Toolbox) функция из Image Processing Toolbox™, чтобы соответствовать дескрипторам признаков между двумя изображениями, которые поворачиваются и масштабируются относительно друг друга. Дескрипторы функции двух изображений обнаруживаются и извлекаются с помощью алгоритма Speeded-Up Robust Функций (SURF).
Необходимый
Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.
CUDA включает графический процессор NVIDIA ® и совместимый драйвер.
Дополнительный
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Набор инструментальных средств NVIDIA.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».
Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте coder.checkGpuInstall
функция.
envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);
В этом примере соответствие функций выполняется на двух изображениях, которые поворачиваются и масштабируются относительно друг друга. Прежде чем эти два изображения будут совпадать, точки функций для каждого изображения должны быть обнаружены и извлечены. Следующая функция featureDetectionAndExtraction использует SURF (detectSURFFeatures
(Computer Vision Toolbox)) локальный детектор признаков для обнаружения характерных точек и extractFeatures
(Computer Vision Toolbox), чтобы извлечь функции.
Функция featureDetectionAndExtraction
возвращает refPoints
, который содержит координаты функций опорного изображения, qryPoints
, содержащий координаты функций изображения запроса, refDesc
матрица, содержащая дескрипторы функций опорного изображения и qryDesc
матрица, содержащая дескрипторы функций изображения запроса.
refPoints = Ссылка на координаты функции изображения.
qryPoints = Запрос координат функций изображения.
refDescFeat = дескрипторы функций эталонного изображения.
qryDescFeat = Дескрипторы функций изображения запроса.
% Read Image K = imread('cameraman.tif'); % Reference image refImage = imresize(K,3); scale = 0.7; % Scaling the image. J = imresize(refImage, scale); theta = 30.0; % Rotating the image qryImage = imrotate(J,theta); % Query image [refPoints,refDescFeat,qryPoints,qryDescFeat] = featureDetectionAndExtraction(refImage, qryImage);
feature_matching
Функция точки входаThe feature_matching
функция принимает точки и дескрипторы признаков, извлеченные из двух изображений, и находит соответствие между ними.
type feature_matching
function [matchedRefPoints,matchedQryPoints] = feature_matching(refPoints,refDesc,qryPoints,qryDesc) %#codegen % Copyright 2018 The MathWorks, Inc. coder.gpu.kernelfun; %% Feature Matching [indexPairs,matchMetric] = matchFeatures(refDesc, qryDesc); matchedRefPoints = refPoints(indexPairs(:,1),:); matchedQryPoints = qryPoints(indexPairs(:,2),:);
Поскольку пример запускается в хост-системе, создайте объект строения вызова MEX с параметрами по умолчанию. Чтобы избежать ненормального завершения MATLAB, если в сгенерированном коде есть ошибки времени выполнения, выберите опцию safe-build.
cfg = coder.gpuConfig; cfg.GpuConfig.SafeBuild = 1; codegen -config cfg -args {refPoints,refDescFeat,qryPoints,qryDescFeat} feature_matching -o feature_matching_gpu_mex [matchedRefPoints_gpu,matchedQryPoints_gpu] = feature_matching_gpu_mex(refPoints,refDescFeat,qryPoints,qryDescFeat);
Code generation successful.
figure;
showMatchedFeatures(refImage, qryImage, matchedRefPoints_gpu, matchedQryPoints_gpu);
title('Putatively Matched Points (Including Outliers)');
codegen
| coder.checkGpuInstall
| coder.gpu.constantMemory
| coder.gpu.kernel
| coder.gpu.kernelfun
| gpucoder.matrixMatrixKernel
| gpucoder.stencilKernel