我是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());
}
};
}
答案 0 :(得分:0)
首先,您必须在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
。