簡體   English   中英

如何將圖像從android java傳遞到JNI以使用opencv過濾圖像並返回到android java?

[英]How to pass image from android java to JNI to filter the image using opencv and return back to android java?

我想將圖像從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 在這里輸入圖像描述

在此處輸入圖片說明

我解決的問題不是代碼問題,我在Java和C ++中使用opencv。要在C ++中使用opencv,我有Android.mk和Application.mk文件,要使用Java,我在使用帶有靜態初始化的應用程序開發。問題是我沒有將opencv-android-sdk \\ sdk \\ native \\ libs文件夾中的libs文件夾復制到我的app \\ src \\ main目錄中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM