関数 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 以外のビルドについて、この例では以下の要件も適用されます。
NVIDIA Toolkit。
コンパイラおよびライブラリの環境変数。詳細については、サードパーティ ハードウェアと前提条件となる製品の設定を参照してください。
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');
参考
関数
codegen
|coder.gpu.kernel
|coder.gpu.kernelfun
|gpucoder.matrixMatrixKernel
|coder.gpu.constantMemory
|gpucoder.stencilKernel
|coder.checkGpuInstall