Jetson - Nano Opencv の基本的な使用方法

Jetson - Nano Opencv の基本的な使用方法

序文:

前回のJetson Nanoの記事では、学習のためのアイデアや教材を紹介しました。今日は、引き続きJetson NanoでOpenCVを使用する方法についての記事をシェアします。

OpenCV の正式名称は Open Source Computer Vision Library で、クロスプラットフォームのコンピューター ビジョン ライブラリです。 OpenCV は Intel Corporation によって開始され、共同開発され、BSD ライセンスの下でリリースされました。商用および研究分野で無料で使用できます。 OpenCV は、リアルタイム画像処理、コンピューター ビジョン、パターン認識プログラムの開発に使用できます。

視覚処理では、OpenCV の使用が基本的な部分であるため、ボードを使用する過程では、OPECV の使用が最初のハードルとなります。次に、Jetson Nano で OpenCV の Python バージョンと C++ バージョンを使用する手順を紹介します。C++ の使用部分では、それぞれ CMake と Makefile コンパイルの 2 つの方法を紹介します。

oepcv はじめに:

OpenCV の目標は、コンピューター ビジョンの問題を解決するためのツールを提供することです。場合によっては、ライブラリ内の高レベル関数によってコンピューター ビジョンの問題を効果的に解決できます。一度に解決できない問題に遭遇した場合でも、ライブラリ内の基本コンポーネントは、あらゆるコンピューター ビジョンの問題に対処するソリューションのパフォーマンスを強化するのに十分なほど充実しています。

基本機能:

OpenCV の応用分野は非常に広く、画像ステッチ、画像ノイズ除去、製品品質検査、ヒューマン コンピュータ インタラクション、顔認識、動作認識、動作追跡、無人運転などが含まれます。また、機械学習モジュールも提供しており、通常のベイズ、K 近傍法、サポート ベクター マシン、決定木、ランダム フォレスト、人工ニューラル ネットワークなどの機械学習アルゴリズムを使用できます。

注: サンプル コードは他のブロガーの記事を参照しています。

Opencv-python の使用方法:

Opencv-python は比較的簡単に使用できます。cv2 をインポートすると、opencv-python モジュールの機能を使用して必要なアクションを実行できます。以下では、比較的簡単な画像変換デモを紹介します。

opencv-python のインストール

 pip3 インストール opencv - python

サンプルコード:

 「」 「 
カラー画像をグレースケールに変換する


#import はモジュールをインポートします。モジュール内の関数を使用するたびに、それがどのモジュールであるかを指定する必要があります。
#from…import *モジュールをインポートします。モジュール内の関数を使用するたびに、関数を直接使用します。関数がどのモジュールに属しているかは既にわかっていることに注意してください。
from skimage.color import rgb2gray #skimage グラフィックス処理ライブラリ color は色空間変換サブモジュールです pip install scikit - image
numpyをnp としてインポートする
import matplotlib .pyplot as plt #matlab の python ライブラリ pip install matplotlib
from PIL import Image # Python Imaging Library 画像処理ライブラリ pip install pillow
cv2をインポート

# 画像をグレースケール化する

#cv2 メソッド
画像= cv2.imread ( "/home/lyn/Pictures/318c944a7daa47eaa37eaaf8354fe52f.jpeg" )
h , w = img .shape [ : 2 ] #画像の高さと幅を取得します
img_gray = np .zeros ( [ h , w ] , img .dtype ) #現在の画像と同じサイズのシングルチャンネル画像を作成します
i が範囲( h ) 内にある場合:
jが範囲( w ) 内にある場合:
m =画像[ i , j ]
img_gray [ i , j ] = int ( m [ 0 ] * 0.11 + m [ 1 ] * 0.59 + m [ 2 ] * 0.3 ) #BGR座標をグレー座標に変換
印刷( img_gray )
print ( "画像表示グラフ: %s" % img_gray )
cv2.imshow ( "imageshow gray" img_gray )

#plt メソッド
plt .subplot ( 221 ) # は、画像ウィンドウ全体を 2 行 2 列に分割することを意味し現在の位置は 1 です。
img = plt .imread ( "/home/lyn/Pictures/318c944a7daa47eaa37eaaf8354fe52f.jpeg" )
plt .imshow (画像)
print ( "----image lenna -----" )
印刷(画像)

#グレースケール
img_gray = rgb2gray (画像)
plt .subplot ( 222 )
plt .imshow ( img_gray cmap = "gray" )
print ( "-----画像グレー-------" )
印刷( img_gray )

