最近学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 学习总结.