Android-opencv-图像数据Mat传递到Native

最近学opencv,利用opencv-android-sdk的
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {}
抓取摄像头数据,一帧一帧mat数据,传递给Native。

通过查看Opencv官方的face-detection的源码可以知道,mat可以通过地址传递到Native层再进行处理。

DetectionBasedTracker.java
这里写图片描述
从上面可以看到
nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr());

imageGray是 Mat 类型,直接传到Native C++层,是通过址传递的
imageGray.getNativeObjAddr()返回它的地址(long类型)

要在Native拿到也很简单
这里写图片描述

没错,直接强转就可以了
总得来说可以分为三步:

1、java native函数:

public  native void  detectIdCard(long mat);

2、调用:

mRgba = inputFrame.rgba();
detectIdCard(mRgba.nativeObj);

mRgba.nativeObj拿到Mat数据的地址

3、在Native层获取:

   Mat src=(*((Mat*)mat));

注意:在这里是址传递。

但是,有一个坑要注意,如果直接使用颜色转换函数是不起作用的

cvtColor(src,src,COLOR_RGB2GRAY);

这里并不能改变onCameraFrame传递下来的mat数据 src的颜色灰度
但是如果这样做,例如下面

Java_com_example_administrator_idcarddetect_MainActivity_detectIdCard(
JNIEnv *env, jobject instance, jlong mat) {
    // TODO
    Mat src=(*((Mat*)mat));
    Mat dst;
    cvtColor(src,dst,COLOR_RGB2GRAY);
    imwrite("sdcard/gray.jpg",dst);
    Rect rect(0,50,100,100);
    rectangle(src,rect.tl(),rect.br(),Scalar(0,255,255));
    }
}

就可以在sdcard/gray.jpg目录下,保存到一张灰度图
现在看来是,在Native可以对传递下来的Mat数据进行Rect绘制,但不能改变它的颜色通道

2017/10/26 学习总结.

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值