画像検出に Raspberry Pi を使用したことのあるすべての道士は、初心者の頃にこのような問題を経験したことがあると思います。opencv-python のプリコンパイル済みパッケージをインストールするときに、いくつかのコードと組み合わせた場合、コードのリアルタイム効果が良くない場合があります。外部制御アクション Python の構文は、コードを記述するのにあまり適していない場合があります。組み込み C プログラミングに慣れた後でも、制御関連のコードを書くには C または C++ を好むのですが、C++ の利点を組み合わせて CMake を使用して Opencv の C++ クロスプラットフォーム プログラムを開発できないのはなぜでしょうか?
コンピューター側で cmake 開発を使用する場合は、別のブログVS2019+CMakeを参照してください。
C++ を使用して関連プログラムを開発すると、私の現在の経験に関する限り、コードの実行速度はあまり明らかではありませんが、Python と比較すると次の利点があります。 1. マルチスレッドおよびマルチプロセス開発がより高速です。効率的;
2.
データ処理がより洗練され、関連する制御部分のコード記述を検討しやすくなる
3. 複数のプログラムソースファイルの処理や参照がより便利になる
4. CMake を使用してクロスプラットフォームの開発が
可能
1. プログラムの文法要件が高く、エラーが発生しやすい2.外部パッケージ管理があまり便利ではなく、データ処理
用の一部のサードパーティ ライブラリは Python ほど豊富ではありません
。「黒猫は白猫、ネズミを捕まえられる猫は良い猫」という真実を信じて、ニーズと問題をより良く解決できる限り、もちろん開発方法は便利であればあるほど良いです。 。*
opencvをインストールする
まず、ターゲット プラットフォームに opencv をインストールする必要がありますが、ソース コードのコンパイルを通じてインストールする必要があることに注意してください。Python のプリコンパイル済みパッケージを使用する代わりに。
Jetson nano プラットフォームのインストール方法については、私の他のブログを参照してください。Raspberry Pi 用の Jetson nano のソース コードから opencv をコンパイルしてインストールする
場合、ソース コードから opencv をインストールする方法に関するチュートリアルが多すぎます。インターネット上で紹介されているので繰り返しません。
コンパイル後、CMake がデバイスにインストールされていることを確認してから、独自のプロジェクト テンプレートの作成を開始します。
レンプレート
ディレクトリ構造
まず、以下のようなディレクトリ構造を作成し、main.cpp
メイン関数を記述するファイルと、\src
独自のヘッダファイルやライブラリプログラムを格納するディレクトリを作成します。
├── build
├── CMakeLists.txt
├── main.cpp
└── src
├── CMakeLists.txt
├── Test1.cpp
└── Test1.h
さらに、Readme ファイル、関連する手順を保存するための doc フォルダー、およびプログラムを迅速に起動するための .sh ファイルを追加することもできます。これらはここでは必要ありません。必要に応じて自分で追加できます。
外側の CMakeLists.txt
このファイルは、導入する外部ライブラリ、プロジェクト名の定義、コンパイルの検索パスなど、変更されたプロジェクトの主な内容を定義します。
内容は以下の通りです。
CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
PROJECT( main )
#INCLUDE_DIRECTORIES(/usr/local/include/opencv4/opencv2) #添加头文件搜索路径
FIND_PACKAGE(OpenCV REQUIRED)
MESSAGE(STATUS "OpenCV library status:")
MESSAGE(STATUS " version: ${OpenCV_VERSION}")
MESSAGE(STATUS " libraries: ${OpenCV_LIBS}")
MESSAGE(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
ADD_SUBDIRECTORY( src bin )
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
TARGET_LINK_LIBRARIES(main Test)
TARGET_LINK_LIBRARIES(main ${OpenCV_LIBS})
CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
: コンパイル時に CMake の最小バージョン要件を指定します。このバージョンより低い場合、エラーが報告されます。
PROJECT( main )
: 定義プロジェクトのプロジェクト名は「main」です。
FIND_PACKAGE(OpenCV REQUIRED)
: opencv のパッケージのインストール パスを見つけて、次の 4 つのメッセージを表示しますopencv の関連情報を出力します: バージョン、インストール ライブラリとインストール パス
ADD_SUBDIRECTORY( src )
: ファイル検索パスに src パスを追加します。このコマンドは、ソース ファイルを保存するためのサブディレクトリを現在のプロジェクトに追加するために使用され、場所を指定できます。ここで、中間バイナリとターゲット バイナリは bin パスとして保存されます。 現在の
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ディレクトリを追加します。 main.cpp を変数 DIR_SRCS に
ADD_EXECUTABLE(main ${DIR_SRCS})
割り当てます。 DIR_SRCS 変数で表されるファイルをコンパイルして、「main」という名前の実行可能ファイルを生成します。「main」であることに注意してください。ここは上記のプロジェクト名とは関係ありません: Test ライブラリを
TARGET_LINK_LIBRARIES(main Test)
'main' に Executable にリンクします
TARGET_LINK_LIBRARIES(main ${OpenCV_LIBS})
: OpenCV_LIBS のライブラリを mian 実行可能ファイルにリンクします
メイン関数ファイル main.cpp
まず、opencv ライブラリと書き込みたいヘッダー ファイルを引用します。
#include "src/Test1.h"
#include <opencv2/opencv.hpp>
main 関数で画像を読み取ってみることができます。
cv::Mat image = cv::imread("/home/CV2/opencvlogo.jpg"); //j图片路径和图片名修改为自己的
if(image.empty())
{
std::cout << "conld not load image..." << std::endl ;
return -1;
}
cv::imshow("test_opencv_setup", image);
同時に、作成したライブラリにクラス A を定義し、A はメソッド f を定義しました。これを main 関数で参照するため、完全な main.cpp ファイルは次のようになります。
#include "src/Test1.h"
#include <opencv2/opencv.hpp>
int main()
{
A a;
a.f();
std::cout << "Hello World" << std::endl;
cv::Mat image = cv::imread("/home/wuito/CVProjece/CV2/opencvlogo.jpg");
if(image.empty())
{
std::cout << "conld not load image..." << std::endl ;
return -1;
}
cv::imshow("test_opencv_setup", image);
cv::waitKey(0);
return 0;
}
内部 CMakeLists.txt
src フォルダー内の CMakeLists.txt の主な機能は、このフォルダー内のプログラムがメイン プログラムが呼び出すためのライブラリにコンパイルされることを説明することです。
AUX_SOURCE_DIRECTORY(. DIR_TEST_SRC)
ADD_LIBRARY(Test STATIC ${DIR_TEST_SRC})
src フォルダーにはファイルがほとんどないため、2 行の定義のみを使用します
AUX_SOURCE_DIRECTORY(. DIR_TEST_SRC)
。 このディレクトリーにある .cpp および .h ファイルを変数 DIR_TEST_SRC に追加します
ADD_LIBRARY(Test STATIC ${DIR_TEST_SRC})
。 このコマンドは、DIR_TEST_SRC が指すファイルを Test The static という名前のファイルにコンパイルします。ライブラリファイル。
内部ライブラリファイル
1 つ目は、メソッド A とそのプライベート関数 f() および変数 i を宣言するヘッダー ファイル Test1.h を定義することです。
#ifndef TEST1_H_
#define TEST1_H_
#include<iostream>
class A
{
public:
int i;
void f();
};
#endif
次に、関数 f を定義する、対応する Test1.cpp ファイルがあります。
#include"Test1.h"
void A::f()
{
i = 10;
std::cout << i << std::endl;
}
次に、作成した質問価格build
の下でターミナルを開き、CMake ..
プロジェクトを初期化してメイクファイルを作成するために入力します。次に、make を実行してコンパイルとリンクを行います。最後に、出力フォルダー bin の下にある実行可能ファイル main を見つけて実行し、./main
先ほどのプログラムを実行します。