当前位置: 首页 > 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.lryc.cn/news/610073.html

相关文章:

  • 模拟IC设计提高系列8-运算跨导放大器OTA Operational Transconduct Amplifiers
  • 家事速配西安项目启动会圆满举行,开启社区服务新篇章
  • 决策树(回归树)全解析:原理、实践与应用
  • 【动态规划 | 回文字串问题】动态规划解回文问题的核心套路
  • 打卡day28
  • Memcached缓存与Redis缓存的区别、优缺点和适用场景
  • Java 大视界 -- Java 大数据在智能交通智能停车诱导与车位共享优化中的应用(381)
  • 【C#】操作Execl和Word文件-1
  • orchestrator部署
  • 11.Linux 权限管理,控制对文件的访问(ACL)
  • git操作命令和golang编译脚本
  • 【Spring】SpringBoot 自动配置,@ComponentScan、@Import、ImportSelector接口
  • 【QT】安装与配置
  • 计量学基础 - (二)计量单位制
  • NX982NX984美光固态闪存NX992NY102
  • 高速信号设计之 PCIe6.0 篇
  • Linux之Shell脚本快速入门
  • 【2025最新】Spring Boot + Spring AI 玩转智能应用开发
  • 微服务的编程测评系统10-竞赛删除发布-用户管理-登录注册
  • 雷达系统工程学习:自制极化合成孔径雷达无人机
  • Flask全栈入门:打造区块链艺术品交易所
  • Oracle 定时任务相关
  • Tomcat虚拟主机配置详解和多实例部署
  • k8s的毫核
  • 太阳光模拟器塑料瓶暴晒试验
  • Vue2实现docx,xlsx,pptx预览
  • P1002 [NOIP 2002 普及组] 过河卒
  • ubuntu22.04系统实践 linux基础入门命令(三) 用户管理命令
  • SpringMVC实战指南:从环境搭建到功能实现全解析
  • 先知模型或者说从容的模型