mappedRecognitions = new LinkedList<>();
+ for (final Classifier.Recognition result : results)
+ {
+ final RectF location = result.getLocation();
+ if (location != null && result.getConfidence() >= minimumConfidence)
+ {
+ result.setLocation(location);
+ /* 将通过最低置信度的结果添加到新List */
+ mappedRecognitions.add(result);
+ //识别结果
+ Log.e("result: ", result.getTitle() + result.getConfidence());
+ drawBitmap(result, draw);
+ }
+ }
+
+ return gson.toJson(mappedRecognitions.size() > 0 ? mappedRecognitions : recognitions);
+ }
+
+ private void drawBitmap(Classifier.Recognition result, Bitmap resultBitmap)
+ {
+ final Canvas canvas = new Canvas(resultBitmap);
+ final Paint paint = new Paint();
+ paint.setColor(Color.RED);
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(2.0f);
+ canvas.drawRect(result.getLocation(), paint);
+ SaveBitmap = resultBitmap.copy(Bitmap.Config.ARGB_8888, true);
+ }
+}
diff --git a/app/src/main/java/com/uns/maincar/open_source/utils/BitmapProcess.java b/app/src/main/java/com/uns/maincar/open_source/utils/BitmapProcess.java
new file mode 100644
index 0000000..a5aafaa
--- /dev/null
+++ b/app/src/main/java/com/uns/maincar/open_source/utils/BitmapProcess.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) https://github.com/gh-xiao/EmbeddedCar
+ * This file is pull from GitHub open source project
+ * Integrated by UnknownObject at 2023 - 6 - 7
+ */
+
+package com.uns.maincar.open_source.utils;
+
+import android.annotation.SuppressLint;
+import android.content.ContentValues;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.os.ParcelFileDescriptor;
+import android.provider.MediaStore;
+import android.util.Log;
+
+import org.opencv.android.Utils;
+import org.opencv.core.Mat;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.opencv.imgproc.Imgproc;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+public class BitmapProcess
+{
+ @SuppressLint("StaticFieldLeak")
+ private static BitmapProcess mInstance;
+ private Context mContext;
+ // 指定我们想要存储文件的地址
+ public static final String TargetPath = Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM + "/Tess/";
+ // 获取时间
+ private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss", Locale.CHINA);
+
+ private BitmapProcess()
+ {
+ }
+
+ public static synchronized BitmapProcess getInstance()
+ {
+ if (mInstance == null)
+ {
+ mInstance = new BitmapProcess();
+ }
+ return mInstance;
+ }
+
+ public void init(Context context)
+ {
+ this.mContext = context.getApplicationContext();
+ }
+
+ /**
+ * 全局使用的图片保存方法
+ *
+ * @param name 图片名
+ * @param mat 需要保存的mat
+ */
+ public static void saveBitmap(String name, Mat mat)
+ {
+ if (mat == null) return;
+ Bitmap bm = Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888);
+ Utils.matToBitmap(mat, bm);
+ saveBitmap(name, bm);
+ }
+
+ /**
+ * 全局使用的图片保存方法
+ *
+ * @param name 图片名
+ * @param bm 需要保存的Bitmap
+ * @return 是否保存成功
+ */
+ public static String saveBitmap(String name, Bitmap bm)
+ {
+ if (bm == null) return "错误,没有图片!";
+ return Build.VERSION.SDK_INT < 29 ? saveImageOld(name, bm) : mInstance.saveImageNew(name, bm);
+ }
+
+ /**
+ * 旧版本Android保存图片方法
+ *
+ * @param name 图片名
+ * @param bm 等待保存的Bitmap
+ * @return 是否保存成功
+ */
+ private static String saveImageOld(String name, Bitmap bm)
+ {
+ Log.d("Save Bitmap", "Ready to save picture");
+ StringBuilder append = new StringBuilder().append("Save Path = ");
+ String str = TargetPath;
+ Log.d("Save Bitmap", append.append(str).toString());
+ if (fileIsExist())
+ {
+ try
+ {
+ FileOutputStream saveImgOut = new FileOutputStream(new File(str, name + "-" + format.format(new Date()) + ".jpg"));
+ bm.compress(Bitmap.CompressFormat.JPEG, 80, saveImgOut);
+ saveImgOut.flush();
+ Log.d("Save Bitmap", "The picture is save to your phone!");
+ return "保存完毕!";
+ }
+ catch (IOException ex)
+ {
+ ex.printStackTrace();
+ return "IOException!";
+ }
+ }
+ else
+ {
+ Log.d("Save Bitmap", "TargetPath isn't exist");
+ return "TargetPath isn't exist!";
+ }
+ }
+
+ static boolean fileIsExist()
+ {
+ File file = new File(TargetPath);
+ return file.exists() || file.mkdirs();
+ }
+
+ /**
+ * 高版本Android保存图片方法
+ *
+ * @param name 图片名
+ * @param bm 等待保存的Bitmap
+ * @return 是否保存成功
+ */
+ private String saveImageNew(String name, Bitmap bm)
+ {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put("_display_name", name + format.format(new Date()));
+ contentValues.put("description", name);
+ contentValues.put("mime_type", "image/jpeg");
+ contentValues.put("relative_path", "DCIM/Tess");
+ try (OutputStream outputStream = mContext.getContentResolver()
+ .openOutputStream(mContext.getContentResolver()
+ .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)))
+ {
+ bm.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
+ Log.d("Save Bitmap", "Save success!");
+ return "保存完毕!";
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ Log.d("Save Bitmap", "Save fail!");
+ return "Exception!";
+ }
+ }
+
+ /**
+ * 通过URL获取图片
+ *
+ * @param uri -
+ * @return Bitmap
+ */
+ public Bitmap showImage(Uri uri)
+ {
+ try (ParcelFileDescriptor parcelFileDescriptor = mContext.getContentResolver().openFileDescriptor(uri, "r"))
+ {
+ return BitmapFactory.decodeFileDescriptor(parcelFileDescriptor.getFileDescriptor());
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * 通过图片名获取Tess文件夹对应的图片
+ *
+ * @param imageName 图片名
+ * @return Bitmap
+ */
+ public static Bitmap getImages(String imageName)
+ {
+ String path = TargetPath + imageName;
+ return new File(path).exists() ? BitmapFactory.decodeFile(path) : null;
+ }
+
+ /**
+ * 通过绝对路径获取Bitmap
+ *
+ * @param realPath 绝对路径
+ * @return Bitmap
+ */
+ public static Bitmap getRealPathImages(String realPath)
+ {
+ return new File(realPath).exists() ? BitmapFactory.decodeFile(realPath) : null;
+ }
+
+ /**
+ * 灰度化图像
+ *
+ * @param inputBitmap 需要灰度化图像的Bitmap
+ * @return 灰度化后的Bitmap
+ */
+ public static Bitmap GrayscaleImage(Bitmap inputBitmap)
+ {
+ if (inputBitmap == null) return null;
+ Mat mat = new Mat();
+ Utils.bitmapToMat(inputBitmap, mat);
+ return GrayscaleImage(mat);
+ }
+
+ /**
+ * 灰度化图像
+ *
+ * @param colorImage 需要灰度化图像的Bitmap
+ * @return 灰度化后的Bitmap
+ */
+ public static Bitmap GrayscaleImage(Mat colorImage)
+ {
+ if (colorImage == null) return null;
+ // 创建一个空的灰度图像
+ Mat grayscaleImage = new Mat();
+ // 调用cvtColor函数,将彩色图像转换为灰度图像
+ Imgproc.cvtColor(colorImage, grayscaleImage, Imgproc.COLOR_RGB2GRAY);
+ Bitmap result = Bitmap.createBitmap(colorImage.width(), colorImage.height(), Bitmap.Config.ARGB_8888);
+ Utils.matToBitmap(grayscaleImage, result);
+ return result;
+ }
+
+ /**
+ * 灰度化图像并保存
+ */
+ private void GrayscaleImage()
+ {
+ // 定义源文件夹和目标文件夹的路径
+ String sourcePath = Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM + "/srcImg/";
+ String targetPath = Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM + "/dstImg/";
+ // 创建File对象,表示源文件夹和目标文件夹
+ File sourceFolder = new File(sourcePath);
+ File targetFolder = new File(targetPath);
+ // 检查源文件夹是否存在,如果不存在,打印错误信息并退出
+ if (!sourceFolder.exists())
+ {
+ System.out.println("Source folder does not exist.");
+ return;
+ }
+ // 检查目标文件夹是否存在,如果不存在,就创建一个
+ if (!targetFolder.exists()) if (!targetFolder.mkdir()) return;
+ // 获取源文件夹中的所有文件,存放在一个File数组中
+ File[] files = sourceFolder.listFiles();
+ if (files == null) return;
+ // 遍历File数组,对每个文件进行灰度化处理
+ for (File file : files)
+ {
+ // 获取文件
+ Bitmap bitmap = BitmapProcess.getRealPathImages(sourcePath + file.getName());
+ if (bitmap == null) continue;
+ // 加载原始图像
+ Mat colorImage = new Mat();
+ Utils.bitmapToMat(bitmap, colorImage);
+ // 创建一个空的灰度图像
+ Mat grayscaleImage = new Mat();
+ // 调用cvtColor函数,将彩色图像转换为灰度图像
+ Imgproc.cvtColor(colorImage, grayscaleImage, Imgproc.COLOR_RGB2GRAY);
+ Utils.matToBitmap(grayscaleImage, bitmap);
+ // 获取文件的名称,不包括扩展名
+ StringBuilder fileName = new StringBuilder();
+ for (int j = 0; j < file.getName().split("\\.").length - 1; j++)
+ {
+ fileName.append(file.getName().split("\\.")[j]).append(".");
+ }
+ Imgcodecs.imwrite(file.getName(), grayscaleImage);
+ if (file.getName().split("\\.")[file.getName().split("\\.").length - 1].equals("jpg"))
+ {
+ try
+ {
+ FileOutputStream saveImgOut = new FileOutputStream(new File(targetPath, fileName + "jpg"));
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 80, saveImgOut);
+ saveImgOut.flush();
+ Log.d("Save Bitmap", "The picture is save to your phone!");
+ }
+ catch (IOException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ else
+ {
+ try
+ {
+ FileOutputStream saveImgOut = new FileOutputStream(new File(targetPath, fileName + "png"));
+ bitmap.compress(Bitmap.CompressFormat.JPEG, 80, saveImgOut);
+ saveImgOut.flush();
+ Log.d("Save Bitmap", "The picture is save to your phone!");
+ }
+ catch (IOException ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/uns/maincar/open_source/utils/ColorHSV.java b/app/src/main/java/com/uns/maincar/open_source/utils/ColorHSV.java
new file mode 100644
index 0000000..58395b1
--- /dev/null
+++ b/app/src/main/java/com/uns/maincar/open_source/utils/ColorHSV.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) https://github.com/gh-xiao/EmbeddedCar
+ * This file is pull from GitHub open source project
+ * Integrated by UnknownObject at 2023 - 6 - 7
+ */
+
+package com.uns.maincar.open_source.utils;
+
+/**
+ * Hsv色彩空间范围
+ * 以下排序使用HSV的H(色彩度数)排序
+ * 数组下标为2,4,6时是最小值,下标为1,3,5时是最大值
+ * 由于HSV模型的特性,红色被划分为了两个部分,因而使用了两个数组
+ */
+@SuppressWarnings("ALL")
+public final class ColorHSV
+{
+ /* 图形识别色彩数据 */
+ //所有H(色彩度)
+ public static final int[] allHSV = new int[]{0, 180, 0, 255, 150, 255, 110};
+ //红色:0-20
+ public static final int[] redDownHSV = new int[]{0, 25, 0, 255, 110, 255, 110};
+ public static final int[] redDownHSV1 = new int[]{0, 25, 0, 255, 150, 255, 110};
+ //红色:160-180
+ public static final int[] redUpHSV = new int[]{0, 180, 160, 255, 150, 255, 110};
+ public static final int[] redUpHSV1 = new int[]{0, 180, 150, 255, 110, 255, 110};
+ //黄色
+ public static final int[] yellowHSV = new int[]{0, 43, 25, 255, 150, 255, 110};
+ public static final int[] yellowHSV1 = new int[]{0, 43, 25, 255, 110, 255, 225};
+ //绿色
+ public static final int[] greenHSV = new int[]{0, 70, 55, 255, 150, 255, 110};
+ public static final int[] greenHSV1 = new int[]{0, 70, 40, 255, 150, 255, 110};
+ //青色
+ public static final int[] cyanHSV = new int[]{0, 95, 85, 255, 150, 255, 110};
+ public static final int[] cyanHSV1 = new int[]{0, 95, 85, 255, 190, 255, 110};
+ //蓝色
+ public static final int[] blueHSV = new int[]{0, 120, 110, 255, 150, 255, 110};
+ public static final int[] blueHSV1 = new int[]{0, 130, 95, 255, 225, 255, 110};
+ public static final int[] blueHSV2 = new int[]{0, 120, 85, 255, 210, 255, 195};
+ public static final int[] blueHSV3 = new int[]{0, 120, 85, 255, 210, 255, 110};
+ public static final int[] blueHSV4 = new int[]{0, 130, 110, 255, 210, 255, 195};
+ //蓝色 - 红色取反
+ public static final int[] red2blueHSV = new int[]{0, 140, 110, 255, 150, 255, 110};
+ //紫色
+ public static final int[] purpleHSV = new int[]{0, 160, 125, 255, 150, 255, 110};
+ public static final int[] purpleHSV1 = new int[]{0, 155, 125, 255, 150, 255, 110};
+ public static final int[] purpleHSV2 = new int[]{0, 155, 125, 255, 125, 255, 110};
+ public static final int[] purpleHSV3 = new int[]{0, 155, 125, 255, 125, 255, 200};
+ //实验性 - 白
+ public static final int[] whiteHSV = new int[]{0, 110, 0, 60, 0, 255, 225};
+ //实验性 - 黑
+ public static final int[] blackHSV = new int[]{0, 100, 47, 225, 50, 60, 0};
+
+ /* 车牌识别数据 */
+ //浅蓝0、//黄色1、//品红2、//浅红色3、//蓝色4、//青色5、// 深红色6、//黑色7 车牌蓝底9 车牌绿底10
+ public static double[][] PlateDetector_HSV_VALUE_LOW = {
+ {10, 163, 147}, //浅蓝0
+ {77, 163, 147}, //黄色1
+ {146, 212, 140},//品红2
+ {126, 155, 160},//浅红色3
+ {0, 204, 178}, //蓝色4
+ {35, 163, 147}, //青色5
+ {110, 155, 160},//深红色6
+ {0, 0, 0}, //黑色7
+ {0, 0, 192}, //标准蓝8
+ {0, 190, 190}, //车牌蓝底9 暗的TFT:0,190,190 亮的:0,180,190
+ {22, 195, 158}, //车牌绿底10 暗的TFT H:21 S要调高一点:210 V:211 亮的TFT S值要调底一点:110 10,100,148
+ {65, 0, 200}, //新能源车牌白变绿渐变
+ };
+
+ public static double[][] PlateDetector_HSV_VALUE_HIGH = {
+ {47, 255, 255}, //浅蓝0
+ {111, 255, 255}, //黄色1
+ {241, 255, 255.0}, //品红2
+ {150, 255, 255}, //浅红色3
+ {21, 255, 255}, //蓝色4
+ {75, 255.0, 255}, //青色5
+ {150, 255, 255}, //深红色6
+ {180, 255, 120}, //黑色7
+ {45, 238, 255}, //标准蓝8
+ {28, 255, 255}, //车牌蓝底9 亮暗一样
+ {73, 255, 255}, //车牌绿底10 暗H:66 亮H:83
+ {110, 255, 255}, //新能源车牌白变绿渐变
+ };
+
+ //浅蓝0、//黄色1、//品红2、//浅红色3、//蓝色4、//青色5、// 深红色6、//黑色7
+ //暗 S、V=214,211 亮 S、V=176,160
+ //浅蓝0、//黄色1、//品红2、//浅红色3、//蓝色4、//青色5、// 深红色6、//黑色7 车牌蓝底9 车牌绿底10
+ public static double[][] HSV_VALUE_LOW = {
+ {13, 176, 160},//浅蓝0 12,214,211
+ {67, 176, 160},//黄色1
+ {130, 176, 160},//品红2 暗:100, 176,160 亮:130,176,160
+ {126, 176, 160},//浅红色3
+ {0, 176, 160},//蓝色4
+ {30, 176, 160},//青色5 35
+ {103, 176, 160},// 深红色6
+ {0, 0, 0},//黑色7 暗:0,187,0 亮:0,0,0
+ {0, 0, 192},//标准蓝8
+ {0, 150, 190},//车牌蓝底9 暗的TFT:0,190,190 亮的:0,180,190
+ {22, 104, 161},//车牌绿底10 暗的TFT H:21 S要调高一点:210 V:211 亮的TFT S值要调底一点:110 10,100,148
+ };
+
+ public static double[][] HSV_VALUE_HIGH = {
+ {30, 255, 255},//浅蓝0
+ {111, 255, 255},//黄色1
+ {241, 255, 255.0},//品红2
+ {150, 255, 255},//浅红色3
+ {12, 255, 255},//蓝色4
+ {70, 255.0, 255},//青色5 90
+ {150, 255, 255},// 深红色6
+ {255, 255, 150},//黑色7 暗:28,255,184 亮:255,255,150
+ {45, 238, 255},//标准蓝8
+ {126, 255, 255},//车牌蓝底9 亮暗一样
+ {120, 255, 255},//车牌绿底10 暗H:66 亮H:83
+ };
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/uns/maincar/open_source/utils/ShapeStatistics.java b/app/src/main/java/com/uns/maincar/open_source/utils/ShapeStatistics.java
new file mode 100644
index 0000000..81e92f2
--- /dev/null
+++ b/app/src/main/java/com/uns/maincar/open_source/utils/ShapeStatistics.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) https://github.com/gh-xiao/EmbeddedCar
+ * This file is pull from GitHub open source project
+ * Integrated by UnknownObject at 2023 - 6 - 7
+ */
+
+package com.uns.maincar.open_source.utils;
+
+import java.util.HashMap;
+
+/**
+ * 形状统计
+ */
+public class ShapeStatistics
+{
+
+ //统计形状数量
+ private HashMap shapeStatistics = new HashMap<>();
+
+ /**
+ * 获取指定形状的数量
+ *
+ * @param shapeName 三角形/矩形/菱形/五角星/圆形/总计
+ * @return 数量
+ */
+ public Integer getCounts(String shapeName)
+ {
+ return shapeStatistics.get(shapeName);
+ }
+
+ /**
+ * 设置形状的数量
+ *
+ * @param shapeStatistics 包含该形状数量的HashMap对象
+ */
+ public void setShapeStatistics(HashMap shapeStatistics)
+ {
+ this.shapeStatistics = shapeStatistics;
+ }
+}
diff --git a/app/src/main/java/com/uns/maincar/open_source/vehicle/YoloV5_tfLite_VIDDetector.java b/app/src/main/java/com/uns/maincar/open_source/vehicle/YoloV5_tfLite_VIDDetector.java
new file mode 100644
index 0000000..3794bd2
--- /dev/null
+++ b/app/src/main/java/com/uns/maincar/open_source/vehicle/YoloV5_tfLite_VIDDetector.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) https://github.com/gh-xiao/EmbeddedCar
+ * This file is pull from GitHub open source project
+ * Integrated by UnknownObject at 2023 - 6 - 7
+ */
+
+package com.uns.maincar.open_source.vehicle;
+
+import android.content.res.AssetManager;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.os.SystemClock;
+import android.util.Log;
+
+import com.google.gson.Gson;
+
+import org.tensorflow.lite.examples.detection.env.Logger;
+import org.tensorflow.lite.examples.detection.tflite.Classifier;
+import org.tensorflow.lite.examples.detection.tflite.DetectorFactory;
+import org.tensorflow.lite.examples.detection.tflite.YoloV5Classifier;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 使用基于YoloV5-tfLite模型的交通标志物识别
+ */
+public class YoloV5_tfLite_VIDDetector
+{
+
+ // Which detection model to use: by default uses Tensorflow Object Detection API frozen
+ // checkpoints.
+// enum DetectorMode {TF_OD_API}
+
+ //日志对象
+ private static final Logger LOGGER = new Logger();
+ //枚举常量 - 检测模式
+// private static final DetectorMode MODE = DetectorMode.TF_OD_API;
+ public static final float MINIMUM_CONFIDENCE_TF_OD_API = 0.3f;
+ //最小置信度
+ public static float minimumConfidence;
+ //核心检测对象
+ private YoloV5Classifier detector;
+ //模型列表
+ private final String[] models = new String[]{"VIDyolov5s-fp16.tflite", "VIDyolov5s-fp16-2.tflite"};
+ //检测图片
+ private Bitmap SaveBitmap;
+ private long timestamp = 0;
+
+ public Bitmap getSaveBitmap()
+ {
+ return SaveBitmap;
+ }
+
+ /**
+ * 加载模型配置
+ *
+ * @param device 使用何种设备加载模型
+ * @param numThreads 使用多少线程加载
+ * @param assetManager assetManager管理对象
+ */
+ public boolean LoadModel(String device, int numThreads, AssetManager assetManager)
+ {
+ //模型文件
+ String modelString = models[0];
+ //检测类别(标签)
+ String labelFilename = "VIDclass.txt";
+ /* 线程数(不推荐超过9线程数) */
+ if (numThreads > 9) numThreads = 4;
+ LOGGER.i("Changing model to ***" + modelString + "*** device ***" + device + "***");
+
+ /* Try to load model. */
+ /* 尝试加载模型 */
+ try
+ {
+ detector = DetectorFactory.getDetector(assetManager, modelString, labelFilename);
+ // Customize the interpreter to the type of device we want to use.
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ LOGGER.e(e, "Exception in updateActiveModel()");
+// Toast toast = Toast.makeText(FirstActivity.getContext(), "Classifier could not be initialized", Toast.LENGTH_SHORT);
+ return false;
+ }
+
+ switch (device)
+ {
+ case "GPU":
+ detector.useGpu();
+ break;
+ case "NNAPI":
+ detector.useNNAPI();
+ break;
+ default:
+ detector.useCPU();
+ break;
+ }
+ /* 设置线程数 */
+ detector.setNumThreads(numThreads);
+ return true;
+ }
+
+ /**
+ * 检测图片
+ *
+ * @param inputBitmap -
+ * @return 检测结果
+ */
+ public String processImage(Bitmap inputBitmap)
+ {
+ /* 结果列表对象 */
+ List recognitions = new LinkedList<>();
+ /* 将结果转换成Gson */
+ Gson gson = new Gson();
+
+ if (inputBitmap == null) return gson.toJson(recognitions);
+ //416*416
+ int cropSize = detector.getInputSize();
+ System.out.println(cropSize);
+
+ int width = inputBitmap.getWidth();
+ int height = inputBitmap.getHeight();
+ float scaleWidth = ((float) cropSize) / width;
+ float scaleHeight = ((float) cropSize) / height;
+ //矩阵
+ Matrix matrix = new Matrix();
+ matrix.postScale(scaleWidth, scaleHeight);
+
+ /* 将输入图片通过矩阵变换得到416*416大小的新图片 */
+ Bitmap croppedBitmap = Bitmap.createBitmap(inputBitmap, 0, 0, width, height, matrix, true);
+ Bitmap draw = croppedBitmap.copy(Bitmap.Config.ARGB_8888, true);
+
+ ++timestamp;
+ final long currTimestamp = timestamp;
+
+ LOGGER.i("Preparing image " + currTimestamp + " for detection in bg thread.");
+ /* 利用分类器classifier对图片进行预测分析,得到图片为每个分类的概率. 比较耗时 */
+ LOGGER.i("Running detection on image " + currTimestamp);
+
+ final long startTime = SystemClock.uptimeMillis();
+ /* 核心检测 */
+ final List results = detector.recognizeImage(croppedBitmap);
+ /* 计算检测时间 */
+ long lastProcessingTimeMs = SystemClock.uptimeMillis() - startTime;
+ /* 检测出多少对象 */
+ Log.e("CHECK", "run: " + results.size());
+ /* 检测时间 */
+ Log.i("Time Spent: ", lastProcessingTimeMs + "ms");
+
+ /* 筛选通过最低置信度阈值的识别结果 */
+ final List mappedRecognitions = new LinkedList<>();
+ for (final Classifier.Recognition result : results)
+ {
+ final RectF location = result.getLocation();
+ if (location != null && result.getConfidence() >= minimumConfidence)
+ {
+ result.setLocation(location);
+ /* 将通过最低置信度的结果添加到新List */
+ mappedRecognitions.add(result);
+ //识别结果
+ Log.e("result: ", result.getTitle() + result.getConfidence());
+ drawBitmap(result, draw);
+ }
+ }
+
+ return gson.toJson(mappedRecognitions.size() > 0 ? mappedRecognitions : recognitions);
+// //最终结果
+// if (mappedRecognitions.size() != 0) {
+// /* 排列出最高置信度的结果 */
+// Collections.sort(mappedRecognitions, (o1, o2) -> (int) (o1.getConfidence() - o2.getConfidence()));
+// Log.e("SUCCESS", String.valueOf(mappedRecognitions.get(0).getConfidence()));
+// return mappedRecognitions.get(0).getTitle();
+// } else {
+// Log.e("ERROR", "识别错误");
+// return "car";
+// }
+ }
+
+ private void drawBitmap(Classifier.Recognition result, Bitmap resultBitmap)
+ {
+ final Canvas canvas = new Canvas(resultBitmap);
+ final Paint paint = new Paint();
+ paint.setColor(Color.RED);
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(2.0f);
+ canvas.drawRect(result.getLocation(), paint);
+ SaveBitmap = resultBitmap.copy(Bitmap.Config.ARGB_8888, true);
+ }
+}
diff --git a/app/src/main/res/layout/activity_single_function_test.xml b/app/src/main/res/layout/activity_single_function_test.xml
index 4a8c911..6366afe 100644
--- a/app/src/main/res/layout/activity_single_function_test.xml
+++ b/app/src/main/res/layout/activity_single_function_test.xml
@@ -185,4 +185,34 @@
android:layout_weight="1"
android:text="立即崩溃" />
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/git push.bat b/git push.bat
new file mode 100644
index 0000000..d4f1d4d
--- /dev/null
+++ b/git push.bat
@@ -0,0 +1,3 @@
+@echo off
+git push
+pause
\ No newline at end of file
diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/build_model.json b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/build_model.json
index e8de764..ba576b0 100644
--- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/build_model.json
+++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/build_model.json
@@ -25,10 +25,7 @@
"variantName": "debug",
"isDebuggableEnabled": true,
"validAbiList": [
- "ARMEABI_V7A",
- "ARM64_V8A",
- "X86",
- "X86_64"
+ "ARM64_V8A"
],
"buildTargetSet": [
"opencv_jni_shared"
@@ -128,6 +125,7 @@
"rootBuildGradleFolder": "F:\\Android-APK\\MainCar",
"sdkFolder": "D:\\Android_SDK",
"isBuildOnlyTargetAbiEnabled": true,
+ "ideBuildTargetAbi": "arm64-v8a,armeabi-v7a,armeabi",
"isCmakeBuildCohabitationEnabled": false,
"isPrefabEnabled": false
},
diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_820_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_820_timing.txt
index 9708df4..ad5cad1 100644
--- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_820_timing.txt
+++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_820_timing.txt
@@ -1,2 +1,4 @@
# C/C++ build system timings
+# C/C++ build system timings
+
diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/metadata_generation_record.json b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/metadata_generation_record.json
index e237955..3710bfd 100644
--- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/metadata_generation_record.json
+++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/metadata_generation_record.json
@@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -2145092568
+ "memoizedHashCode": -124854207
},
{
"level_": 0,
@@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -1070678757
+ "memoizedHashCode": 949559604
},
{
"level_": 0,
@@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 1022864176
+ "memoizedHashCode": -1251864759
}
]
\ No newline at end of file
diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/armeabi-v7a/metadata_generation_record.json b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/armeabi-v7a/metadata_generation_record.json
index 2d3b020..faff88f 100644
--- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/armeabi-v7a/metadata_generation_record.json
+++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/armeabi-v7a/metadata_generation_record.json
@@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 1208877764
+ "memoizedHashCode": -1065851171
},
{
"level_": 0,
@@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -1843829769
+ "memoizedHashCode": 176408592
},
{
"level_": 0,
@@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 2135484110
+ "memoizedHashCode": -139244825
}
]
\ No newline at end of file
diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt
index 5a75652..ccc9fb5 100644
--- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt
+++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt
@@ -189,3 +189,12 @@ generate_cxx_metadata
create-invalidation-state 15ms
generate_cxx_metadata completed in 20ms
+# C/C++ build system timings
+generate_cxx_metadata
+ create-invalidation-state 21ms
+generate_cxx_metadata completed in 26ms
+
+# C/C++ build system timings
+
+# C/C++ build system timings
+
diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json
index ed2e64e..a3a0f29 100644
--- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json
+++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json
@@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -900999380
+ "memoizedHashCode": 1119238981
},
{
"level_": 0,
@@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 1031690335
+ "memoizedHashCode": -1243038600
},
{
"level_": 0,
@@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 1830489698
+ "memoizedHashCode": -444239237
}
]
\ No newline at end of file
diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86_64/metadata_generation_record.json b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86_64/metadata_generation_record.json
index aa39c45..50cc464 100644
--- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86_64/metadata_generation_record.json
+++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86_64/metadata_generation_record.json
@@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -979162050
+ "memoizedHashCode": 1041076311
},
{
"level_": 0,
@@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -1733813153
+ "memoizedHashCode": 286425208
},
{
"level_": 0,
@@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -1316102415
+ "memoizedHashCode": 704135946
}
]
\ No newline at end of file
diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt
index a9e73bc..c1a091e 100644
--- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt
+++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt
@@ -105,3 +105,10 @@ generate_cxx_metadata
create-invalidation-state 11ms
generate_cxx_metadata completed in 17ms
+# C/C++ build system timings
+generate_cxx_metadata
+ create-invalidation-state 18ms
+generate_cxx_metadata completed in 23ms
+
+# C/C++ build system timings
+
diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json
index 637b450..d8498e3 100644
--- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json
+++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json
@@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -2068480099
+ "memoizedHashCode": 783740077
},
{
"level_": 0,
@@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 1874572633
+ "memoizedHashCode": 431825513
},
{
"level_": 0,
@@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 663008979
+ "memoizedHashCode": -779738141
}
]
\ No newline at end of file
diff --git a/opencv/build/intermediates/cxx/abi_configuration_311k5o12.log b/opencv/build/intermediates/cxx/abi_configuration_311k5o12.log
index c4a0027..322f767 100644
--- a/opencv/build/intermediates/cxx/abi_configuration_311k5o12.log
+++ b/opencv/build/intermediates/cxx/abi_configuration_311k5o12.log
@@ -11,6 +11,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -1169450043
+ "memoizedHashCode": 850788318
}
]
\ No newline at end of file
diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt
index 3b7d5a5..5becb44 100644
--- a/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt
+++ b/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt
@@ -1103,3 +1103,51 @@ create_cxx_tasks
create-initial-cxx-model completed in 92ms
create_cxx_tasks completed in 93ms
+# C/C++ build system timings
+create_cxx_tasks
+ create-initial-cxx-model
+ create-module-model
+ create-cmake-model 34ms
+ create-module-model completed in 36ms
+ create-module-model
+ create-cmake-model 32ms
+ create-module-model completed in 33ms
+ create-initial-cxx-model completed in 88ms
+create_cxx_tasks completed in 89ms
+
+# C/C++ build system timings
+create_cxx_tasks
+ create-initial-cxx-model
+ create-module-model
+ create-cmake-model 31ms
+ create-module-model completed in 33ms
+ create-module-model
+ create-cmake-model 41ms
+ create-module-model completed in 44ms
+ create-initial-cxx-model completed in 95ms
+create_cxx_tasks completed in 96ms
+
+# C/C++ build system timings
+create_cxx_tasks
+ create-initial-cxx-model
+ create-module-model
+ create-cmake-model 36ms
+ create-module-model completed in 38ms
+ create-module-model
+ create-cmake-model 34ms
+ create-module-model completed in 36ms
+ create-initial-cxx-model completed in 88ms
+create_cxx_tasks completed in 89ms
+
+# C/C++ build system timings
+create_cxx_tasks
+ create-initial-cxx-model
+ create-module-model
+ create-cmake-model 33ms
+ create-module-model completed in 36ms
+ create-module-model
+ create-cmake-model 30ms
+ create-module-model completed in 32ms
+ create-initial-cxx-model completed in 85ms
+create_cxx_tasks completed in 87ms
+
diff --git a/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log b/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log
index 9f45906..41e4888 100644
--- a/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log
+++ b/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log
@@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -327415425
+ "memoizedHashCode": 1692822936
},
{
"level_": 0,
@@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 464772678
+ "memoizedHashCode": -1809956257
},
{
"level_": 0,
@@ -39,7 +39,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 1169233871
+ "memoizedHashCode": -1105495064
},
{
"level_": 0,
@@ -53,7 +53,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -1262919355
+ "memoizedHashCode": 757319006
},
{
"level_": 0,
@@ -67,7 +67,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": 2139358359
+ "memoizedHashCode": -135370576
},
{
"level_": 0,
@@ -81,6 +81,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
- "memoizedHashCode": -1819628718
+ "memoizedHashCode": 200609643
}
]
\ No newline at end of file