Обнаружение маршрута на графическом процессоре с помощью houghlines

В этом примере показано, как сгенерировать CUDA® MEX для функции MATLAB®, которая может обнаружить и вывести контуры маркера маршрута на изображении. Пример берет изображение RGB, как введено и использует rgb2gray, ordfilt2, hough, houghpeaks, и функции houghlines, которые являются частью Image Processing Toolbox™, чтобы произвести маршрут, обнаружил выходное изображение.

Предпосылки

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

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

  • Image Processing Toolbox

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

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

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

gpucoderdemo_setup('gpucoderdemo_lane_detection_houghlines');

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

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

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

О lane_detection_houghlines Функция

Функция lane_detection_houghlines.m берет изображение интенсивности, как введено и возвращается, маршрут обнаружил изображение.

type lane_detection_houghlines
function [lines] = lane_detection_houghlines(inputImage)%#codegen
%  Copyright 2019 The MathWorks, Inc.
coder.gpu.kernelfun;

% Convert RGB image to gray-scale image.
if size(inputImage,3)==3
    grayImage = rgb2gray(inputImage);
else
    grayImage = inputImage;
end

% Edge detection using ordfilt2
input = grayImage(240:end,1:end);
dom = ones(2);
minOrder = 1;
maxOrder = 4;
padopt = 'zeros';

MinImg = ordfilt2(input,minOrder,dom,padopt);
MaxImg = ordfilt2(input,maxOrder,dom,padopt);

% Edge detected output
outImage = MaxImg - MinImg;
BW = imbinarize(outImage);

[H,T,R] = hough(BW);
P  = houghpeaks(H,20,'threshold',1);
lines = houghlines(BW,T,R,P,'FillGap',200,'MinLength',150);

Сгенерируйте MEX CUDA для lane_detection_houghlines Функция

Сгенерировать MEX CUDA для lane_detection_houghlines функционируйте, создайте настройку графического процессора кода, возражают и используют codegen функция.

inputImage = imread('highway.png');
inputResizedImage = imresize(inputImage,[480 640]);
cfg = coder.gpuConfig('mex');
codegen -args {inputResizedImage} -config cfg lane_detection_houghlines -o lane_detection_houghlines_gpu_mex

Запустите сгенерированный MEX CUDA

Запуститесь сгенерированные lane_detection_houghlines_mex с входом отображают и строят вход, и маршрут обнаружил изображения.

[lines] = lane_detection_houghlines_gpu_mex(inputResizedImage);

% Plot images
inputImageVGAsize = imresize(inputImage,[480 640]);
outputImage = imresize(inputImage,[480 640]);
p1  = subplot(1, 2, 1);
p2 = subplot(1, 2, 2);
imshow(inputImageVGAsize, 'Parent', p1);
imshow(outputImage, 'Parent', p2);hold on
max_len = 0;
for k = 1:length(lines)
    if ((lines(k).theta <= 60 && lines(k).theta >10)||(lines(k).theta <= -10 && lines(k).theta > -50) )
        xy = [lines(k).point1; (lines(k).point2)];
        plot(xy(:,1),xy(:,2)+240,'LineWidth',2,'Color','green');

        % Plot beginning and end of lines
        plot(xy(1,1),xy(1,2)+240,'x','LineWidth',2,'Color','yellow');
        plot(xy(2,1),xy(2,2)+240,'x','LineWidth',2,'Color','red');

        % Determine the endpoints of the longest line segment
        len = norm(lines(k).point1 - lines(k).point2);
        if ( len > max_len)
            max_len = len;
            xy_long = xy;
        end
    end
end
title(p1, 'Input Image');
title(p2, 'Lane Detected Output Image');

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

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

cleanup