如何将图像从android java传递给JNI使用opencv过滤图像并返回到android java?

时间:2016-12-19 22:07:28

标签: java android c++ opencv android-ndk

我想将图像从java传递到JNI并进行一些过滤和其他操作,然后将其发送回java并在屏幕上显示。这是我试过的代码。

java代码

public class MainActivity extends AppCompatActivity {


    static {
        try

        {
    System.loadLibrary("MyLib");
    System.loadLibrary("Opencv_java3");
        }
        catch(UnsatisfiedLinkError e)
        {
            System.err.println("unable to load the opencv   library"+e.toString());
        }
}
public native void imageFromJNI(long inputImage,long outputImage);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  final ImageView imageView=(ImageView)findViewById(R.id.imageView_id);

final Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.read);//reading the image from drawable
    imageView.setImageBitmap(bitmap);// display the decoded image 
  final Mat inputImage=new Mat();//The input image to be sent
     Utils.bitmapToMat(bitmap,inputImage); //change the bitmap to mat to pass the image as argument
     final Mat outputImage=new Mat();//The result image to be returned
    final Button blurButton=(Button)findViewById(R.id.blurButton_id);//Blur button to blur the displayed image when pressed
     blurButton.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
   int[] colors={0};
              Bitmap outputImageBitmap=Bitmap.createBitmap(colors,inputImage.cols(),inputImage.rows(),Bitmap.Config.RGB_565);// I think this creates a bitmap equals to inputImage height and width and RGB channels.
             imageFromJNI(inputImage.getNativeObjAddr(),outputImage.getNativeObjAddr());//call to native method
             Utils.matToBitmap(outputImage,outputImageBitmap);//the outputImage is changed into Bitmap in order to be displayed in the image view
             imageView.setImageBitmap(outputImageBitmap);
             blurButton.setEnabled(false);

         }
     });
}

}

c ++代码

JNIEXPORT void  JNICALL
Java_com_example_the_opencvc_MainActivity_imageFromJNI(JNIEnv *env, 
jobject ZObject,jlong inputImage,jlong outputImage) {
Mat &mat = *(Mat *) inputImage;
Mat &outputMat=*(Mat *)outputImage;
Mat mat_gray;
GaussianBlur(mat,mat,Size(3,3),0,0,BORDER_DEFAULT);
cvtColor(mat,mat_gray,CV_BGRA2GRAY);
Mat mat_gradientX,mat_gradientY;
Mat mat_gradientX_abs,mat_gradientY_abs;
//apply sobel derivative

Sobel(mat_gray,mat_gradientX,-1,1,0,3,1,0,BORDER_DEFAULT);
convertScaleAbs(mat_gradientX,mat_gradientX_abs);
//gradient y
Sobel(mat_gray,mat_gradientY,-1,0,1,3,1,0,BORDER_DEFAULT);
convertScaleAbs(mat_gradientY,mat_gradientX_abs);
//total gradient
addWeighted(mat_gradientX_abs, 0.5 , mat_gradientY_abs , 0.5 , 0 ,
outputMat);
}

当我运行应用程序时,显示已解码的图像但是当我按下模糊按钮时不幸的是你的应用程序停止错误显示没有特定的原因导致这个错误在logcat中说你的应用程序因此而停止工作。所以大家好做错了如果是这样我如何将图像从android java传递给JNI并将其返回并显示结果图像或在上面的代码中指出我的错误。 谢谢!

好的,这是logcat enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

我解决了问题,这不是我在java和c ++中使用opencv的代码问题。要在c ++中使用opencv我有Android.mk和Application.mk文件并使用java我正在使用Application Development with Static Initialization 。这是我没有将opencv-android-sdk \ sdk \ native \ libs文件夹中的libs文件夹复制到我的app \ src \ main目录的问题。