一,同样的,利用封装好的库收集图像
package com.example.dgxq008.opencv_readpixel;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
public class MainActivity extends Activity implements View.OnClickListener , CameraBridgeViewBase.CvCameraViewListener2 {
private Button btnProc;
private ImageView imageView;
private Bitmap bmp;
private CameraBridgeViewBase mOpenCvCameraView;
private Mat rgba;
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnProc = (Button) findViewById(R.id.btn_gray_process);
btnProc.setOnClickListener(this);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.jcv);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
}
@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();
nativeRgbaToBlue(rgba.nativeObj);//40ms以内就不会影响预览效果
return rgba;
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public static native int[] grayProc(int[] pixels, int w, int h);
public static native void nativeRgba(long rgba);
public static native void nativeRgbaToBlue(long rgba);
@Override
public void onClick(View view) {
}
@Override
protected void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()) {
} else {
mOpenCvCameraView.enableView();
}
}
@Override
protected void onPause() {
super.onPause();
if (mOpenCvCameraView != null){
mOpenCvCameraView.disableView();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null){
mOpenCvCameraView.disableView();
}
}
}
二, 实现Jni接口,完成过滤颜色
extern “C”
JNIEXPORT void JNICALL
Java_com_example_dgxq008_opencv_1readpixel_MainActivity_nativeRgbaToBlue(JNIEnv *env, jclass type,
jlong jrgba) {
Mat& rgba = * (Mat*)jrgba;
uchar* rgbaData = rgba.data;
int height = rgba.rows;
int weight = rgba.cols;
int length = height * weight;
for (int i = 0; i < length; ++i) {
//RGBA, 只取一种,其他重置为零,alpha忽略
rgbaData[4*i+0] = rgbaData[4*i+0];
rgbaData[4*i+1] = 0;
rgbaData[4*i+2] = 0;
}
}