在 Java 中将位图转换为 mat 以进行图像处理

Converting bitmap to mat in Java for image processing

您好,我想在我的 Java Android 项目中使用 openCV 进行图像处理。所以现在我在读取图像文件并将其转换为 mat 时遇到问题。我试过直接读取图像并将其读取为 Mat 但仍然不起作用:

//get image source from folder
    String imgPath =  Environment.getExternalStorageDirectory().toString() + "/SimpleAndroidOCR/ocr.jpg";
    Mat sourceImage = Imgcodecs.imread(imgPath);

然后我尝试获取位图并将其转换为 Mat 但仍然不起作用:

Bitmap bitmap1 = BitmapFactory.decodeFile(_path, options);
Mat sourceImage = new Mat();
Utils.bitmapToMat(bitmap1 , sourceImage);

谁能告诉我我做错了什么? 提前致谢

由于您在 android 中使用 OpenCV,因此有两种可能性:

  • 您提供的图片路径可能不存在,请尝试记录您的图片路径,并检查是否确实存在。

  • 如果您完全确定该路径有效,请检查您是否在android项目的Manifest文件中定义了External Storageread/write的权限。

我找到了解决我自己问题的方法。 我指的是 Android & OpenCV : Utils.bitmapToMat crashes,它提到我们需要加载库才能使用 openCV 相关代码 这是我加载库的代码:

 private BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        if(status == LoaderCallbackInterface.SUCCESS){

        }else{
            super.onManagerConnected(status);
        }

    }
};

public void onResume(){
    super.onResume();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallBack);
}

请注意,您应该更改 opencv 版本以匹配您使用的版本。

为了将位图转换为垫子,我指的是这个 https://groups.google.com/forum/#!topic/android-opencv/8EoxpTb4W3E bitmaptomat 只有在我们有适当的位图格式时才有效,即 ARGB_8888 这是我的代码:

    private Bitmap JPGtoRGB888(Bitmap img){
        Bitmap result = null;

        int numPixels = img.getWidth() * img.getHeight();
        int[] pixels = new int[numPixels];

//        get jpeg pixels, each int is the color value of one pixel
        img.getPixels(pixels,0,img.getWidth(),0,0,img.getWidth(),img.getHeight());

//        create bitmap in appropriate format
        result = Bitmap.createBitmap(img.getWidth(),img.getHeight(), Bitmap.Config.ARGB_8888);

//        Set RGB pixels
        result.setPixels(pixels, 0, result.getWidth(), 0, 0, result.getWidth(), result.getHeight());

        return result;
    }

这里会调用这个函数

Bitmap bmp32 = JPGtoRGB888(bitmap);
Mat sourceImage = new Mat();
Utils.bitmapToMat(bmp32, sourceImage);

然后就可以处理sourceImage了 希望这有帮助 干杯!