2016-12-19 1 views
1

私はjavaからJNIに画像を渡し、いくつかのフィルターやその他の操作を行い、それをjavaに戻して画面に表示したいと思っています。ここで私が試したコードです。android javaからJNIに画像を渡して、opencvを使って画像をフィルタリングし、android 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); 
} 

私は、デコードされた画像が表示されているアプリケーションを実行するが、私は残念ながらぼかしボタンを押したときにアプリが停止した場合あなたのアプリがthis.Soのために動作を停止したと言うlogcatにこのエラーの特別な原因はありませんoid java to JNIを返して戻って結果イメージを表示するか、上記のコードで私のエラーを指摘してください。 ありがとう!ここ

[OK]を、私はそれは私がJavaとC++でのOpenCVを使用していたコードの問題ではありませんでした。CでのOpenCVを使用するには++ iのAndroid.mkを持っている問題を解決logcat enter image description here

enter image description here

+1

ログキャットを追加する必要がある場合は、さらに調査する必要があります。 – UMESH0492

+0

@ UMESH0492私はlogcatを追加しました。 – Yirga

+1

Logcatに何も表示されないので、onclick listenerのコードを捕まえて例外を捕捉して印刷することをおすすめします。また、バックグラウンドスレッドでイメージのエンコーディングをデコードする必要があります。 – UMESH0492

答えて

0

ですApplication.mkファイルを使用し、javaを使用するにはApplication Development with Static Initializationを使用していました。私はopencv-android-sdk \ sdk \ native \ libsフォルダのlibsフォルダを自分のapp \ src \ mainディレクトリにコピーしていませんでした。

関連する問題