1. バージョンの説明:
opencv - 4.2.0 (opencv4.5.4 バージョンはクロスコンパイル時にエラーを報告します)
Ubuntu - 20.04 64 ビット
gcc バージョン4.9.4 (Linaro GCC 4.9-2017.01)
アームボード: imx6ull、Cortex - A7
カーネル マウント: nfs+SecureCRT
2. 環境の準備:
1) クロスコンパイラのインストール:
1. ダウンロード
https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/
2. パスを選択します
ご使用の Ubuntu に応じてダウンロードします。ダウンロード後、インストールするパスにコピーします。移動する必要はありません。
完了したら、次のコマンドを使用して解凍します。
3.解凍する
sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
4. 環境変数を変更する
解凍後、環境変数を変更し、次のコマンドを使用します。
sudo vi /etc/profile
このファイルを開いた後、最後に次のように入力します。
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
このうち、usr/local/arm/
は前の記事で設定したモバイル インストール用のパスであり、状況に応じて変更する必要があります。
5. インストールの確認
変更後、保存して終了し、Ubuntu システムを再起動すると、クロスコンパイル ツールが正常にインストールされます。
コマンドを入力してインストールを確認します。
arm-linux-gnueabihf-gcc -v
インストールが成功すると、次のように表示されます。
gcc version 4.9.4 (Linaro GCC 4.9-2017.01)
2) cmake-gui をインストールします。
注文:
sudo apt-get install cmake-gui #安装cmake-gui
3) opencv ソースコードをダウンロードします。
住所:
https://codeload.github.com/opencv/opencv/zip/refs/tags/4.2.0
解凍:
unzip opencv-4.2.0
コンパイルされたファイルを保存するフォルダーを作成します。
mkdir opencv/build
インストールしたopencvを保存するフォルダーを作成します。
mkdir opencv/opencv_install
3. コンパイルしてインストールします。
1) cmake-gui インターフェイスを開きます
sudo cmake-gui
1.中にopencvのインストールパスを記入します。
2. コンパイルされたファイルを保存するために作成したフォルダーのパスを入力します。
3. 「設定」をクリックします。
[Unix Makefiles] で、実際のテストに効果的な 3 番目の Makefile を選択します。
2) 対応するプラットフォームを選択します
/XXX/opencv-4.2.0/platforms/linux/xxx.cmake
自分の道と自分のアームボードを一致させるように注意してください
私のアームボードは imx6ull、cortex-A7 なので、これを選択すると、自分のボードに応じて以下の対応するオプションを選択できます
をクリックします Finish
その後、次のインターフェイスが表示されます。
3) 設定を続行します
詳細を確認します。
検索で BUILD_JPEG
、BUILD_PNG
を検索し、それぞれを確認します
検索CMAKE_BUILD_TYPE
、値を入力Release
;
インストールを検索、「<」 a i =4>" インストールした opencv を保存するために作成したフォルダーに入力しますCMAKE_INSTALL_PREFIX
検索CMAKE_EXE_LINKER_FLAGS
値を入力-pthread -ldl -lrt
;
クリックConfigure
、赤なしエラーがないことを意味します。
クリックGenerate
して cmake-gui を閉じます
4) 最後のステップ
設定が完了したら、急いで make を使用してコンパイルしないでください。
ファイル /XXX/opencv4.2.0/3rdparty/protobuf/src/google/protobuf/ の下に追加します。 stubs/common.cc #define HAVE_PTHREAD
マクロ定義。
コンパイル済みファイルを保存するために作成したフォルダーに戻ります: build
5) コンパイル:
コマンドを使用します:make -j4
コンパイルが成功したことがわかります。
6) 取り付け:
make install
インストール成功
4. 構成環境
この手順は、OpenCV の通常のインストールと似ています。
1) まず、システムが見つけられるように、OpenCV-arm ライブラリをパスに追加します。
sudo gedit /etc/ld.so.conf.d/opencv-arm.conf
このコマンドを実行すると空のファイルが開かれることがありますが、気にせず次のように記述してください。
/home/wcs/Downloads/opencv-4.2.0/opencv_install/lib
パスは独自のパスに対応する必要があります。そうでない場合はエラーが報告されます
パスは以下に示す lib ライブラリです
2) 先ほどの構成パスを有効にします。
次のコマンドを実行します。
sudo ldconfig
3) bash を設定します。
sudo gedit /etc/bash.bashrc
ファイルの後に追加します:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/wcs/Downloads/opencv-4.2.0/opencv_install/lib/pkgconfig
4) 次のコマンドを実行して、今の設定を有効にします。
source /etc/bash.bashrc
5) pkgconfig ファイルをコピーします。
PKGCONFIG 項目はコンパイル中に構成されましたが、最終的にインストールされたときは lib ディレクトリにありませんでした。以前に Ubuntu にインストールされた OpenCv ライブラリ (非クロスコンパイル) ディレクトリに lib/pkgconfig フォルダをコピーします。 インストール場所: /home/wcs/Downloads/opencv-4.2.0/opencv_install/lib
ディレクトリ、pkgconfig ディレクトリに opencv4.pc ファイルがあります。名前を opencv-arm.pc に変更します。 。
内のパスを変更します。
6) 検証
まず次のコマンドを使用します。
pkg-config --modversion opencv-arm
バージョン番号が正常に出力されました
検証するために別のプログラムを作成する
メイン.cpp:
#include <opencv2/opencv.hpp>
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
printf("hello!!! \n"); //输出hello
const char* imagename = "xiaomaolv.jpg";//此处为你自己的图片路径
// 从文件中读入图像::
cv::Mat img = cv::imread(imagename, 1);
//如果读入图像失败
if (img.empty()) {
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//显示图像
cv::imshow("image", img);
printf("successfully open image!\n");
cv::waitKey();
return 0;
}
コマンドを使用してクロスコンパイルします。
arm-linux-gnueabihf-g++ -std=c++11 `pkg-config --cflags opencv-arm` `pkg-config --libs opencv-arm` -lpthread -lrt -ldl main.cpp -o main1
正常にコンパイルされました!
5. 移植
1) 圧縮梱包
インストール フォルダーを入力し、コマンドを使用してパッケージ化します。
tar -czvf opencv4_2.tar.gz ./*
arm 側では、クロスコンパイルされた opencv を保存するディレクトリを作成できます。
私のディレクトリは次のとおりです。/usr/opencv
2) 送信
これに応じて、アームに送信されるコマンドは次のとおりです。
sudo cp opencv4_2.tar.gz /home/wcs/Linux/nfs/rootfs/usr/opencv/
解凍後、次の内容が表示されます。
コンパイルされたバイナリ実行可能ファイルを送信します。
sudo cp main1 /home/wcs/Linux/nfs/rootfs/test/ -f
対応するパスを入力します./main
実行します:
エラーが発生しました:
error while loading shared libraries: libopencv_gapi.so.4.2: cannot open shared object file: No such file or directory
解決:
以下のすべての .so ファイルを/usr/opencv/lib
/lib
ディレクトリにコピーします。
cd /home/wcs/Linux/nfs/rootfs/usr/opencv/lib/ #进入目录下
cp ./* /lib #拷贝所有lib文件到/lib下
プログラムは正常に動作していることがわかりますが、依然としていくつかのエラーが報告されています。これは、cvloadiamge などの highgui の関数が使用されているためです。解決するには、開発ボード上に QT ライブラリをビルドして GUI を表示します。
ところで
opencv のクロスコンパイル時に次のエラーが発生した場合:
arm-linux-gnueabihf/libc/usr/include/features.h:311:52: エラー: 演算子「&&」には正しいオペランドがありません
#if 定義されている場合_FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
在#if 定義前加上
#define _FILE_OFFSET_BITS 64