opencv引入libavif

发布于:2025-08-05 ⋅ 阅读:(10) ⋅ 点赞:(0)

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;

网站公告

今日签到

点亮在社区的每一天
去签到