在 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了
希望这有帮助
干杯!
您好,我想在我的 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了 希望这有帮助 干杯!