Покажите соответствие

В этом примере показано, как сгенерировать CUDA® MEX из кода MATLAB® и выполнить функцию, соответствующую между двумя изображениями. Этот пример использует matchFeatures функция от Image Processing Toolbox™, чтобы совпадать с дескрипторами функции между двумя изображениями, которые вращаются и масштабируются друг относительно друга. Дескрипторы функции двух изображений обнаружены и извлечены при помощи алгоритма Ускоренных устойчивых функций (SURF). См. документацию GPU Coder™ для полного списка поддерживаемых функций.

Предпосылки

  • CUDA включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.

  • NVIDIA инструментарий CUDA и драйвер.

  • Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Переменные окружения.

  • Computer Vision Toolbox™ для видео средства чтения и средства просмотра используется в примере.

  • Image Processing Toolbox для чтения и отображения изображений.

  • Этот пример поддерживается только на платформе Linux®.

Создайте папку и скопируйте соответствующие файлы

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

gpucoderdemo_setup('gpucoderdemo_feature_matching');

Проверьте среду графического процессора

Используйте coder.checkGpuInstall, функционируют и проверяют, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Обнаружение и выделение признаков

В данном примере покажите соответствие, выполняется на двух изображениях, которые вращаются и масштабируются друг относительно друга. Прежде чем два изображения могут быть соответствующими, характерные точки для каждого изображения должны быть обнаружены и извлечены. Следующая функция featureDetectionAndExtraction использует SURF (detectSURFFeatures) локальный анализатор, чтобы обнаружить характерные точки и extractFeatures извлекать функции.

% The function |featureDetectionAndExtraction| returns |refPoints|, which
% contains the feature coordinates of the reference image, |qryPoints|,
% containing feature coordinates of query image, |refDesc| matrix
% containing reference image feature descriptors and |qryDesc| matrix
% containing query image feature descriptors.

% refPoints = Reference image feature coordinates.
% qryPoints = Query image feature coordinates.
% refDescFeat = Reference image feature descriptors
% qryDescFeat = Query image feature descriptors

% 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'

Функция 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),:);

Покажите соответствие с Codegen

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

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);

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

% Display feature matches
figure;
showMatchedFeatures(refImage, qryImage, matchedRefPoints_gpu, matchedQryPoints_gpu);
title('Putatively matched points (including outliers)');

Команда выполнения: Очистка

Удалите временные файлы и возвратитесь к исходной папке

cleanup