私は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
ログキャットを追加する必要がある場合は、さらに調査する必要があります。 – UMESH0492
@ UMESH0492私はlogcatを追加しました。 – Yirga
Logcatに何も表示されないので、onclick listenerのコードを捕まえて例外を捕捉して印刷することをおすすめします。また、バックグラウンドスレッドでイメージのエンコーディングをデコードする必要があります。 – UMESH0492