# 二値化
img_binary = np .where ( img_gray >= 0.5 , 1 , 0 )
印刷( "-----imge_binary------" )
印刷( img_binary )
印刷( img_binary .shape )

#plt メソッド
plt .subplot ( 223 )
plt .imshow ( img_binary cmap = 'gray' )
plt .show ( ) 関数

Opencv c++ の使用法:

opencv-c++ をインストールするには、一般的なシステムでは、公式 Web サイト https://opencv.org にアクセスし、対応するパッケージをダウンロードしてから、コンパイルされた opencv ファイルが指定されたディレクトリにインストールされるまで、camke->make->make install を実行する必要があります。

ただし、Jetson Nano イメージ パッケージには opencv4 がプリインストールされており、バージョンは 4.1 以降です。コマンドを使用してクエリを実行したところ、インストールしたイメージのOpenCVバージョンは4.1.1でした。

 jetson@jetson -デスクトップ: / usr / include / opencv4 / opencv2$opencv_version
4.1 .1

C++ で Opencv を開発するには、追加の設定が必要です。まず、opencv ヘッダー ファイルの場所を確認します。

Jetson では、OpenCV のヘッダー ファイルは /usr/include/opencv4/ というディレクトリにあります。このディレクトリは、後でコンパイル リンク ファイルに書き込まれます。

リンクファイルの場所: ls libopencv*

具体的なパスは /usr/lib/aarch64-linux-gnu で、このディレクトリは後でコンパイル リンク ファイルに書き込まれます。

C++ 開発では、通常、パッケージ化とコンパイルに make ツールまたは cmake ツールを使用します。ここでは、opencv を呼び出すための 2 つの C++ ライブラリ、makefle と cmake も紹介します。

メイクファイル

Makefile ファイル共有では、LIBS によってリンクされる opencv の特定のファイルを 1 つずつ書き込む必要があることに注意してください。ここではよく使われるパッケージをいくつか書きましたので、必要に応じて追加できます。

 OBJS = * .o
CFLAGS = -Wall -g -std = c ++ 11
CC = gcc
CPP = g ++
INCLUDES +=- I / usr / include / opencv4 / - I / usr / local / include # コンパイルヘッダーファイルディレクトリ
LIBS += -L / usr / lib / aarch64 - linux - gnu-lopencv_core - lopencv_imgcodecs - lopencv_imgproc - lopencv_highgui - lopencv_objdetect #使用されている特定のライブラリへのリンク

ターゲット: $ { OBJS }
# g ++ -oターゲットboost_thread.o - llua - ldl
@echo "-- start " $ { CC } $ { CFLAGS } $ { OBJS } -o $@ $ { INCLUDES } $ { LIBS }
$ ( CPP ) $ { CFLAGS } $ { OBJS } -o $@ $ { INCLUDES } $ { LIBS }

クリーン
-rm -f * .o core * .coreターゲット

% .o : % .cpp #srcディレクトリ内のすべての.cppファイルを.oファイルにコンパイルします
$ { CPP } $ { CFLAGS } $ { INCLUDES } -c $ <

コード show_img.cpp:

 #include < opencv2 / opencv .hpp >
#include < iostream >
名前空間 std を使用します
名前空間 cv を使用します

int main ( int argc char ** argv ) の
{
std :: cout << "hello opencv" << std :: endl ;

//グレースケール画像表示
Mat src = imread ( "/home/jetson/lyn_work/c++/sp_noise.png" , IMREAD_GRAYSCALE ) ; //読み込まれるデータはマトリックスの形式です。2番目のパラメータはグレースケール画像の表示を表します。
if ( src .empty ( ) )の場合
{
std :: cout << "画像を読み込めませんでした" << endl ; //画像が存在しない場合は、読み取って端末に印刷することはできません。
}
//画像が画面サイズを超えて表示できない場合にこの関数を呼び出します。
namedWindow ( "入力ウィンドウ" , WINDOW_GUI_EXPANDED ) ; //新しいウィンドウを作成します。パラメータ 1 は名前を表し、2 番目のパラメータは空き比率を表します。
imshow ( "入力ウィンドウ" , src ) ; //新しく作成された入力ウィンドウに表示されていることを示します。最初のパラメータはウィンドウ名を示し、src はデータオブジェクト Mat を示します。
waitKey ( 0 ) ; //この文を実行すると、プログラムはブロックされます。パラメータは遅延時間を示します。単位: ミリ秒
destroyAllWindows ( ) ; //以前に作成した表示ウィンドウを破棄する
0を返します
}

