標籤:sign src map 未來 日誌 傳遞 資料傳遞 類型 data-
最近在做一個Android圖象識別的app, 通過相機預覽或者是拍照功能擷取映像資料,然後將映像資料傳遞到本地C++的Image Recognitionso庫。在這個過程中花的時間最多的就是資料轉送問題。謹以此坑,警示未來!
首先,需要注意的幾點:
1. android相機預覽模式的回呼函數的byte [] data參數,資料是YUV資料 2. android相機拍照模式的回呼函數的byte [] data參數,資料是ARGB8888
3. java儲存映像資料的資料byte[] 與C++中的unsigned char資料範圍不一致,java byte: -128~127, C++ unsigned char: 0~255。
我的應用程式需求是:1. 拍照模式調用C++識別庫
2. 底層C++的演算法需要YUV格式的映像資料
所以,需要將拍照模式擷取的映像資料ARGB8888轉換到YUV。
而在上面代碼中,將byte資料強制轉換到int,超過127的資料都會減掉256,即:
if (a > 127)
{
a -= 256;
}
接著將rgb的byte數群組轉換到yuv數組:
由於這裡的RGB轉YUV的的公式是針對RGB數值範圍在(0~255)的,所以必須先將之前RGB的數值範圍在-128~127的範圍轉回到(0~255),此時就是小於零的資料加上256就行了
這樣轉換出來的YUV也在0~255之間,然後在強制類型轉換成byte, 最後yuv的資料就是byte資料,範圍-128~127,將這樣的YUV直接給jni介面傳遞到演算法內部即可。
注意jni的演算法介面也是byte []. YUV(-128~127)的資料傳給jni介面,演算法內部(C++)會自動解析到本地的unsigned char範圍(0~255)。
PS: 其實可以從bitmap的資料中直接儲存RGB為int數組,然後不用再轉化資料類型,用YUV的公式轉換到yuv,最後將int的yuv強制轉換到byte數組就行.
著作權,違者必究
(歡迎轉載與交流 ([email protected]), 轉載必須註明出處)
Android映像資料傳遞到C++的一些坑