OpenCV クロスコンパイル - arm (imx6ull、Cortex-A7)

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_JPEGBUILD_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

おすすめ

転載: blog.csdn.net/AcetylcholineACh/article/details/129967999