1. ffmpeg を使用しない Opencv クロスコンパイルでは、ビデオが開かなくなります。
クロスコンパイル中に、PC では opencv でビデオを開くことができるが、rv1126 ではビデオを開くことができないことがわかりました。長い間オンラインで検索した結果、原因はffmpegのクロスコンパイルプロセスにある可能性があります。以前は、ffmpeg は apt を使用して直接インストールされ、opencv コンパイルも Cmake コマンド ラインを使用して直接実行されました。
インターネット上のコマンドラインを使用してコンパイルすることが特に推奨されますが、このクロスコンパイルでは、CMake-gui を使用してコンパイルすると、エラーをよりよく見つけられることがわかりました。これは、警告であってもエラーであっても、CMake-gui はそれを示す赤い文字。
2. 準備作業
/opt/software ディレクトリを作成し、opencv4.5.5、x264、および ffmpeg-4.x をこのディレクトリにダウンロードします。
別のディレクトリ /opt/out-arm を作成します。これは、x264 と ffmpeg のインストール ディレクトリとして使用されます。
3.x264 クロスコンパイル
1. ソース コードを解凍し、ソース コード ディレクトリに移動します
2. ffmpeg をコンパイルする目的でダイナミック ライブラリをコンパイルします コマンドは次のとおりです:
#./configure --prefix=/opt/software/opencv --host=arm -linux --cross-prefix= arm-linux-gnueabihf- --disable-asm --enable-shared
#make -j6
#make install
3. アプリケーションをリンクして使用するために、静的ライブラリをコンパイルします。
#./configure --prefix= /home/cxyazhou/work/opencv --host=arm-linux --cross-prefix=arm-linux-gnueabihf- --disable-asm #make clean; make
- j6
#make install
注: 静的ライブラリをコンパイルするとき、make install は bin 下のファイルをインストール ディレクトリにコピーするだけなので、ヘッダー ファイルと静的ライブラリをインストール ディレクトリに手動でコピーする必要があります。上記でコンパイルされた動的ライブラリに基づいて、ヘッダー ファイルはここでは、静的ライブラリをインストールの lib ディレクトリにコピーするだけです。
#cp libx264.a /opt/out-arm/lib/
4. ffmpeg のクロスコンパイル
0. ffmpeg のコンパイル時に x264 ライブラリが見つからないように環境変数を設定します。
#export PKG_CONFIG_PATH=/opt/out_arm/lib/pkgconfig/
1. ソース コードを解凍し、ソース コード ディレクトリに移動します
。 2. 静的ライブラリをコンパイルします。コマンドは次のとおりです。
#./configure --cross-prefix=arm-linux-gnueabihf- --enable-cross-compile -- target-os=linux --cc =arm-linux-gnueabihf-gcc --arch=arm64 --prefix=/opt/out-arm --enable-ffmpeg --disable-armv5te --disable-armv6 --disable- armv6t2 --disable-asm --enable-swscale --enable-avresample --enable-gpl --enable-libx264 --extra-cflags=-I/opt/out-arm/include --extra-ldflags=-L /opt/out-arm/lib
#make -j6
#make install
5. OpenCV のクロスコンパイル
opencv クロスコンパイルには ffmpeg_cross-compile opencv ffmepg_think が含まれ、その後 act ブログ - CSDN ブログ
事前作業の構成
上記のブロック引用内のブログに従って、[エントリの追加] を使用してインストール ディレクトリも指定しました。
Docker コンテナ内の /mnt ディレクトリは、開発ボード全体をマップします。
構成、設定
構成が完了できる限り、構成プロセス中のいくつかの警告にはあまり注意を払わないでください。
構成結果を確認します。FFMPEG は YES、YES です。
生成する
上記のブログでは Generate はエラーを報告しませんでしたが、ここでエラーを報告しました。
modules/videoio/CMakeLists.txt の CMake エラー:インポートされたターゲット「ocv.3rdparty.ffmpeg」
の INTERFACE_INCLUDE_DIRECTORIES に
存在しないパス
「/mnt/opt/software/opencv/include」が含まれています。考えられる理由は次のとおりです。
* パスが削除、名前変更、または別の場所に移動された。
* インストールまたはアンインストール手順が正常に完了しませんでした。
* インストール パッケージに欠陥があり、
提供されていないファイルを参照しています。
解決策は、x264 および ffmpeg ライブラリのインストール ディレクトリにある include フォルダーの内容をコピーすることです。
# コピー /opt/out-arm/include/* /mnt/opt/software/opencv/include -r
ビルドディレクトリで実行される作業
生成が完了したら、cmkae-gui を閉じ、ビルド ディレクトリに戻り、次を実行します。
# -j8 を作成します
# インストールを行う
インストール済み:
6.ビデオが開けるかどうかを確認します
CMakLists.txt
cmake_minimum_required(VERSION 2.8.4)
STRING(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} )
MESSAGE("current project: " ${CURRENT_FOLDER})
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_CROSSCOMPILING TRUE)
cmake_host_system_information(RESULT arch_value QUERY OS_PLATFORM)
if(NOT "${arch_value}" STREQUAL "armv7l")
include ($ENV{HOME}/configs/cross.cmake)
endif()
project(video_test)
# 设置链接器路径
link_directories(/mnt/usr/lib/arm-linux-gnueabihf)
set(CMAKE_PREFIX_PATH "/mnt/usr" ${CMAKE_PREFIX_PATH})
find_package(OpenCV REQUIRED)
add_executable(video_test test.cpp )
target_include_directories(video_test PUBLIC ${OpenCV_INCLUDE_DIRS} )
target_link_libraries(video_test PRIVATE ${OpenCV_LIBS} /mnt/usr/lib/ogdi/libgdal.so)
target_link_libraries(video_test PRIVATE -Wl,-rpath,/mnt/usr/lib/arm-linux-gnueabihf/)
テスト.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
cv::VideoWriter outputVideo("/userdata/result.mp4",
cv::VideoWriter::fourcc('m', 'p', '4', 'v'),
double(1000/30),
cv::Size(640,480));
// int camera_id =0;
std::string video_path = "/userdata/test.avi";
cv::VideoCapture camera(video_path);
if(!camera.isOpened()){
printf("camera %s cann't open\n", video_path.c_str());
return 1;
}
else
printf("camra %s opened\n", video_path.c_str());
int frame_num = camera.get(cv::CAP_PROP_FRAME_COUNT);
int frame=0;
cv::Mat img;
while(1){
frame +=1;
camera >> img;
if (img.empty()){
printf("camera cann't get image!\n");
}
// cv::imshow("result", img);
outputVideo.write(img);
if(frame == frame_num - 2) break;
}
camera.release();
outputVideo.release();
return 0;
}
クロスコンパイルされた実行可能ファイル video_test は、開発ボード上のビデオ ファイルを開くことができます。
7. その他
ソース コードをコンパイルしてインストールするとき、ビルド プロセス中に CMake が必要なライブラリとヘッダー ファイルのパスを見つけるのに役立つ pkg-config ツールがよく使用されます。pkg-config は、コンパイル時と実行時の依存関係を管理するためのツールで、必要なライブラリに関する情報をクエリするための標準インターフェイスを提供します。
ライブラリをインストールするとき、ライブラリのメタデータ情報 (ライブラリ パス、バージョン番号、依存関係など) は通常、対応するファイルに保存され、その .pc
ファイルはシステムの pkg-config ディレクトリにインストールされます。pkg-config ディレクトリは、プロジェクトに必要なすべてのファイルが含まれるディレクトリです .pc
。CMake は、これらのファイルをクエリすることでライブラリ情報を取得できます。
CMake では、 find_package
コマンドを使用して依存ライブラリの設定を検索および構成できます。library の名前が渡されると find_package
、CMake は pkg-config を通じて対応するライブラリ情報をクエリし、結果を変数に保存します。次に例を示します。
find_package(OpenCV REQUIRED)
上記のコードでは、find_package(OpenCV REQUIRED)
指定されたファイルが pkg-config ディレクトリにあり opencv.pc
、ライブラリのパス、バージョン番号、その他の必要な依存関係を含む OpenCV ライブラリの情報がそこから抽出されます。CMake はこの情報を使用して OpenCV ライブラリの設定を構成し、ビルド プロセス中に OpenCV を見つけてリンクできるようにします。
すべてのライブラリが pkg-config を使用して管理および設定されるわけではないことに注意してください。一部のライブラリは、CMake 構成ファイルや環境変数など、他の手段を使用してコンパイルおよびランタイムのメタデータ情報を提供する場合があります。したがって、特定のライブラリを使用する場合は、そのライブラリのドキュメントまたは公式ガイドを参照して、正しい構成方法を学ぶ必要があります。