1. 程式人生 > >嵌入式開發之Opencv(二)JPEG解碼加速

嵌入式開發之Opencv(二)JPEG解碼加速

參考文件

開發環境介紹

  • 主機作業系統: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.90

CMAKE_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.so

BUILD_JPEG         # 這裡必須關閉編譯3rd_party目錄下的jpeg原始碼
WITH_JPEG          # 開啟 

JPEG解碼加速手段

影象區域性解碼

參考libjpeg.txt的Partial image decompression章節。這個技術適用於效能敏感型的應用場景,在這個場景下我們只需要檢視一個大尺寸影象的一部分內容而不需要解碼整幅影象。libjpeg提供了兩個介面來實現這個功能:

  1. jpeg_skip_scanlines(y方向)
  2. 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解碼加速

參考文件 開發環境介紹 主機作業系統:Ubuntu14.04 64位 目標平臺:BoxV3 全志H8 交叉工具鏈:arm-linux-gnueabihf,gcc4.8.5 opencv版本:3.2.0 libjpeg-turbo:1.5.90 編譯

嵌入式開發Opencv(一)交叉編譯

參考文件 本文件涉及到的目標硬體為全志H8(8核Cortex-A7,Armv7架構),但是對其他Arm晶片也有一定的借鑑意義,只需要更換交叉編譯鏈即可。 開發環境介紹 主機作業系統:Ubuntu14.04 64位 目標平臺:BoxV3 全志H8 交叉

嵌入式開發hi3519---spi nor flash啟動

flash light thread sta 引導 mod 開發 啟動 emmc author:pkf qq:1327706646 1.官方hi3519默認是硬件3byte 地址模式,配置完ddr始終後,sdkv100.020是可以支持正常啟動,用到低位16Mflash

嵌入式開發hi3519--- pcie dma和dma cache 緩存更新sync memery

www. -- 管理 緩存 con 嵌入 內存 pin sta http://blog.csdn.net/likeping/article/details/42235111 linux下dma 管理 http://blog.csdn.net/skyflying2012/a

Flask web開發

一個 del 入口 return 計算機 span fig 服務器 pos 今天創建第一個flask項目,主app文件代碼如下: # 從flask這個框架導入Flask這個類 from flask import Flask #初始化一個Flask對象 # Flasks()

Django開發(django的models表查詢)

django nds 有一個 clas span pytho mod 返回 length django的models表查詢   一、單表查詢 (1) all(): 查詢所有結果 # 返回的QuerySet類型 (2) f

嵌入式開發核心“+”版本問題

問題現象: 關聯核心編譯的軟體,生成後,進行使用時提示不支援核心版本”xxx+”   分析原因: 檢視核心程式碼頂層Makefile   scripts/setlocalversion:   如果定義了CONFIG_LOCALVERSIO

android開發 OkHttp次封裝(android 訪問網路)

 這個是本人在使用的一個網路請求,根據自己的需求進行修改的,對於自己完全夠用。大家有需要可以根據自己的專案修改成自己需要的。如果有什麼問題,還希望告知。 使用時繼承該類即可 import android.os.Handler; import android.os.Message;

DALSA線陣CCD相機開發 opencv讀取圖片

SDK的下載 SDK的安裝 解壓執行.exe檔案,按照提示確定,下一步即可。 幫助文件和demo 如果要獲得完整的幫助文件和demo,在SDK安裝時選擇full安裝,路徑可以自己選擇,預設路徑為 C:\Program Files\Teledyne DALSA\

嵌入式開發 入門篇(檔案傳輸、交叉編譯)

lock. config_ipu_di_clk: set pll5 clock to 297000000Hz. Found PFUZE100! deviceid=10,revid=11 Net: got MAC address from IIM: 00:00:00:00:00:00 FEC0 [PRIME

Java遊戲伺服器開發--資料庫連線整合mybatis

應該比較讓人關心的還有一個就是資料儲存的問題了。   下面將會介紹連線資料庫的相關內容   使用的是mysql資料庫,框架中將使用mybatis   這裡介紹時假設各位都使用或者瞭解過mysql。     1.在pom中新增相關包  2.建立資料庫和表   3.建立

iOS開發opencv學習筆記四:使用feature2d識別圖片

使用過vuforia或者亮風臺的朋友應該知道,這兩個平臺對圖片的跟蹤的準備工作是很簡單的,只需要幾張樣本圖片就可以做了。 但是按照上篇的介紹,如果用CascadeClassifier進行物體跟蹤就需要非常非常多的樣本,那麼,要對圖片進行識別跟蹤就沒有像上面說的兩個平臺那樣

嵌入式開發STM32開發Keil(或MDK或u4)使用及踩坑

V4配置 1.配置晶片型號 2.配置輸出 3.配置過程中檔案 4.配置C 5.配置J-LINK declaration is incompatible wit

小程式開發--安卓手機wx.hideLoading()無效

無效程式碼 首先 在onLoad()中wx.showLoading({ title: “資料載入中”, mask: true }); 非同步獲取資料後 wx.hideLoading();

iOS開發opencv學習筆記一:下載和安裝

1. opencv是什麼? opencv是一個基於BSD開源協議的影象處理開源庫,截止本人編輯時間:2017年6月1日,最新版本為3.2.0。 2.哪裡可以得到opencv的原始碼以及不同平臺的動態庫? opencv的官方地址為http://opencv.org/,可以在這

獻給初學iOS的小盆友們——微博app專案開發自定義cell程式碼補全

上節課我們主要講解了我們是怎麼一步一步把自定義cell打通的,主要方法就是引入了MVVM檢視模型,這樣我們就可以利用檢視模型就提前把各個子控制元件的frame都計算好了。今天我們就是講如何計運算元控制元件frame,以及補全原創微博和轉發微博的設計。 本節內容

FPGA開發問題

11、問 :ISE 中的 PAD TO PAD CONSTRAINT 是否是包括輸入輸出的 pad 時延之和再加上輸入輸出之間的組合邏輯的時延?還是隻是輸入輸出之間的組合邏輯的時延? 答 :Xilinx PAD-to-PAD contraint 的確涉及到輸入輸出 PAD

android開發掃描維碼實現網頁登入

匯入BarCodeLibrary到Eclipse當中 在Eclipse當中建立新專案並依賴於BarCodeLibrary類庫 Code: MainActivity.java public class MainActivity extends Activity implements OnClickLis

Linux嵌入式開發入門()——快速看懂原理圖,對接軟體開發

這裡只是為了看懂原理圖,不牽扯具體的計算等內容(比如電路電流多少啊,三極體放大等等)。因為對於嵌入式開發人員來說,只需要明白不同的電平對於開發板的結果即可,不需要知道具體電路的情況。 微機原理:側重於講計算機結構 數位電子技術基礎:側重於閘電路 GPIO和閘電路 GPIO類 GPIO:通

uGUI使用程式碼動態新增Button.OnClick()事件(Unity3D開發

猴子原創,歡迎轉載。轉載請註明: 轉載自Cocos2Der-CSDN,謝謝!uGUI出來這麼久了,也一直沒好好用用,主要是公司專案不用U3D。昨晚用了下Button,還是比較爽的。主要說下用程式碼新增button.OnClick()事件的方法(使用屬性面板新增的方法就不說了)