一,利用OpenCV提供给Java封装好的调用摄像头接口,获取MAt
@Override
public void onCameraViewStarted(int width, int height) {
rgba = new Mat(width,height, CvType.CV_8UC4);
}
@Override
public void onCameraViewStopped() {
rgba.release();
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
//rgba = inputFrame.gray();
rgba = inputFrame.rgba();
nativeRgba(rgba.nativeObj);//40ms以内就不会影响预览效果
return rgba;
}
public static native void nativeRgba(long rgba);
二,实现jni方法 ,贴上 C++ 代码
extern “C”
JNIEXPORT void JNICALL
Java_com_example_dgxq008_opencv_1readpixel_MainActivity_nativeRgba(JNIEnv *env, jclass type,
jlong jrgba) {
Mat& rgba = * (Mat*)jrgba;
Mat temp = rgba.clone();
Mat gray;
cvtColor(rgba,gray,CV_RGBA2GRAY);
/*
* canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图
*
* 使用 3x3内核来降噪
*/
blur( gray, gray, Size(3,3) );
Canny( gray, gray, 3, 9);
//【5】将rgba内的所有元素设置为0
rgba = Scalar::all(0);
//( OutputArray m, InputArray mask )
temp.copyTo( rgba,gray);
}