当前位置: 首页 > news >正文

opencv引入libavif

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_pathcmake --build build --config Release --parallelcd 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();  // 读取文件内容到 stringstreamstd::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;
http://www.xdnf.cn/news/1242847.html

相关文章:

  • 从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
  • Prometheus-3--Prometheus是怎么抓取Java应用,Redis中间件,服务器环境的指标的?
  • 【慕伏白】Android Studio 配置国内镜像源
  • 内联函数:提升效率的空间换时间艺术
  • FreeRTOS源码分析四:时钟中断处理响应流程
  • 深入浅出 RabbitMQ:工作队列实战(轮训策略VS公平策略)
  • 鸿蒙南向开发 编写一个简单子系统
  • 机器学习 入门——决策树分类
  • 并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用
  • C++入门自学Day6-- C++模版
  • 飞算JavaAI需求转SpringBoot项目沉浸式体验
  • 【BUUCTF系列】[极客大挑战 2019]LoveSQL 1
  • vllm启动Qwen/Qwen3-Coder-30B-A3B-Instruct并支持工具调用
  • MLIR Introduction
  • android内存作假通杀补丁(4GB作假8GB)
  • History 模式 vs Hash 模式:Vue Router 技术决策因素详解
  • ZYNQ-按键消抖
  • JavaScript 中的流程控制语句详解
  • 3.JVM,JRE和JDK的关系是什么
  • 第二十四天(数据结构:栈和队列)队列实践请看下一篇
  • SQL注入SQLi-LABS 靶场less39-50详细通关攻略
  • 基于实时音视频技术的远程控制传输SDK的功能设计
  • 【ECCV2024】AdaCLIP:基于混合可学习提示适配 CLIP 的零样本异常检测
  • [GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!
  • 刷题记录0804
  • ref和reactive的区别
  • 8位以及32位的MCU如何进行选择?
  • ArrayDeque双端队列--底层原理可视化
  • Redis 常用数据结构以及单线程模型
  • LeetCode 140:单词拆分 II