diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 2871f8d..0c01c4e 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -403,9 +403,6 @@ sprintf(param_path, "%s.param", model_type); sprintf(model_path, "%s.bin", model_type); - __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "param_path %s", param_path); - __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "model_path %s", model_path); - if (use_classify) { yolo_c.load_param(mgr, param_path); yolo_c.load_model(mgr, model_path); @@ -607,23 +604,19 @@ } for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(segment_array_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); } } @@ -683,23 +676,19 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(detect_array_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); } } @@ -816,23 +805,19 @@ //初始化ArrayList对象 jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); } //回调 env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 2871f8d..0c01c4e 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -403,9 +403,6 @@ sprintf(param_path, "%s.param", model_type); sprintf(model_path, "%s.bin", model_type); - __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "param_path %s", param_path); - __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "model_path %s", model_path); - if (use_classify) { yolo_c.load_param(mgr, param_path); yolo_c.load_model(mgr, model_path); @@ -607,23 +604,19 @@ } for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(segment_array_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); } } @@ -683,23 +676,19 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(detect_array_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); } } @@ -816,23 +805,19 @@ //初始化ArrayList对象 jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); } //回调 env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); diff --git a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt index c2abd62..e3fe678 100644 --- a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt @@ -9,10 +9,12 @@ /** * 分割 */ - fun onSegmentation(segmentationOutput: ArrayList, detectOutput: ArrayList) + fun onSegmentation( + segmentationOutput: ArrayList, detectOutput: ArrayList + ) /** * 检测 */ - fun onDetect(output: ArrayList) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 2871f8d..0c01c4e 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -403,9 +403,6 @@ sprintf(param_path, "%s.param", model_type); sprintf(model_path, "%s.bin", model_type); - __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "param_path %s", param_path); - __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "model_path %s", model_path); - if (use_classify) { yolo_c.load_param(mgr, param_path); yolo_c.load_model(mgr, model_path); @@ -607,23 +604,19 @@ } for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(segment_array_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); } } @@ -683,23 +676,19 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(detect_array_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); } } @@ -816,23 +805,19 @@ //初始化ArrayList对象 jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); } //回调 env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); diff --git a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt index c2abd62..e3fe678 100644 --- a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt @@ -9,10 +9,12 @@ /** * 分割 */ - fun onSegmentation(segmentationOutput: ArrayList, detectOutput: ArrayList) + fun onSegmentation( + segmentationOutput: ArrayList, detectOutput: ArrayList + ) /** * 检测 */ - fun onDetect(output: ArrayList) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/YoloResult.java b/app/src/main/java/com/casic/br/app/external/YoloResult.java index a329cfc..378395c 100644 --- a/app/src/main/java/com/casic/br/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/app/external/YoloResult.java @@ -1,18 +1,10 @@ package com.casic.br.app.external; public class YoloResult { - private int type; private float[] position; + private int type; private String prob; - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - public float[] getPosition() { return position; } @@ -21,6 +13,14 @@ this.position = position; } + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + public String getProb() { return prob; } diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 2871f8d..0c01c4e 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -403,9 +403,6 @@ sprintf(param_path, "%s.param", model_type); sprintf(model_path, "%s.bin", model_type); - __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "param_path %s", param_path); - __android_log_print(ANDROID_LOG_DEBUG, "ncnn", "model_path %s", model_path); - if (use_classify) { yolo_c.load_param(mgr, param_path); yolo_c.load_model(mgr, model_path); @@ -607,23 +604,19 @@ } for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(segment_array_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); } } @@ -683,23 +676,19 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(detect_array_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); } } @@ -816,23 +805,19 @@ //初始化ArrayList对象 jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); for (const auto &item: objects) { - float array[4]; + float array[6]; array[0] = item.rect.x; array[1] = item.rect.y; array[2] = item.rect.width; array[3] = item.rect.height; + array[4] = (float) item.label; + array[5] = item.prob * 100; - char text[256]; - sprintf( - text, - "%d %f %f %f %f %.1f%%", - item.label, - array[0], array[1], array[2], array[3], - item.prob * 100 - ); + jfloatArray result_array = env->NewFloatArray(6); + env->SetFloatArrayRegion(result_array, 0, 6, array); //add - env->CallBooleanMethod(arraylist_obj, arraylist_add, env->NewStringUTF(text)); + env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); } //回调 env->CallVoidMethod(j_callback, j_method_id, arraylist_obj); diff --git a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt index c2abd62..e3fe678 100644 --- a/app/src/main/java/com/casic/br/app/external/INativeCallback.kt +++ b/app/src/main/java/com/casic/br/app/external/INativeCallback.kt @@ -9,10 +9,12 @@ /** * 分割 */ - fun onSegmentation(segmentationOutput: ArrayList, detectOutput: ArrayList) + fun onSegmentation( + segmentationOutput: ArrayList, detectOutput: ArrayList + ) /** * 检测 */ - fun onDetect(output: ArrayList) + fun onDetect(output: ArrayList) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/YoloResult.java b/app/src/main/java/com/casic/br/app/external/YoloResult.java index a329cfc..378395c 100644 --- a/app/src/main/java/com/casic/br/app/external/YoloResult.java +++ b/app/src/main/java/com/casic/br/app/external/YoloResult.java @@ -1,18 +1,10 @@ package com.casic.br.app.external; public class YoloResult { - private int type; private float[] position; + private int type; private String prob; - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - public float[] getPosition() { return position; } @@ -21,6 +13,14 @@ this.position = position; } + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + public String getProb() { return prob; } diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index 8002bd3..d3c9d85 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt @@ -266,64 +266,26 @@ } override fun onSegmentation( - segmentationOutput: ArrayList, detectOutput: ArrayList + segmentationOutput: ArrayList, detectOutput: ArrayList ) { //转成泛型集合 val segmentationResults = ArrayList() segmentationOutput.forEach { - val yolo = YoloResult() - - val strings = it.split(" ") - yolo.type = strings.first().toInt() - - val array = FloatArray(4) - array[0] = strings[1].toFloat() - array[1] = strings[2].toFloat() - array[2] = strings[3].toFloat() - array[3] = strings[4].toFloat() - yolo.position = array - - yolo.prob = strings.last() - segmentationResults.add(yolo) + segmentationResults.add(it.convert2YoloResult()) } val detectResults = ArrayList() detectOutput.forEach { - val yolo = YoloResult() - - val strings = it.split(" ") - yolo.type = strings.first().toInt() - - val array = FloatArray(4) - array[0] = strings[1].toFloat() - array[1] = strings[2].toFloat() - array[2] = strings[3].toFloat() - array[3] = strings[4].toFloat() - yolo.position = array - - yolo.prob = strings.last() - detectResults.add(yolo) + detectResults.add(it.convert2YoloResult()) } binding.detectView.updateTargetPosition(segmentationResults, detectResults) } - override fun onDetect(output: ArrayList) { + override fun onDetect(output: ArrayList) { //转成泛型集合 val results = ArrayList() output.forEach { - val yolo = YoloResult() - - val strings = it.split(" ") - yolo.type = strings.first().toInt() - - val array = FloatArray(4) - array[0] = strings[1].toFloat() - array[1] = strings[2].toFloat() - array[2] = strings[3].toFloat() - array[3] = strings[4].toFloat() - yolo.position = array - - yolo.prob = strings.last() + val yolo = it.convert2YoloResult() results.add(yolo) //需要根据检测结果反推属于什么场景 @@ -358,6 +320,28 @@ // } } + private fun FloatArray.convert2YoloResult(): YoloResult { + /** + * 前四位是目标Rect,第五位是目标名对应的角标,第六位是可信度 + * + * [135.88397,120.17752,68.061325,204.02115,28.0,43.642334] + * */ + val yolo = YoloResult() + + val array = FloatArray(4) + array[0] = this[0] + array[1] = this[1] + array[2] = this[2] + array[3] = this[3] + yolo.position = array + + yolo.type = this[4].toInt() + + //保留两位有效小数 + yolo.prob = "${String.format("%.2f", this[5])}%" + return yolo + } + override fun surfaceCreated(holder: SurfaceHolder) {} override fun surfaceDestroyed(holder: SurfaceHolder) {}