【问题标题】:how to get the size of an image in android如何在android中获取图像的大小
【发布时间】:2016-10-11 01:03:56
【问题描述】:

我是 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());
        }
    };
}

【问题讨论】:

  • 您确定图片加载正确吗?尝试Mat image = new Mat(2,3,CV_8UC3)(或Java 中的任何正确语法)并检查大小是否正确
  • Imgcodecs.imread(getResources().getDrawable(R.drawable.see).toString()) Imgcodecs.imread("some random string")
  • @Selvin 我用谷歌搜索了如何使用 Android API 在 opencv 中读取图像,其中一个示例使用了相同的语法
  • 并且在其中一个示例中使用了相同的语法?链接或没有发生...我从未使用过 OpenCV,但 Imgcodecs.imread 似乎需要路径或字节而不是一些随机字符串
  • @Selvin 看这里:stackoverflow.com/questions/8131596/… Mehmet Taha Meral 的回答

标签: android opencv


【解决方案1】:

首先,您必须在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

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 2018-01-24
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多