码迷,mamicode.com
首页 > 移动开发 > 详细

Android图像数据传递到C++的一些坑

时间:2018-02-05 18:47:04      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:sign   src   map   未来   日志   传递   数据传递   类型   data-   

最近在做一个Android图象识别的app, 通过相机预览或者是拍照功能获取图像数据,然后将图像数据传递到本地C++的图像识别so库。在这个过程中花的时间最多的就是数据传输问题。谨以此坑,警示未来!
         首先,需要注意的几点:
        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数组就行.
 
 
版权所有,违者必究
(欢迎转载与交流 (wujianping.2006@163.com), 转载必须注明出处)
 

Android图像数据传递到C++的一些坑

标签:sign   src   map   未来   日志   传递   数据传递   类型   data-   

原文地址:https://www.cnblogs.com/MatrixPlayer/p/8418327.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!