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を参照してください。
開発用ホスト要件
CUDA コード生成用の GPU Coder。チュートリアルについては、GPU Coder 入門を参照してください。
ホスト上の NVIDIA CUDA Toolkit。
コンパイラおよびライブラリの環境変数。詳細については、サードパーティ ハードウェアと前提条件となる製品の設定を参照してください。
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 AGX Xavier Developer Kit CUDA Version : 11.4 cuDNN Version : 8.4 TensorRT Version : 8.4 GStreamer Version : 1.16.3 V4L2 Version : 1.18.0-2build1 SDL Version : 1.2 OpenCV Version : 4.5.4 Available Webcams : Logitech Webcam C925e Available GPUs : Xavier Available Digital Pins : 7 11 12 13 15 16 18 19 21 22 23 24 26 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 _______________________ _____________ _____________________ _____________ "Logitech Webcam C925e" "/dev/video2" "(<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
は、カメラ センサーがサポートする最適な解像度をリストします。イメージ取得パイプラインはこれらの解像度で効率的に動作します。アルゴリズムの要件に基づいて、サポートされている任意の解像度を選択できます。
この例では、リストの最初のカメラと 1280×720 ピクセルの解像度を使用します。
camName = table2array(camlist(1,"Camera Name"));
camResolution = [1280,720];
カメラ オブジェクトの作成
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:10 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を参照してください。