如何在android

时间:2016-10-06 14:59:23

标签: android opencv

我是Android的OpenCV新手。我只想对android中的openCV lib进行一次小测试。我下载了一个图像.JPG并将其放在drawable文件夹中,我使用下面的代码来读取图像并显示其大小。 当我运行下面的代码时,我得到的图像大小是0x0,尽管它超过400 kb。

为什么大小为0x0以及如何获得正确的大小?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                    Log.i("OpenCV", "OpenCV loaded successfully");

                    Mat image = readImageFromResources();
                    Log.i(TAG, "size: " + image.size());
                    Log.i(TAG, "rows: " + image.rows());
                    Log.i(TAG, "cols: " + image.cols());

                    break;
                default:
                    super.onManagerConnected(status);
                    break;
            }
        }

        private Mat readImageFromResources() {
            return Imgcodecs.imread(getResources().getDrawable(R.drawable.see).toString());
        }
    };
}

1 个答案:

答案 0 :(得分:0)

首先,您必须在AndroidManifest.xml添加权限才能阅读图片:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

其次,要使用OpenCV在Android中加载资源,您应该使用方法Utils.loadResource()(请参阅JavaDoc)。所以,你的方法应该是这样的:

private Mat readImageFromResources() {
    Mat img = null;
    try {
        img = Utils.loadResource(this, R.drawable.see);
        Imgproc.cvtColor(img, img, Imgproc.COLOR_RGB2BGRA);
    } catch (IOException e) {
        Log.e(TAG,Log.getStackTraceString(e));
    }
    return img;
}

我们需要转换图像,因为OpenCV将其矩阵内部存储为BGR(蓝色,绿色和红色)格式。

您可以添加标志作为第三个参数,以特定方式打开图像:

  • Imgcodecs.CV_LOAD_IMAGE_UNCHANGED
  • Imgcodecs.CV_LOAD_IMAGE_ANYCOLOR
  • Imgcodecs.CV_LOAD_IMAGE_ANYDEPTH
  • Imgcodecs.CV_LOAD_IMAGE_COLOR
  • Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE

例如:Utils.loadResource(this, R.drawable.see, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);

如果您想在ImageView中显示图像,可以执行以下操作:

private void showImg(Mat img) {
    final Bitmap bm = Bitmap.createBitmap(img.cols(), img.rows(),Bitmap.Config.RGB_565);
    Utils.matToBitmap(img, bm);
    final ImageView imageView = (ImageView) findViewById(R.id.img_view);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            imageView.setImageBitmap(bm);
        }
    });
}

注意:上面的代码适用于OpenCV 3.x,如果您使用的是OpenCV 2.x,请将Imgcodecs替换为Highgui