【问题标题】:Converting bitmap to mat in Java for image processing在Java中将位图转换为mat以进行图像处理
【发布时间】:2016-07-23 12:08:05
【问题描述】:

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

谁能告诉我我做错了什么? 在此先感谢

【问题讨论】:

    标签: java android opencv bitmap mat


    【解决方案1】:

    由于你是在android上使用OpenCV,所以有两种可能:

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

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

    【讨论】:

    • 我完全确定路径图像存在,并且我已经在清单文件中定义了外部存储读/写的权限,但是当我在手机中运行它时它仍然崩溃;(
    • 那么你也应该在此处包含 TraceBack。
    【解决方案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 版本以匹配您使用的版本。

    为了将位图转换为垫子,我指的是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了 希望这会有所帮助 干杯!

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 2023-01-30
      相关资源
      最近更新 更多