![](/img/trans.png)
[英]Android-circular area extraction from an image using openCV with 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.