opencv原生版编译参考:opencv 模块裁剪 按需安装指定模块-CSDN博客
1、libavif源码编译
cmake -S libavif-v1.3.0 -B ./build -DCMAKE_BUILD_TYPE=Debug -DBUILD_SHARED_LIBS=OFF -DAVIF_CODEC_AOM=LOCAL -DAVIF_LIBYUV=OFF -DAVIF_LIBSHARPYUV=OFF -DAVIF_JPEG=OFF -DAVIF_ZLIBPNG=OFF -DAVIF_BUILD_APPS=OFF -DAOM_TARGET_CPU=generic -DCMAKE_INSTALL_PREFIX=/export/xxxxxx/install_path
cmake --build build --config Release --parallel
cd build && make install
问题解决:
- aom下载失败,可以手动下载
- cp到指定路径build/_deps/libaom-subbuild/libaom-populate-prefix/src/,并且重命名为错误提示中的指定版本,比如v3.12.1.tar.gz
- sha256 v3.12.1.tar.gz得到SHA256
- vim libavif-v1.3.0/cmake/Modules/LocalAom.cmake 找到aomedia.googlesource.com所在FetchContent_Declare,增加URL_HASH SHA256=xxxxxx,如下图
- 安装完成后:自测参考https://fossies.org/linux/libavif/examples/avif_example_decode_memory.c
2、opencv引入libavif依赖
与编译opencv原始版本相比,这里新增了
-D WITH_AVIF=ON \
-D AVIF_INCLUDE_DIR=/export/xxxxxxx/opencv_4_12/avif_deps/include \
-D AVIF_LIBRARY=/export/xxxxxxxx/opencv_4_12/avif_deps/lib64/libavif.a \
用于打开AVIF依赖,以及指定avif include和lib64,完整命令如下:
# step 1
mkdir build && cd build \
cmake ../opencv-4.12.0 \
-DBUILD_LIST=core,imgcodecs \
-DBUILD_JPEG=ON -DWITH_JPEG=ON \
-DCMAKE_CXX_STANDARD=14 \
-DBUILD_SHARED_LIBS=OFF \
-DWITH_PNG=ON -DBUILD_PNG=ON \
-DWITH_WEBP=ON -DBUILD_WEBP=ON \
-DWITH_OPENJPEG=ON -DBUILD_OPENJPEG=ON \
-DWITH_OPENEXR=OFF \
-DBUILD_TIFF=ON \
-DBUILD_ZLIB=ON \
-D WITH_AVIF=ON \
-D AVIF_INCLUDE_DIR=/export/xxxxxxx/opencv_4_12/avif_deps/include \
-D AVIF_LIBRARY=/export/xxxxxxxx/opencv_4_12/avif_deps/lib64/libavif.a \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/export/xxxxxxxxx/install_path
# step 2
cmake --build .
# step 3
make install
3、解码测试示例
// 编译命令 (在指定的安装路径下执行)
// g++ decode_t.cc -std=c++14 -I./include/opencv4 -L./lib64 -L./lib64/opencv4/3rdparty -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -littnotify -llibjpeg-turbo -llibwebp -lavif -llibpng -llibtiff -llibopenjp2 -lzlib -lipphal -lippiw -lippicv -ldl -lm -lpthread -lrt
#include "opencv2/opencv.hpp"
#include <chrono>
#include <iostream>
#include <fstream>
#include <sstream>
int main(int args, char* argv[]) {
// #ifdef WITH_SIMD
// std::cout << "WITH_SIMD:" << WITH_SIMD << "\n";
// #else
// std::cout << "no define WITH_SIMD\n";
// #endif
// std::ifstream fs("load.jpg");
std::ifstream fs("demo.avif");
// std::ifstream fs("demo.jpg");
if (!fs) {
std::cout << "fs_ptr is invalid!\n";
return -1;
}
std::stringstream buffer;
buffer << fs.rdbuf(); // 读取文件内容到 stringstream
std::string str_tmp(buffer.str());
std::cout << "raw img size:" << str_tmp.size() << "\n";
cv::Mat input_cvmat(1, str_tmp.size(), CV_8UC1, reinterpret_cast<char*>(const_cast<char*>(str_tmp.data())));
auto start_time = std::chrono::high_resolution_clock::now();
// auto decode_ret1 = cv::imdecode(input_cvmat, cv::IMREAD_COLOR/*CV_LOAD_IMAGE_COLOR*/);
auto decode_ret1 = cv::imdecode(input_cvmat, cv::IMREAD_UNCHANGED/*CV_LOAD_IMAGE_COLOR*/);
auto latency_us = std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::high_resolution_clock::now() - start_time).count();
std::cout << "decode latency:" << latency_us << "us\n";
std::cout << "width:" << decode_ret1.size().width << "; height:" << decode_ret1.size().height << "\n";
// std::cout << "mat data_size:" << decode_ret1.data;
std::cout << "Complete!\n";
return 0;
}
4、结论
- 原生avif图像数据解码耗时巨高:92KB数据,耗时95ms左右;
- VS
- jpeg-turbo:132KB数据,耗时6ms;