当前位置: 首页 > 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.dtcms.com/a/314474.html

相关文章:

  • typeof和instanceof区别
  • 静电干扰误报率↓85%!陌讯多模态融合算法在智慧环卫检测优化
  • python基础:数据解析BeatuifulSoup,不需要考虑前端形式的一种获取元素的方法
  • 【前端】JavaScript基础知识及基本应用
  • 【AMD】编译llama.cpp实践版
  • 管家级教程:在 Windows 上配置 WSL2、CUDA 及 VLLM,开源音频克隆项目
  • 解决 Alpine 容器中编译 confluent-kafka-go 报错的问题
  • LLaMA-Factory微调教程4:模型评估
  • Spring Boot + ShardingSphere 分库分表实战
  • 【CVPR2025】计算机视觉|AnomalyNCD:让工业异常分类“脱胎换骨”!
  • 计算机视觉(2)车规摄像头标准
  • YOLO11涨点优化:原创自研DSAM注意力!基于BiLevelRoutingAttention的颠覆性升级
  • nodejs 封装方法将打印日志输出到指定文件
  • javacc实现简单SQL解析器
  • Llama 3词汇表揭秘:128,000个token解析:merges 是子词分词算法
  • 数据结构——单向链表部分操作及valgrind安装
  • Exporters | 安装mongodb_exporter
  • 数据分页异步后台导出excel
  • 【Ubuntu】请问,`ip -a`显示的“wlo1”是什么呀?
  • 笔试——Day28
  • 如何在 Ubuntu 24.04 上安装和配置 TFTP 服务器
  • 高防服务器租用的作用都有哪些?
  • 上海交通大学联合项目论文解读 | Hume 模型:视觉 - 语言 - 动作模型中引入系统2思维
  • 单片机51 day46
  • 部署 Kibana 8.2.2 可视化管理 Elasticsearch 8.2.2 集群
  • 【测试工程思考】测试自动化基础能力建设
  • 机试备考笔记 4/31
  • Linux开发利器:探秘开源,构建高效——基础开发工具指南(下)【make/Makefile】
  • 笛卡尔坐标
  • 机器学习笔记:集成学习/模型融合