Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

NVIDIA Jetson Nano での Raspberry Pi Camera Module V2 を使用したソーベル エッジ検出

この例では、NVIDIA® Jetson™ Nano に接続された Raspberry Pi Camera Module V2 からのイメージをキャプチャして処理する方法を示します。MATLAB® Coder™ Support Package for NVIDIA Jetson and NVIDIA DRIVE Platforms を使用すると、Camera Module V2 からのイメージをキャプチャして MATLAB 環境に持ち込んで処理することができます。この例では、この機能を使用してソーベル エッジ検出アルゴリズムを開発する方法を学習します。

必要条件

ターゲット ボード要件

  • NVIDIA Jetson Nano 組み込みプラットフォーム。

  • ターゲットの CSI ホスト端子に接続された Raspberry Pi Camera Module V2。

  • ターゲット ボードとホスト PC を接続するイーサネット クロスオーバー ケーブル (ターゲット ボードをローカル ネットワークに接続できない場合)。

  • ボードにインストールされている NVIDIA CUDA Toolkit。

  • ボード上の V4L2 ライブラリと SDL (v1.2) ライブラリ。

  • ボード上の GStreamer ライブラリ。

  • コンパイラおよびライブラリ用のターゲット上の環境変数。詳細については、Install and Setup Prerequisites for NVIDIA Boardsを参照してください。

開発用ホスト要件

NVIDIA Jetson Nano への接続

このサポート パッケージは、生成された CUDA コードを Jetson Nano プラットフォームでビルドおよび実行している間、TCP/IP による SSH 接続を使用してコマンドを実行します。ターゲット プラットフォームをホスト コンピューターと同じネットワークに接続するか、イーサネット クロス ケーブルを使用してボードをホスト コンピューターに直接接続します。ボードを設定して構成する方法については、NVIDIA のドキュメントを参照してください。"Jetson オブジェクトの作成" NVIDIA ハードウェアと通信するには、関数jetsonを使用してライブ ハードウェア接続オブジェクトを作成します。

hwobj = jetson('jetson-nano-name','ubuntu','ubuntu');

ターゲット ボードに初めて接続するときは、ターゲット ボードのホスト名 (または IP アドレス)、ユーザー名、およびパスワードを提供しなければなりません。以降の接続では、アドレス、ユーザー名、パスワードを入力する必要はありません。ハードウェア オブジェクトは、最近 NVIDIA ボードに正常に接続されたときの設定を再利用します。

既定で、この例では、最近 NVIDIA Jetson ボードに正常に接続されたときの設定を再利用します。

hwobj = jetson;
Checking for CUDA availability on the Target...
Checking for 'nvcc' in the target system path...
Checking for cuDNN library availability on the Target...
Checking for TensorRT library availability on the Target...
Checking for prerequisite libraries is complete.
Gathering hardware details...
Checking for third-party library availability on the Target...
Gathering hardware details is complete.
 Board name              : NVIDIA Jetson TX2 Developer Kit
 CUDA Version            : 10.2
 cuDNN Version           : 8.2
 TensorRT Version        : 8.2
 GStreamer Version       : 1.14.5
 V4L2 Version            : 1.14.2-1
 SDL Version             : 1.2
 OpenCV Version          : 4.1.1
 Available Webcams       : Logitech Webcam C925e
 Available GPUs          : NVIDIA Tegra X2
 Available Digital Pins  : 7  11  12  13  15  16  18  19  21  22  23  24  29  31  32  33  35  36  37  38  40

ハードウェア ライブ オブジェクトの作成時、サポート パッケージはハードウェアとソフトウェアのチェックを実行し、ターゲット ボードに MATLAB IO サーバーをインストールし、ターゲットに接続されている周辺デバイスの情報を収集します。この情報はコマンド ウィンドウに表示されます。接続に失敗した場合は、MATLAB コマンド ラインで診断エラー メッセージが報告されます。接続が失敗した場合に最も可能性が高い原因は、IP アドレスまたはホスト名が誤っていることです。

カメラへの接続

利用可能なカメラのリスト hwobj オブジェクトの関数 getCameraList を実行して、利用可能なカメラを見つけます。この関数が空の table を出力する場合は、カメラを再接続して、関数を再度実行してください。

camlist = getCameraList(hwobj);
           Camera Name            Video Device                                                                                                                                                   Available Resolutions                                                                                                                                                   Pixel Formats
    __________________________    _____________    __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________    _____________

    "vi-output, ov5693 2-0036"    "/dev/video0"    "[1280   720],[2592  1458],[2592  1944]"                                                                                                                                                                                                                                                                               "BG10"      
    "Logitech Webcam C925e"       "/dev/video1"    "(<a href="matlab:disp('Resolutions: [0     0],[160    90],[160   120],[176   144],[320   180],[320   240],[352   288],[432   240],[640   360],[640   480],[800   448],[800   600],[864   480],[960   720],[1024   576],[1280   720],[1600   896],[1920  1080],[2304  1296],[2304  1536]')">View resolutions</a>)"     "YUYV,MJPG" 

