前言
当前,深度学习有很多框架:tensorflow、pytorch、caffe、keras等。很多场景下,需要训练好的模型在移动端运行。移动端的框架又有很多TensorFlow Lite、Core ML、NCNN、MNN等等。
其中 tensorflow 所对应的移动端移植框架 TensorFlow Lite。在自己这个系列记录使用 调用tfile进行神经网络预测的android的实现。
整个记录为:
Android(1) —— Android studio 开发环境搭建
Android(2) —— Android Studio找不到连接的手机
Android(3) —— 环境配置、手机端界面设计
Android(4) —— 图像分类的*.tfile的使用 Classify.java
Android(5) —— 安卓机通过相机或相册获取图片PhotoUtil.java
Android(6) —— 主函数的详解 MainActivity.java
1 代码讲解
1.1 代码概述
该脚定义了通过安卓机的相机或相册,来获取到具体的图片路径。是通过定义了
public class PhotoUtil
来实现的。内容比较简单。
其中实现内容,一定要先了解 Cursor 的使用。
1.2 开启相机进行拍照
- 设置图片保存路径。如果存在,删除重建;如果不存在,直接创建。获取该图像的 Uri
- 创建 Intent,用于保存拍照图片相关的信息
- startActivityForResult
// start camera public static String start_camera(Activity activity, int requestCode) { Uri imageUri; // save image in cache path File outputImage = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/lite_mobile/", System.currentTimeMillis() + ".jpg"); Log.d("outputImage", outputImage.getAbsolutePath()); try { if (outputImage.exists()) { outputImage.delete(); } File out_path = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/lite_mobile/"); if (!out_path.exists()) { out_path.mkdirs(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT >= 24) { // compatible with Android 5.0 or over imageUri = FileProvider.getUriForFile(activity, "com.example.classificationdemo.provider", outputImage); } else { imageUri = Uri.fromFile(outputImage); } // set system camera Action Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //新建一个意图 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // set save photo path intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // set photo quality, min is 0, max is 1 intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); activity.startActivityForResult(intent, requestCode);//启动当前意图 第一个参数是Intent对象 第二个参数是请求的一个标识 // return image absolute path return outputImage.getAbsolutePath(); }
1.3 打开相册获取图片路径
- intent.setType(“image/*”); //选择图片
- intent.setType(“audio/*”); //选择音频
- intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
- intent.setType(“video/;image/”); //同时选择视频和图片
// get picture in photo public static void use_photo(Activity activity, int requestCode) { Intent intent = new Intent(Intent.ACTION_PICK); //intent的action属性 intent.setType("image/*"); activity.startActivityForResult(intent, requestCode); }
1.4 图片的 Uri 转 Path
在该工程里,为了确保获取到路径,可以使用两种方式得到路径。(1) 通过 Uri;(2) 通过Cursor。
Android Uri 的相关介绍 。// get photo from Uri public static String get_path_from_URI(Context context, Uri uri) { String result; Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); if (cursor == null) { result = uri.getPath(); } else { cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); result = cursor.getString(idx); cursor.close(); } return result; } }