From 7dd9bd8b6425ccb8fa0725f092485a187e44fcaf Mon Sep 17 00:00:00 2001 From: UnknownObject Date: Sat, 17 Jun 2023 23:06:36 +0800 Subject: [PATCH] fix crash bug --- .../colored_qr_detect/colored_qr_decode.cpp | 2 + .../com/uns/maincar/gui/MainActivity.java | 122 +++++++++++++++++- .../open_source/shape/ShapeDetector.java | 9 +- .../open_source/utils/BitmapProcess.java | 8 +- .../com/uns/maincar/tools/ImageSaver.java | 79 ++++++++++++ .../layout/activity_single_function_test.xml | 16 ++- .../generate_cxx_metadata_31_timing.txt | 3 + .../generate_cxx_metadata_4088_timing.txt | 2 + .../generate_cxx_metadata_463_timing.txt | 2 + .../arm64-v8a/metadata_generation_record.json | 6 +- .../metadata_generation_record.json | 6 +- .../x86/generate_cxx_metadata_296_timing.txt | 8 ++ .../x86/generate_cxx_metadata_31_timing.txt | 11 ++ .../meta/x86/metadata_generation_record.json | 6 +- .../x86_64/metadata_generation_record.json | 6 +- .../arm64-v8a/metadata_generation_record.json | 6 +- .../metadata_generation_record.json | 6 +- .../x86/generate_cxx_metadata_296_timing.txt | 6 + .../x86/generate_cxx_metadata_31_timing.txt | 5 + .../meta/x86/metadata_generation_record.json | 6 +- .../x86_64/metadata_generation_record.json | 6 +- .../cxx/abi_configuration_311k5o12.log | 2 +- .../cxx/create_cxx_tasks_1229_timing.txt | 12 ++ .../cxx/create_cxx_tasks_1466_timing.txt | 12 ++ .../cxx/create_cxx_tasks_296_timing.txt | 48 +++++++ .../cxx/create_cxx_tasks_31_timing.txt | 74 +++++++++++ .../cxx/create_cxx_tasks_5767_timing.txt | 12 ++ .../cxx/ndk_locator_record_50t213g5.log | 12 +- .../compile-file-map.properties | 2 +- .../previous-compilation-data.bin | Bin 18941 -> 18941 bytes 30 files changed, 455 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/uns/maincar/tools/ImageSaver.java diff --git a/app/src/main/cpp/colored_qr_detect/colored_qr_decode.cpp b/app/src/main/cpp/colored_qr_detect/colored_qr_decode.cpp index faafd6a..85ea11e 100644 --- a/app/src/main/cpp/colored_qr_detect/colored_qr_decode.cpp +++ b/app/src/main/cpp/colored_qr_detect/colored_qr_decode.cpp @@ -239,6 +239,8 @@ Java_com_uns_maincar_cpp_1interface_ColoredQRDecoder_GetSpecColorQR(JNIEnv *env, { cv::Mat next = global_colored_qr_decoder.GetCodeByColor( (uns::QRCode::Color) color).GetBinaryImage(); + if (next.empty()) + return nullptr; jobject bmp = GenerateBitmap(env, next.cols, next.rows); MatToBitmap(env, next, bmp); return bmp; diff --git a/app/src/main/java/com/uns/maincar/gui/MainActivity.java b/app/src/main/java/com/uns/maincar/gui/MainActivity.java index 040bd90..898ff40 100644 --- a/app/src/main/java/com/uns/maincar/gui/MainActivity.java +++ b/app/src/main/java/com/uns/maincar/gui/MainActivity.java @@ -31,6 +31,8 @@ import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.uns.maincar.R; import com.uns.maincar.communication.CommandDecoder; import com.uns.maincar.communication.CommandEncoder; @@ -58,8 +60,11 @@ import com.uns.maincar.tools.TextFilter; import com.uns.maincar.tools.camera.CameraOperator; import com.uns.maincar.tools.camera.CameraSearcher; +import org.tensorflow.lite.examples.detection.tflite.Classifier; + import java.io.UnsupportedEncodingException; import java.util.ArrayList; +import java.util.List; import java.util.Objects; public class MainActivity extends AppCompatActivity @@ -208,9 +213,11 @@ public class MainActivity extends AppCompatActivity case Commands.RECEIVE_TEXT_OCR: OCRRecognizeText(); break; + //收到车型识别指令,开始识别车型,回传识别成功的数据 case Commands.RECEIVE_VEHICLE: dtc_client.Send(RecognizeVehicle()); - //收到未知指令,回传异常指令,表示无法解析当前指令 + break; + //收到未知指令,回传异常指令,表示无法解析当前指令 default: CommandEncoder error = new CommandEncoder(); dtc_client.Send(error.GenerateCommand(Commands.CMD_NOT_MATCH, (byte) 0x00, (byte) 0x00, (byte) 0x00)); @@ -300,8 +307,12 @@ public class MainActivity extends AppCompatActivity if (!success) success = ColoredQRDecoder.BeginQRDecode(currImage, true); if (!success) + { + ToastLog("QR Decoder: Init Failure.", false, true); return encoder.GenerateCommand(Commands.QR_FAILED, (byte) 0, (byte) 0, (byte) 0); + } String result = ColoredQRDecoder.DecodeSpecColorQR(target_color); + ToastLog("QR Decoder Result: " + result, false, true); if (Objects.equals(result, ERR_COLOR_INVALIDATE) || Objects.equals(result, ERR_IMAGE_GENERATOR_FAILED) || Objects.equals(result, ERR_DECODE_FAILED)) return encoder.GenerateCommand(Commands.QR_FAILED, (byte) 0, (byte) 0, (byte) 0); else @@ -432,9 +443,60 @@ public class MainActivity extends AppCompatActivity return encoder.GenerateCommand(); }*/ //交通标志改用开源AI模型识别 + Gson json = new Gson(); String result = TS_Detector.processImage(currImage); ToastLog("Traffic Sign: " + result, false, true); - return encoder.GenerateCommand(); + try + { + List data = json.fromJson(result, new TypeToken>() + { + }.getType()); + if (data.size() <= 0) + return encoder.GenerateCommand(Commands.TRAFFIC_SIGN_FAILED, (byte) 0x00, (byte) 0x00, (byte) 0x00); + else + { + int max_index = 0; + double max_confidence = 0.0; + for (int i = 0; i < data.size(); i++) + { + if ((data.get(i) != null) && (data.get(i).getConfidence() > max_confidence)) + { + max_index = i; + max_confidence = ((Classifier.Recognition) data.get(i)).getConfidence(); + } + } + encoder.AddMainCommand(Commands.TRAFFIC_SIGN_SUCCESS); + switch (data.get(max_index).getTitle()) + { + case "go_straight": + encoder.AddData(Commands.TRAFFIC_SIGN_TYPE_STRAIGHT, (byte) 0x00, (byte) 0x00); + break; + case "no_turn": + encoder.AddData(Commands.TRAFFIC_SIGN_TYPE_NO_ENTRY, (byte) 0x00, (byte) 0x00); + break; + case "turn_around": + encoder.AddData(Commands.TRAFFIC_SIGN_TYPE_U_TURN, (byte) 0x00, (byte) 0x00); + break; + case "turn_left": + encoder.AddData(Commands.TRAFFIC_SIGN_TYPE_TURN_LEFT, (byte) 0x00, (byte) 0x00); + break; + case "turn_right": + encoder.AddData(Commands.TRAFFIC_SIGN_TYPE_TURN_RIGHT, (byte) 0x00, (byte) 0x00); + break; + case "no_straight": + encoder.AddData(Commands.TRAFFIC_SIGN_TYPE_NO_STRAIGHT, (byte) 0x00, (byte) 0x00); + break; + default: + encoder.AddMainCommand(Commands.TRAFFIC_SIGN_FAILED); + break; + } + return encoder.GenerateCommand(); + } + } + catch (Exception e) + { + return encoder.GenerateCommand(Commands.TRAFFIC_SIGN_FAILED, (byte) 0x00, (byte) 0x00, (byte) 0x00); + } } //识别静态文本 @@ -478,9 +540,60 @@ public class MainActivity extends AppCompatActivity { CommandEncoder encoder = new CommandEncoder(); //使用开源AI模型识别车型 + Gson json = new Gson(); String result = VID_Detector.processImage(currImage); ToastLog("Vehicle: " + result, false, true); - return encoder.GenerateCommand(); + try + { + List data = json.fromJson(result, new TypeToken>() + { + }.getType()); + if (data.size() <= 0) + return encoder.GenerateCommand(Commands.VEHICLE_FAILURE, (byte) 0x00, (byte) 0x00, (byte) 0x00); + else + { + int max_index = 0; + double max_confidence = 0.0; + for (int i = 0; i < data.size(); i++) + { + if ((data.get(i) != null) && (data.get(i).getConfidence() > max_confidence)) + { + max_index = i; + max_confidence = ((Classifier.Recognition) data.get(i)).getConfidence(); + } + } + encoder.AddMainCommand(Commands.VEHICLE_SUCCESS); + switch (data.get(max_index).getTitle()) + { + case "bike": + encoder.AddData(Commands.VEHICLE_TYPE_BIKE, (byte) 0x00, (byte) 0x00); + break; + case "motor": + encoder.AddData(Commands.VEHICLE_TYPE_MOTOR, (byte) 0x00, (byte) 0x00); + break; + case "car": + encoder.AddData(Commands.VEHICLE_TYPE_CAR, (byte) 0x00, (byte) 0x00); + break; + case "truck": + encoder.AddData(Commands.VEHICLE_TYPE_TRUCK, (byte) 0x00, (byte) 0x00); + break; + case "van": + encoder.AddData(Commands.VEHICLE_TYPE_VAN, (byte) 0x00, (byte) 0x00); + break; + case "bus": + encoder.AddData(Commands.VEHICLE_TYPE_BUS, (byte) 0x00, (byte) 0x00); + break; + default: + encoder.AddMainCommand(Commands.VEHICLE_FAILURE); + break; + } + return encoder.GenerateCommand(); + } + } + catch (Exception e) + { + return encoder.GenerateCommand(Commands.VEHICLE_FAILURE, (byte) 0x00, (byte) 0x00, (byte) 0x00); + } } //数组转字符串,仅用于调试输出 @@ -657,7 +770,6 @@ public class MainActivity extends AppCompatActivity CommandEncoder encoder = new CommandEncoder(); dtc_client.ThreadSend(encoder.GenerateCommand(Commands.TFT_PAGE_DOWN, (byte) 0, (byte) 0, (byte) 0)); ToastLog("TFT Page Down Command Send.", false, true); - context.finish(); }); context.findViewById(R.id.btn_movement_control).setOnClickListener(view -> startActivity(new Intent(this, MovementController.class))); @@ -688,7 +800,7 @@ public class MainActivity extends AppCompatActivity context.findViewById(R.id.btn_os_vehicle).setOnClickListener(view -> { - String res = TS_Detector.processImage(currImage); + String res = VID_Detector.processImage(currImage); ToastLog("Vehicle Result: " + res, false, false); context.finish(); }); diff --git a/app/src/main/java/com/uns/maincar/open_source/shape/ShapeDetector.java b/app/src/main/java/com/uns/maincar/open_source/shape/ShapeDetector.java index f971193..f07c0dc 100644 --- a/app/src/main/java/com/uns/maincar/open_source/shape/ShapeDetector.java +++ b/app/src/main/java/com/uns/maincar/open_source/shape/ShapeDetector.java @@ -36,6 +36,11 @@ import java.util.Map; public class ShapeDetector { + static + { + System.loadLibrary("opencv_java4"); + } + //目标类的简写名称 private static final String TAG = ShapeDetector.class.getSimpleName(); //轮廓绘制/轮廓统计 @@ -114,7 +119,8 @@ public class ShapeDetector */ public void shapePicProcess(Bitmap inputBitmap) { - if (inputBitmap == null) return; + if (inputBitmap == null) + return; /* openCV创建用来存储图像信息的内存对象 */ Mat srcMat = new Mat(); /* 转化为Mat对象 */ @@ -133,6 +139,7 @@ public class ShapeDetector return; ColorCounts.clear(); /* 保存用 */ + BitmapProcess.getInstance(); BitmapProcess.saveBitmap("TFTAutoCutter", srcMat); /* 颜色形状分析 */ Identify(srcMat, ColorHSV.yellowHSV1, "黄色"); 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 index a5aafaa..61a5a94 100644 --- 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 @@ -33,6 +33,11 @@ import java.util.Locale; public class BitmapProcess { + static + { + System.loadLibrary("opencv_java4"); + } + @SuppressLint("StaticFieldLeak") private static BitmapProcess mInstance; private Context mContext; @@ -82,7 +87,8 @@ public class BitmapProcess */ public static String saveBitmap(String name, Bitmap bm) { - if (bm == null) return "错误,没有图片!"; + if (bm == null) + return "错误,没有图片!"; return Build.VERSION.SDK_INT < 29 ? saveImageOld(name, bm) : mInstance.saveImageNew(name, bm); } diff --git a/app/src/main/java/com/uns/maincar/tools/ImageSaver.java b/app/src/main/java/com/uns/maincar/tools/ImageSaver.java new file mode 100644 index 0000000..9a39047 --- /dev/null +++ b/app/src/main/java/com/uns/maincar/tools/ImageSaver.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2023. UnknownNetworkService Group + * This file is created by UnknownObject at 2023 - 6 - 17 + */ + +package com.uns.maincar.tools; + +import android.graphics.Bitmap; +import android.os.Environment; + +import java.io.File; +import java.io.FileOutputStream; + +public class ImageSaver +{ + private final String main_storage_path = Environment.getExternalStorageDirectory().getPath() + File.separator + "MainCar"; + private final String storage_path = main_storage_path + File.separator + "Temp_OCR_Image"; + private String saved_file; + + private boolean PrepareDirectory() + { + try + { + File main_dir = new File(main_storage_path); + File cl_dir = new File(storage_path); + if (!main_dir.exists()) + if (!main_dir.mkdirs()) + return false; + if (!cl_dir.exists()) + if (!cl_dir.mkdirs()) + return false; + } + catch (Exception e) + { + return false; + } + return true; + } + + private boolean CopyImage(Bitmap img, String storage_path, String file_name) + { + try + { + saved_file = storage_path + File.separator + file_name; + File dir = new File(storage_path); + File file = new File(saved_file); + if (!dir.exists()) + { + if (!dir.mkdirs()) + return false; + } + if (file.exists()) + if (!file.delete()) + return false; + FileOutputStream fos = new FileOutputStream(saved_file); + img.compress(Bitmap.CompressFormat.JPEG, 100, fos); + fos.flush(); + fos.close(); + } + catch (Exception e) + { + return false; + } + return true; + } + + public boolean SaveImage(Bitmap img, String file_name) + { + if (PrepareDirectory()) + return CopyImage(img, storage_path, file_name); + else + return false; + } + + public String GetSavedFilePath() + { + return saved_file; + } +} 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 ad9e885..9eee345 100644 --- a/app/src/main/res/layout/activity_single_function_test.xml +++ b/app/src/main/res/layout/activity_single_function_test.xml @@ -218,7 +218,7 @@