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

时间:2016-04-04 04:01:02

标签: java android opencv bitmap mat

您好我想在我的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);

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

2 个答案:

答案 0 :(得分:2)

我为自己的问题找到了解决方案。 我引用了这个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版本以匹配您使用的版本。

为了将位图转换为mat,请参考此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 希望这是有帮助的 干杯!

答案 1 :(得分:0)

当你在Android上使用OpenCV时,有两种可能性:

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

  • 如果您完全确定路径有效,请检查您是否在Android项目的清单文件中定义了外部存储读/写权限。