嵌入式开发之Opencv(二)JPEG解码加速
参考文档
- libjpeg-turbo官网
- libjpeg-turbo github主页
- JPEG高速低画质选项设置
- Speed-Up JPEG Encode/Decode Processing for OpenCV using libjpeg-turbo
- libjpeg-turbo性能报告与建议
- libjpeg对于(I)DCT Scale的支持和快速实现
开发环境介绍
- 主机操作系统:Ubuntu14.04 64位
- 目标平台:BoxV3 全志H8
- 交叉工具链:arm-linux-gnueabihf,gcc4.8.5
- opencv版本:3.2.0
- libjpeg-turbo:1.5.90
- 编译时间:2018.7.26
libjpeg-turbo介绍
libjpeg-turbo是一个使用SIMD技术(MMX、SSE2、AVX2、NEON)进行加速的JPEG编码解码器,能够在基于x86、x86_64、arm的系统上使用。相对于标准版libjpeg能够提供2-6x的性能提升。
libjpeg-turbo交叉编译
设置本地编译链和交叉编译链
# 在/etc/bash.bashrc的最后增加如下指令
# Native Compiler
export AR_host="ar"
export CC_host="gcc"
export CXX_host="g++"
export LINK_host="g++"# Allwinner H8 BoxV3 cross compiler, Qt 5.8.0 SDK
export ARCH=arm
export PATH=/home/root/CQA83TLinux_Qt5.8.0_bv3/buildroot-2017.02.3/output/host/usr/bin/:$PATH
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export CC=/home/root/CQA83TLinux_Qt5.8.0_bv3/buildroot-2017.02.3/output/host/usr/bin/arm-buildroot-linux-gnueabihf-gcc
export CXX=/home/root/CQA83TLinux_Qt5.8.0_bv3/buildroot-2017.02.3/output/host/usr/bin/arm-buildroot-linux-gnueabihf-g++
export LD=/home/root/CQA83TLinux_Qt5.8.0_bv3/buildroot-2017.02.3/output/host/usr/bin/arm-buildroot-linux-gnueabihf-ld
export AR=/home/root/CQA83TLinux_Qt5.8.0_bv3/buildroot-2017.02.3/output/host/usr/bin/arm-buildroot-linux-gnueabihf-ar
export AS=/home/root/CQA83TLinux_Qt5.8.0_bv3/buildroot-2017.02.3/output/host/usr/bin/arm-buildroot-linux-gnueabihf-as
export RANLIB=/home/root/CQA83TLinux_Qt5.8.0_bv3/buildroot-2017.02.3/output/host/usr/bin/arm-buildroot-linux-gnueabihf-ranlib
# 修改完成之后需要重启命令行才能生效
# 你可以通过如下指令来确认交叉编译链是否已经设置好
echo $CC
# 当显示/home/root/CQA83TLinux_Qt5.8.0_bv3/buildroot-2017.02.3/output/host/usr/bin/arm-buildroot-linux-gnueabihf-gcc时表示交叉编译链
# 已经设置好
# 当需要更换为本机编译时屏蔽上面的指令即可
这里选择最新的1.5.90版本(时间点为2018-6-1)
修改CmakeLists.txt
# 当在配置cmake时出现了找不到system和cpu时,在cmake文件开头手动指定
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
新建cmake Build目录
cd libjpeg-turbo-1.5.90
mkdir _build
打开cmake-gui进行交叉编译链配置
选择Specify options for cross-compiling,进入交叉编译链设置界面
点击Configure
再次修改设置选项:
# 指定安装类型和目录
CMAKE_BUILD_TYPE Release
CMAKE_INSTALL_PREFIX /usr/local/BoxV3/libjpeg-turbo-1.5.90CMAKE_C_FLAGS -mfpu=neon -march=armv7-a -fPIC
CMAKE_CXX_FLAGS -mfpu=neon -march=armv7-a -fPIC
WITH_JPEG8 TRUE # 勾选JPEG8接口仿真,因为opencv只能使用标准JPEG的接口
点击Configure
点击Generate生成Makefile
进入_install目录&编译
cd _build
make -j8
make install
opencv替换JPEG解码库
在实用cmake-gui配置opencv时手动添加JPEG相关库的信息
JPEG_INCLUDE_DIR /usr/local/H3/libjpeg-turbo-1.5.90/include # 值为上面编译libjpeg-turbo的目标位置
JPEG_LIBRARY /usr/local/H3/libjpeg-turbo-1.5.90/lib/libjpeg.soBUILD_JPEG # 这里必须关闭编译3rd_party目录下的jpeg源代码
WITH_JPEG # 开启
JPEG解码加速手段
图像局部解码
参考libjpeg.txt的Partial image decompression
章节。这个技术适用于性能敏感型的应用场景,在这个场景下我们只需要查看一个大尺寸图像的一部分内容而不需要解码整幅图像。libjpeg提供了两个接口来实现这个功能:
- jpeg_skip_scanlines(y方向)
- jpeg_crop_scanline(x方向)
IDCT Scale
参考libjpeg.txt的scale_num, scale_denom
部分。
这个方法可以通过控制IDCT的Scale功能来实现缩放操作,并且可以大幅减少解码时间。而且如果针对的是深度学习算法,本身网络输入的尺寸一般会小于高清视频的分辨率,这样还可以减少解码之后再次进行缩放的耗时。
Fast Upsampling & Fast IDCT
Multi-Thread
修改Opencv解码设置
代码文件:opencv-3.2.0/modules/imgcodecs/src/grfmt_jpeg.cpp
函数:JpegDecoder::readHeader()
行数:243行
jpeg_read_header( &state->cinfo, TRUE );// 设置加速解码相关选项
state->cinfo.do_fancy_upsampling = FALSE;
state->cinfo.do_block_smoothing = FALSE;
state->cinfo.dct_method = JDCT_FASTEST;
state->cinfo.dither_mode = JDITHER_NONE;state->cinfo.scale_num=1;
state->cinfo.scale_denom = m_scale_denom;
性能加速统计
测试芯片:全志H8
opencv版本:3.2.0
libjpeg-turbo版本:1.5.90
解码图片尺寸:1600 x 1200
jpeg版本 | 解码时间 | 加速比 |
---|---|---|
opencv自带jpeg | 240ms | |
libjpeg-turbo | 118ms | |
libjpeg-turbo修改设置 | 91ms | |
libjpeg-turbo修改设置 + DCT 1/2缩放 | 55ms |
嵌入式开发之Opencv(二)JPEG解码加速相关推荐
- 嵌入式开发之Opencv(一)交叉编译
参考文档 本文档涉及到的目标硬件为全志H8(8核Cortex-A7,Armv7架构),但是对其他Arm芯片也有一定的借鉴意义,只需要更换交叉编译链即可. 开发环境介绍 主机操作系统:Ubuntu14. ...
- 嵌入式开发之zynqMp ---Zynq UltraScale+ MPSoC 图像编码板zcu102
嵌入式开发之zynqMp -Zynq UltraScale+ MPSoC 图像编码板zcu102 1.1 xilinx zynqMp 架构 1.1.1 16nm 级别工艺 Zynq UltraScal ...
- 嵌入式linux基本指令,成都嵌入式开发之Linux常用命令大全
原标题:成都嵌入式开发之Linux常用命令大全 Linux系统中有很多命令,使用Linux系统最常用的就是命令操作,而不是像Windows一样,使用鼠标操作.Linux中许多常用命令是必须掌握的,也有 ...
- 嵌入式开发之NorFlash 和NandFlash
嵌入式开发之NorFlash 和NandFlash 转自:http://blog.csdn.net/tigerjb/article/details/9322035 [摘要]:作为一个嵌入式工程师,要对 ...
- 视频教程-物联网嵌入式开发之STM32 和 RT-thread-物联网技术
物联网嵌入式开发之STM32 和 RT-thread 我叫连志安,现任职广东长虹技术研究所(国企).之前在康佳集团(国企).CVTE(上市公司)等公司任职.负责过Android TV.智能网关.路由器 ...
- 嵌入式开发之Qt-5.9.6应用程序开发环境搭建
参考文档 嵌入式开发之Qt-5.9.6交叉编译(带WebEngine) Qt-5.9.6 linux安装包官方下载地址 Qt-5.9.6 linux安装包百度云下载地址 开发环境介绍 主机操作系统:U ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的图像采集格式Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别...
简单来说, YUV: luma (Y) + chroma (UV) 格式, 一般情况下sensor支持YUV422格式,即数据格式是按Y-U-Y-V次序输出的 RGB: 传统的红绿蓝格式,比如RGB5 ...
- 专科生的嵌入式开发之路
俗话说的好,高中不努力,大学指定没戏,哈哈,谁说的,当然是我说的.高考结束了,我成功以320分的优异成绩成为了一个地道的专科生,高中玩嗨了,这回选志愿就傻眼了,这点分可选的学校并不多,要不再复习一年? ...
- 嵌入式开发之路,从51单片机开始
关注.星标公众号,直达精彩内容 来源:技术让梦想更伟大 作者:李肖遥 嵌入式开发入门之路 我相信很多朋友第一次接触的单片机应该就是51单片机,8位的mcu,丰富的教程,可以做很多小玩意,让初学者基本掌 ...
最新文章
- android不调用系统发送短信,android之两种方式调用短信发送接口
- c++ RTTI(运行时类型识别)
- 2019区块链广泛应用于能源领域 ,DMA基金会,服务于区块链产业
- ant design pro 加载慢_ant design pro项目打包后页面加载缓慢
- 重学 Java 之 5种字符流读取方法
- 伦茨8400变频器面板按键说明_lenze变频器 8400 protec
- 【渝粤题库】陕西师范大学200371 拓扑学 作业 (专升本、高起本)
- 前端学习(2957):组件之间的参数传递父传子
- git pull --rebase 做了什么? 以及 Cannot rebase: You have unstaged changes 解决办法
- php josnp_浅析php中jsonp的跨域实例
- java 给出两个整数a和b , 求他们的和。不用用运算符+
- 区块链学习路线图 初阶+中阶+高阶
- WPF捕获事件即使这个事件被标记为Handled
- Atitit 常见聚合运算与算法 目录 1.1. 单行函数,vs 那就是聚合函数	1 1.2. 聚合分类 哈希聚合 标量聚合 流聚合	1 1.3. 常见聚合函数 mysql oracle等	1 r
- 菜鸟使用mock.js心得
- python selenium ActionChains类与鼠标的模拟事件
- 成都市中小学计算机创客,我校荣获2019四川省中小学电脑制作活动机器人暨创客竞赛团体一等奖...
- 红旗linux如何开远程桌面,配置VNC服务实现红旗Linux远程桌面访问
- 锐龙r75800h和酷睿i511400h差距多大 r7 5800h和i5 11400h核显
- 新游戏中出现的基于BSP场景分割技术
热门文章
- CentOS7搭建hadoop集群
- linux-shell脚本-利用shell函数计算两数之和--思考return原理
- Eclipse Marketplace( 插件市场 )集成插件方案
- “国防七子”经费暴增,清华再增45亿,甩第二名101亿,全国高校2022预算大公开。...
- VMware搭建分布式集群基础环境
- C++ 日期和时间编程
- 开源企业资源规划ERPNext的安装
- python读取文件之前判断文件编码格式
- RPA场景案例│“一站式办公”,打造智慧化政务服务
- C#模拟鼠标、键盘操作