继前一篇文章,我把torch1.10的模型导入到android stdio之后。我准备加入照相机功能。
关于android导入照相机,网上有很多类似的东西。但是我经过两天的尝试,终于弄好了。写一下我的心得体会。
首先真机调试。这个很简单,进入开发者模式之后用usb和电脑连起来就行。注意的是,可以把logcat切换到真机,不要在虚拟机上。不然你无法看到报错信息,这对之后的调试来说是致命的。
然后关于拍照,基础知识我就不介绍了。
大家可能都会遇到datanull的情况,导致无法得到uri传回的图片数据,也就无法进行图片识别。这里其实怎么知道datanull是很重要的,不然无从下手,我们可以在onActivityResult函数里面,加上下面的代码判断一下,加了toast,就会在手机上显示错误信息,不然无法知道哪里错了。
// if(data==null) //还是data为空的问题
// {
// Toast.makeText(this, "data为空", Toast.LENGTH_SHORT).show();
// return;
// }
既然已经知道这个问题了,网上也有说明这种情况的原因,就是android更新之后,如果在intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);这一句里面指定了uri,那么data将返回空。这是源码里面写的。这就很麻烦了。
android规定,指定uri返回的是全图,不指定返回的是缩略图。其实这样也挺好,模型计算也会快很多。所以替代办法就是,不指定uri,即把这一句注释掉。然后在void onActivityResult(int requestCode, int resultCode, Intent data)函数的最后一个参数data用@Nullable Intent intent代替。然后在函数里面用
Bundle bundle = intent.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");
这两句来提取数据。(其实用 Intent data也可以的,那么改成data.getExtras()就行了)结果发现识别速度很快。
还有一个小插曲就是,我这个笔记本之前用的是1.9的torch官方给的训练的模型,忘记改成1.10了,所以模型加载还是用的Litemoduleloader.load(),应该用module.load(),关于这一点之前说过了。主要的是这个开头报错是couldnt find libpytorch.so,没有看到下面module.load,所以我一直找关于动态库无法加载的错误,一下午都没有解决,这一点告诉我们,debug的时候要看全错误类型,不然往一个错误的方向努力是徒劳的。除了版本匹配问题,往往我们都是犯了很低级的错误才导致出错,要仔细检查自己的代码和错误信息,不要盲目debug。
从相册选照片暂时还没有实现,遇到点bug,感觉这也是棘手的一个问题。准备解决了,下一篇再说这个问题。
今天又实现了从相册中选取图片。这个其实实现起来还好。网上的代码可以直接用的。唯一注意的是void onActivityResult(int requestCode, int resultCode, Intent data) 这里的data其实并不是null,可以直接用。只是拍照的时候我们不要指定uri就行了。