関数 getCameraList は、カメラ センサーがサポートする最適な解像度をリストします。イメージ取得パイプラインはこれらの解像度で効率的に動作します。アルゴリズムの要件に基づいて、サポートされている任意の解像度を選択できます。

この例では、リストの最初のカメラとサポートされている最初の解像度を使用します。

camName = table2array(camlist(1,"Camera Name"));
resolutions = table2array(camlist(1,"Available Resolutions"));
resolutions = split(resolutions,",");
camResolution = [str2num(resolutions(1))];

"カメラ オブジェクトの作成" jetson オブジェクトの camera メソッドを使用して、カメラ オブジェクトを作成します。

camObj = camera(hwobj,camName,camResolution);

camObj はカメラ オブジェクトへのハンドルです。Camera Module V2 からキャプチャされたイメージを MATLAB で表示するには、次のコマンドを使用します。

for i = 1:5
    img = snapshot(camObj);
    imshow(img);
    drawnow;
end

このカメラ オブジェクトは RGB および 3 チャネルのグレースケール イメージをキャプチャします。

表示オブジェクトの作成

表示オブジェクトを作成するには、関数 imageDisplay を使用します。このオブジェクトは、関数 imshow を使用して MATLAB でイメージを表示する System object です。

img = snapshot(camObj);
reshapedImg = cat(3, img(:,:,1).',img(:,:,2)',img(:,:,3)');
dispObj = imageDisplay(hwobj);
image(dispObj,reshapedImg);
delete(dispObj);

ソーベル エッジ検出アルゴリズム

ソーベル エッジ検出アルゴリズムは、グレースケール イメージでの 2 次元空間勾配演算です。この演算は、エッジに相当するイメージの空間周波数の高い領域を強調します。

勾配の計算

それぞれのソーベル カーネルを使用して、入力イメージの水平方向の勾配 (h) と垂直方向の勾配 (v) を求めます。これら 2 つのソーベル カーネルは、互いに直交しています。カメラからのライブ イメージ データを処理する前に、サンプル イメージに対してアルゴリズムをテストします。

kern = [1 2 1; 0 0 0; -1 -2 -1];
img = imread('peppers.png');
imshow(img);
h = conv2(img(:,:,2),kern,'same');
v = conv2(img(:,:,2),kern','same');

勾配の大きさの計算

水平方向の勾配および垂直方向の勾配 (h および v) から勾配の大きさを求めます。

e = sqrt(h.*h + v.*v);

エッジ イメージのしきい値処理

イメージをしきい値処理して、エッジになっているイメージの領域を求めます。

edgeImg = uint8((e > 100) * 240);
imshow(edgeImg);

ソーベル エッジ検出アルゴリズムのライブ データでの実行

この例の前のセクションで構築した MATLAB コードから MATLAB エントリポイント関数 sobelEdgeDetectionAlg.m を作成します。

type('sobelEdgeDetectionAlg.m')
function edgeImg = sobelEdgeDetectionAlg(img,thresh)  %#codegen
%sobelEdgeDetection Example MATLAB function for edge detection.
% Copyright 2018 The MathWorks, Inc.

kern = half([1 2 1; 0 0 0; -1 -2 -1]);

% Finding horizontal and vertical gradients.
h = conv2(img(:,:,2),kern,'same');
v = conv2(img(:,:,2),kern','same');

% Finding magnitude of the gradients.
e = sqrt(h.*h + v.*v);

% Threshold the edges
edgeImg = uint8((e > thresh) * 240);

end

関数 sobelEdgeDetectionAlg は、エッジ検出用のイメージとしきい値の入力を受け取り、エッジ検出アルゴリズムの結果を返します。ループの内側からキャプチャされたイメージに対してこの関数を呼び出します。しきい値変数 thresh は、適切なエッジ イメージを取得するように変更できます。このようにして、サポート パッケージのカメラ アクセス機能を使用して、指定されたカメラに適したアルゴリズムを調整することができます。

dispObj = imageDisplay(hwobj);
for i = 1:100
    img = snapshot(camObj);
    thresh = 60;
    edgeImage = sobelEdgeDetectionAlg(img, thresh);
    reshapedImg = edgeImage';
    image(dispObj,reshapedImg);
end

この例をスタンドアロン アプリケーションとしてターゲット ボードに展開するには、Deploy and Run Sobel Edge Detection with I/O on NVIDIA Jetson Nanoを参照してください。

Copyright 2018-2023 The MathWorks, Inc.

参考

オブジェクト

関連するトピック