Android映像資料傳遞到C++的一些坑

來源:互聯網
上載者:User

標籤: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++的一些坑

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.