Main Content

関数 houghlines を使用した GPU での車線検出

この例では、イメージの車線マーカー境界を検出して出力する MATLAB® 関数の CUDA® MEX を生成する方法を説明します。この例では、RGB イメージを入力として受け取り、Image Processing Toolbox™ に用意されている関数ordfilt2 (Image Processing Toolbox)hough (Image Processing Toolbox)houghpeaks (Image Processing Toolbox)、およびhoughlines (Image Processing Toolbox)を使用して、車線検出後の出力イメージを生成します。

サードパーティの必要条件

必須

この例では、CUDA MEX を生成します。以下のサードパーティ要件が適用されます。

  • CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。

オプション

スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。

GPU 環境の検証

この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数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-2021 The MathWorks, Inc.
coder.gpu.kernelfun;

% Convert RGB image to grayscale image.
grayImage = im2gray(inputImage);

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

関数 lane_detection_houghlines の CUDA MEX の生成

GPU コード構成オブジェクトを作成し、関数 codegen を実行します。

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

生成された CUDA MEX の実行

生成された lane_detection_houghlines_mex を入力イメージを指定して実行し、入力イメージと車線検出後のイメージをプロットします。

[lines] = lane_detection_houghlines_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');

参考

関数

オブジェクト

関連するトピック