コンパイルして実行します:

作る

 。/ターゲット

ここに画像の説明を挿入

メイク

CMakeLists.txt ファイルの内容に対応: cmake コンパイルでは、使用するリンクは OpenCV 動的ライブラリ ファイルに対応しているため、Makefile ファイルのように 1 つずつ追加する必要はありません。cmake はすべての opencv リンク ファイルを追加するのと同じなので、非常に便利です。そこで、後で cmake クラスに追加の例を書きました。

 cmake_minimum_required (バージョン2.8 )

#cmakeプロジェクトを宣言する
プロジェクト( opencv_learn )

# コンパイルモードを設定する
#set ( CMAKE_BUILD_TYPE "デバッグ" )

#OPENCVライブラリを追加
#OpenCVのバージョンを指定します。コードは次のようになります
#find_package ( OpenCV 4.2が必要)
#OpenCVのバージョンを指定する必要がない場合、コードは次のようになります
find_package ( OpenCV 必須)

ディレクトリを含める(
./src/ )


#OpenCV ヘッダーファイルを追加
include_directories ( $ { OpenCV_INCLUDE_DIRS } ) は

#OpenCV_INCLUDE_DIRSの値を表示する
メッセージ( $ { OpenCV_INCLUDE_DIRS } )

ファイル( GLOB_RECURSE TEST_SRC
#ソース/*.cpp
#src/* .c
${CMAKE_SOURCE_DIR}/* .cpp
${CMAKE_SOURCE_DIR}/* .cp


# 実行可能プログラムを追加する
# 構文: add_executable(プログラム名 ソースコード ファイル)
add_executable(ターゲット show_img.cpp ${TEST_SRC})

# ライブラリファイルを実行可能プログラムにリンクする
target_link_libraries(ターゲット ${OpenCV_LIBS})

cmake コンパイルを実行します:

 mkdir ビルド
.. のcmakeを実行します。
作る

demo1: make の例と同じ show_img.cpp コード ファイルを使用します。上記の内容を参照してください。

 。/ターゲット

demo2: C++ を使用して CSI カメラを読み取ります。ビデオ ストリーム イメージは正常に表示できますが、vnc 接続のため色が少し歪んでいることがわかります。CMakeLists.txt に次の 2 行を追加します。

 add_executable ( open_csi open_csi .cpp $ { TEST_SRC } )

ターゲットリンクライブラリ( open_csi$ { OpenCV_LIBS } )

open_csi.cpp コード ファイルは次のとおりです。

 #include < iostream >
#include <文字列>
#include < opencv4 / opencv2 / opencv .hpp >
#include < opencv4 / opencv2 / core .hpp >
#include < opencv4 / opencv2 / highgui .hpp >
#include < opencv4 / opencv2 / imgproc .hpp >
#include < opencv4 / opencv2 / objdetect.hpp >
#include < opencv4 / opencv2 / imgproc / types_c.h >
#include < opencv4 / opencv2 / videoio .hpp >

名前空間 std を使用します
名前空間 cv を使用します

文字列 gstreamer_pipeline ( intキャプチャ幅 intキャプチャ高さ intディスプレイ幅 intディスプレイ高さ intフレームレート int反転方法)
{
"nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)" + to_string ( capture_width ) + ", height=(int)"を返します+
to_string (キャプチャー高さ) + ", format=(文字列)NV12, framerate=(小数点)" + to_string (フレームレート) +
"/1 ! nvvidconv flip-method=" + to_string ( flip_method ) + " ! video/x-raw, width=(int)" + to_string ( display_width ) + ", height=(int)" +
to_string ( display_height ) + ", format=(文字列)BGRx ! videoconvert ! video/x-raw, format=(文字列)BGR ! appsink" ;
}

int main ( int argc char ** argv ) の
{
キャプチャ= 1280 ;
キャプチャ高さ= 720 ;
ディスプレイの幅= 1280 ;
ディスプレイ720 にする
フレームレート= 60 ;
int flip_method = 0 ;

//パイプラインを作成する
文字列パイプライン= gstreamer_pipeline (キャプチャ幅,
キャプチャ高さ
表示幅
ディスプレイの高さ
フレームレート
反転メソッド) ;
std :: cout << "gstreamer パイプラインを使用しています: \n\t" << pipeline << "\n" ;

//パイプラインをビデオストリームにバインドする
ビデオキャプチャキャップ(パイプライン CAP_GSTREAMER ) ;
if ( ! cap .isOpened ( ) )
{
std :: cout << "カメラを開けませんでした。" << std :: endl ;
-1 返します
}

//表示ウィンドウを作成する
namedWindow ( "CSI カメラ" WINDOW_AUTOSIZE ) ;
マット画像;

//フレームごとに表示
の間
{
if ( ! cap .read ( img ) )
{
std :: cout << "キャプチャに失敗しました" << std :: endl ;
壊す;
}
int new_width new_height 高さチャンネル;
= img .cols ;
高さ= img .rows ;
チャンネル= img .channels ( ) ;


//画像サイズを調整する
新しい幅= 640 ;
800 の場合
{
new_height = int ( new_width * 1.0 /*高さ) ;
}
resize ( img , img , cv :: Size ( new_width , new_height ) ) ;

imshow ( "CSIカメラ" img ) ;

int keycode = cv :: waitKey ( 30 ) & 0xff ; // ESCキーで終了
if (キーコード== 27 ) break ;
}

キャップ.release ( ) ;
すべてのウィンドウを破棄します( ) ;
}

表示効果はスクリーンショットのとおりです。

結論

これは、Jetson Nano で OpenCV を使用する基本についての私の共有です。後で、顔認識、オブジェクト認識、ジェスチャ認識など、OpenCV に基づくさらに興味深いプロジェクトをいくつか実行できます。より良いアイデアやニーズがある場合は、ぜひ私を友達として追加して、コミュニケーションや共有を行ってください。

著者: 良心は依然として存在し、昼間は懸命に働き、夜は公開アカウントの原作者です。公式アカウントの内容には、テクノロジー以外にも、人生に関する洞察も盛り込まれています。真剣にコンテンツをアウトプットする職場のベテランであると同時に、写真、音楽、バスケットボールなど、テクノロジーの枠を超えて人生を豊かにする人でもあります。私について来て、私と一緒に歩いてください。


<<:  人工知能が伝統文化に新たな命を吹き込む。パンダ型ロボット「Youyou」が国境を越えて「新年クロストーク会議」に参加

>>:  自動運転車は生後7か月の赤ちゃんよりも賢いのでしょうか?

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

新しいドローン産業は急速に発展しているが、まだ3つの大きな障害を取り除く必要がある。

我が国の戦略的新興産業の一つであるドローンは近年急速に発展し、技術、製品、応用、市場において満足のい...

科学者:大規模なAIモデルは小さなAIツールを自動的に生成できる

12月18日、Businessinsiderによると、大規模なAIモデルは現在、人間の介入なしに完全...

...

李開復氏:若者は人工知能に取って代わられない仕事を探すべきだ

AlphaGo が囲碁のゲームを解読した日、人類は自分たちの仕事が AI に置き換えられるのではない...

実践に最適なオープンソース機械学習プロジェクト 30 件をすぐに集めましょう。

「この記事は素晴らしいです! 実用的なプロジェクトがたくさん含まれており、機械学習を学び始めたばか...

トポロジカルデータ分析(TDA)は、人工知能のブラックボックスを破ると期待される魔法のアルゴリズムです。

本稿では、トポロジカルデータ分析 (TDA) の基本原理を紹介し、事例を示し、この方法が視覚分析を効...

ディープラーニング入門

2016年、Googleの人工知能プログラムAlphaGoが世界的囲碁プレイヤーのイ・セドルと対戦し...

モノのインターネットにおける機械学習の役割は何ですか?

ビッグデータや人工知能などのテクノロジーがもたらす機会と脅威、そしてその将来に対する懸念については、...

Java プログラミング スキル - データ構造とアルゴリズム「ツリー」

[[388287]]なぜツリー構造が必要なのでしょうか? 1. 配列格納方法の分析:利点: 下付き...

...

...

DeepMind: 人工知能と神経科学を組み合わせて好循環を実現

最近の人工知能の進歩は目覚ましいものがあります。人工システムは、アタリのビデオゲーム、古代のボードゲ...

このAI企業はマスクを使って中国の顔認識システムを破る! WeChat、Alipay、鉄道駅もすべて影響を受けた

海外メディアの報道によると、人工知能企業Kneronは特製の3Dマスクを使い、AlipayやWeCh...