简体   繁体   English

使用 OpenCV 在 Android Studio 中加载和显示图像

[英]Load and display image in Android Studio using OpenCV

I'm trying to load and display an image in Android Studio using OpenCV but it's crash.我正在尝试使用 OpenCV 在 Android Studio 中加载和显示图像,但它崩溃了。 I don't find where is the problem... Appreciate any helps!我没有找到问题出在哪里......感谢任何帮助! Thanks!谢谢!

public class MainActivity2 extends Activity {

private static final String TAG = "Kate : ";
BaseLoaderCallback mOpenCVCallBack;
Mat mRgba;
ImageView imge1;
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_activity2);
}


private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i(TAG, "OpenCV loaded successfully");
                mRgba=new Mat();
                load_AND_display();
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};

public void load_AND_display() {

    //getting ImageView
    imge1= (ImageView) findViewById(R.id.img1);

    try {
        //Loading Image to Mat object
        mRgba= Utils.loadResource(this,R.drawable.mako,Highgui.CV_LOAD_IMAGE_COLOR);
    } catch (IOException e) {
        e.printStackTrace();
    }
    // create a bitmap:
    Bitmap bm = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(),Bitmap.Config.ARGB_8888);
    // convert Mat image to bitmap::
    Utils.matToBitmap(mRgba, bm);
    //setting the image
    imge1.setImageBitmap(bm);
}

@Override
public void onResume() {
    super.onResume();
    mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    /*OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);*/
}

this is the Logcat:这是 Logcat:

05-05 15:54:20.323  29948-29948/com.example.myapplication E/art﹕ No      implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
05-05 15:54:20.323  29948-29948/com.example.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.myapplication, PID: 29948
java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)

Use the following steps:使用以下步骤:

  1. Create a loaderCallback variable to check for OpenCv in android studio in the main activty在主要活动中创建一个 loaderCallback 变量来检查 android studio 中的 OpenCv
private val mLoaderCallback: BaseLoaderCallback = object : BaseLoaderCallback(this) {
       override fun onManagerConnected(status: Int) {
           when (status) {
               SUCCESS -> {
                   Log.e("OpenCV", "OpenCV loaded successfully")
               }
               else -> {
                   super.onManagerConnected(status)
               }
           }
       }
   }
  1. In the onResume() of the main activity, check weather OpenCv has been loaded or not:在主要活动的onResume()中,检查天气 OpenCv 是否已加载:
override fun onResume() {
    super.onResume()
    if (!OpenCVLoader.initDebug()) {
        Log.d(
            "OpenCV",
            "Internal OpenCV library not found. Using OpenCV Manager for initialization"
        )
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback)
    } else {
        Log.d("OpenCV", "OpenCV library found inside package. Using it!")
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS)
    }
}
  1. In the Activity--before calling any opencv operations or initialization Mat--call this:在活动中——在调用任何opencv操作或初始化 Mat 之前——调用这个:
.....
setContentView(R.layout.activity_main)
OpenCVLoader.initDebug()
 .....
  1. For the image you want to use, convert the bitmap of the image to mat:对于要使用的图像,将图像的位图转换为mat:
val matObject = Mat()
Utils.bitmapToMat(mBitmap, matObject)

Here mBitmap is the bitmap of the image we want to use and Utils.bitmapToMat() is an in-built function of org.opencv.android* In your code, load the drawable as bitmap and then convert to mat.这里mBitmap是我们要使用的图像的位图, Utils.bitmapToMat()org.opencv.android*的内置函数在您的代码中,将 drawable 作为位图加载,然后转换为 mat。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM