fix crash bug

master
UnknownObject 2 years ago
parent 892c19130c
commit 7dd9bd8b64

@ -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;

@ -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,8 +213,10 @@ 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();
@ -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,10 +443,61 @@ 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);
try
{
List<Classifier.Recognition> data = json.fromJson(result, new TypeToken<List<Classifier.Recognition>>()
{
}.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);
}
}
//识别静态文本
private void OCRRecognizeText()
@ -478,10 +540,61 @@ 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);
try
{
List<Classifier.Recognition> data = json.fromJson(result, new TypeToken<List<Classifier.Recognition>>()
{
}.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);
}
}
//数组转字符串,仅用于调试输出
private String ByteArray2String(byte[] arr)
@ -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();
});

@ -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, "黄色");

@ -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);
}

@ -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;
}
}

@ -218,7 +218,7 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
@ -245,4 +245,18 @@
android:layout_weight="1"
android:text="黄色\n二维码识别" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_python_ocr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="3dp"
android:layout_weight="1"
android:text="基于Python的OCR" />
</LinearLayout>
</LinearLayout>

@ -7,3 +7,6 @@ generate_cxx_metadata completed in 52ms
# C/C++ build system timings
# C/C++ build system timings
generate_cxx_metadata 24ms

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 816914465
"memoizedHashCode": 2083485280
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1891328276
"memoizedHashCode": -1137068205
},
{
"level_": 0,
@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -310096087
"memoizedHashCode": 956474728
}
]

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -124082499
"memoizedHashCode": -724465594
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1118177264
"memoizedHashCode": 517794169
},
{
"level_": 0,
@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 802523847
"memoizedHashCode": 202140752
}
]

@ -21,3 +21,11 @@ generate_cxx_metadata completed in 643ms
# C/C++ build system timings
# C/C++ build system timings
# C/C++ build system timings
# C/C++ build system timings
# C/C++ build system timings

@ -203,3 +203,14 @@ generate_cxx_metadata
create-invalidation-state 24ms
generate_cxx_metadata completed in 29ms
# C/C++ build system timings
generate_cxx_metadata
create-invalidation-state 18ms
generate_cxx_metadata completed in 23ms
# C/C++ build system timings
# C/C++ build system timings
# C/C++ build system timings

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 2061007653
"memoizedHashCode": 1460624558
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -301269928
"memoizedHashCode": -901653023
},
{
"level_": 0,
@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 497529435
"memoizedHashCode": -102853660
}
]

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1982844983
"memoizedHashCode": 1382461888
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1228193880
"memoizedHashCode": 627810785
},
{
"level_": 0,
@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1645904618
"memoizedHashCode": 1045521523
}
]

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -464563815
"memoizedHashCode": -1242221650
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1657535573
"memoizedHashCode": 879877738
},
{
"level_": 0,
@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -1591574367
"memoizedHashCode": 1925735094
}
]

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -1649121483
"memoizedHashCode": 1868187978
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1396630513
"memoizedHashCode": 618972678
},
{
"level_": 0,
@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -722515137
"memoizedHashCode": -1500172972
}
]

@ -9,3 +9,9 @@ generate_cxx_metadata completed in 18ms
# C/C++ build system timings
# C/C++ build system timings
# C/C++ build system timings
# C/C++ build system timings

@ -112,3 +112,8 @@ generate_cxx_metadata completed in 23ms
# C/C++ build system timings
# C/C++ build system timings
generate_cxx_metadata
create-invalidation-state 21ms
generate_cxx_metadata completed in 26ms

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 2049212457
"memoizedHashCode": 1448829362
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1697297893
"memoizedHashCode": 1096914798
},
{
"level_": 0,
@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 485734239
"memoizedHashCode": -114648856
}
]

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -1338213337
"memoizedHashCode": -2115871172
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -392200417
"memoizedHashCode": -1169858252
},
{
"level_": 0,
@ -39,6 +39,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -1675153702
"memoizedHashCode": 1842155759
}
]

@ -11,6 +11,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 850788318
"memoizedHashCode": -1235839491
}
]

@ -22,3 +22,15 @@ create_cxx_tasks
create-initial-cxx-model completed in 95ms
create_cxx_tasks completed in 95ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 39ms
create-module-model completed in 40ms
create-module-model
create-cmake-model 37ms
create-module-model completed in 39ms
create-initial-cxx-model completed in 91ms
create_cxx_tasks completed in 92ms

@ -22,3 +22,15 @@ create_cxx_tasks
create-initial-cxx-model completed in 83ms
create_cxx_tasks completed in 83ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 39ms
create-module-model completed in 40ms
create-module-model
create-cmake-model 40ms
create-module-model completed in 41ms
create-initial-cxx-model completed in 97ms
create_cxx_tasks completed in 98ms

@ -190,3 +190,51 @@ create_cxx_tasks
create-initial-cxx-model completed in 94ms
create_cxx_tasks completed in 94ms
# 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 51ms
create-module-model completed in 54ms
create-initial-cxx-model completed in 117ms
create_cxx_tasks completed in 118ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 37ms
create-module-model completed in 39ms
create-module-model
create-cmake-model 38ms
create-module-model completed in 39ms
create-initial-cxx-model completed in 92ms
create_cxx_tasks completed in 92ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 38ms
create-module-model completed in 40ms
create-module-model
create-cmake-model 37ms
create-module-model completed in 37ms
create-initial-cxx-model completed in 89ms
create_cxx_tasks completed in 89ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 34ms
create-module-model completed in 37ms
create-module-model
create-cmake-model 36ms
create-module-model completed in 39ms
create-initial-cxx-model completed in 87ms
create_cxx_tasks completed in 87ms

@ -1163,3 +1163,77 @@ create_cxx_tasks
create-initial-cxx-model completed in 97ms
create_cxx_tasks completed in 99ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 37ms
create-module-model completed in 39ms
create-module-model
create-cmake-model 36ms
create-module-model completed in 39ms
create-initial-cxx-model completed in 97ms
create_cxx_tasks completed in 98ms
# 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 36ms
create-module-model completed in 38ms
create-initial-cxx-model completed in 91ms
create_cxx_tasks completed in 93ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 43ms
create-module-model completed in 46ms
create-module-model
create-cmake-model 37ms
create-module-model completed in 39ms
create-initial-cxx-model completed in 96ms
create_cxx_tasks completed in 97ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 37ms
create-module-model completed in 41ms
create-module-model
create-cmake-model 37ms
create-module-model completed in 39ms
[gap of 10ms]
create-initial-cxx-model completed in 100ms
create_cxx_tasks completed in 102ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 36ms
create-module-model completed in 39ms
create-module-model
create-cmake-model 35ms
create-module-model completed in 36ms
[gap of 11ms]
create-initial-cxx-model completed in 95ms
create_cxx_tasks completed in 97ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 38ms
create-module-model completed in 41ms
create-module-model
create-cmake-model 38ms
create-module-model completed in 40ms
create-initial-cxx-model completed in 99ms
create_cxx_tasks completed in 100ms

@ -10,3 +10,15 @@ create_cxx_tasks
create-initial-cxx-model completed in 81ms
create_cxx_tasks completed in 81ms
# C/C++ build system timings
create_cxx_tasks
create-initial-cxx-model
create-module-model
create-cmake-model 39ms
create-module-model completed in 41ms
create-module-model
create-cmake-model 35ms
create-module-model completed in 38ms
create-initial-cxx-model completed in 86ms
create_cxx_tasks completed in 87ms

@ -11,7 +11,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -1660375688
"memoizedHashCode": -393804873
},
{
"level_": 0,
@ -25,7 +25,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -868187585
"memoizedHashCode": 398383230
},
{
"level_": 0,
@ -39,7 +39,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": -163726392
"memoizedHashCode": 1102844423
},
{
"level_": 0,
@ -53,7 +53,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1699087678
"memoizedHashCode": -1329308803
},
{
"level_": 0,
@ -67,7 +67,7 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 806398096
"memoizedHashCode": 2072968911
},
{
"level_": 0,
@ -81,6 +81,6 @@
"fieldsDescending": {}
},
"memoizedSize": -1,
"memoizedHashCode": 1142378315
"memoizedHashCode": -1886018166
}
]
Loading…
Cancel
Save