diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index c421dc5..02ff8d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -604,16 +604,17 @@ } for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); @@ -676,16 +677,17 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); @@ -807,16 +809,15 @@ for (const auto &item: objects) { auto rect = item.rect; - float array[6]; + float array[5]; array[0] = rect.x; array[1] = rect.y; - array[2] = rect.width; - array[3] = rect.height; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; array[4] = (float) item.label; - array[5] = item.prob * 100; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index c421dc5..02ff8d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -604,16 +604,17 @@ } for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); @@ -676,16 +677,17 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); @@ -807,16 +809,15 @@ for (const auto &item: objects) { auto rect = item.rect; - float array[6]; + float array[5]; array[0] = rect.x; array[1] = rect.y; - array[2] = rect.width; - array[3] = rect.height; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; array[4] = (float) item.label; - array[5] = item.prob * 100; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); diff --git a/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt b/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt index c20033d..d3577bc 100644 --- a/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt +++ b/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt @@ -6,7 +6,7 @@ fun FloatArray.convert2YoloResult(activity: AppCompatActivity): YoloResult { /** - * 前四位是目标Rect,第五位是目标名对应的角标,第六位是可信度 + * 前四位是目标左上角和右下角坐标,第五位是目标名对应的角标 * * [135.88397,120.17752,68.061325,204.02115,28.0,43.642334] * */ @@ -20,8 +20,5 @@ yolo.position = array yolo.type = this[4].toInt() - - //保留两位有效小数 - yolo.prob = "${"%.2f".format(this[5])}%" return yolo } \ No newline at end of file diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index c421dc5..02ff8d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -604,16 +604,17 @@ } for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); @@ -676,16 +677,17 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); @@ -807,16 +809,15 @@ for (const auto &item: objects) { auto rect = item.rect; - float array[6]; + float array[5]; array[0] = rect.x; array[1] = rect.y; - array[2] = rect.width; - array[3] = rect.height; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; array[4] = (float) item.label; - array[5] = item.prob * 100; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); diff --git a/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt b/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt index c20033d..d3577bc 100644 --- a/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt +++ b/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt @@ -6,7 +6,7 @@ fun FloatArray.convert2YoloResult(activity: AppCompatActivity): YoloResult { /** - * 前四位是目标Rect,第五位是目标名对应的角标,第六位是可信度 + * 前四位是目标左上角和右下角坐标,第五位是目标名对应的角标 * * [135.88397,120.17752,68.061325,204.02115,28.0,43.642334] * */ @@ -20,8 +20,5 @@ yolo.position = array yolo.type = this[4].toInt() - - //保留两位有效小数 - yolo.prob = "${"%.2f".format(this[5])}%" return yolo } \ 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 378395c..6c416a4 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 @@ -3,8 +3,6 @@ public class YoloResult { private float[] position; private int type; - private String prob; - public float[] getPosition() { return position; } @@ -20,12 +18,4 @@ public void setType(int type) { this.type = type; } - - public String getProb() { - return prob; - } - - public void setProb(String prob) { - this.prob = prob; - } } diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index c421dc5..02ff8d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -604,16 +604,17 @@ } for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); @@ -676,16 +677,17 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); @@ -807,16 +809,15 @@ for (const auto &item: objects) { auto rect = item.rect; - float array[6]; + float array[5]; array[0] = rect.x; array[1] = rect.y; - array[2] = rect.width; - array[3] = rect.height; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; array[4] = (float) item.label; - array[5] = item.prob * 100; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); diff --git a/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt b/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt index c20033d..d3577bc 100644 --- a/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt +++ b/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt @@ -6,7 +6,7 @@ fun FloatArray.convert2YoloResult(activity: AppCompatActivity): YoloResult { /** - * 前四位是目标Rect,第五位是目标名对应的角标,第六位是可信度 + * 前四位是目标左上角和右下角坐标,第五位是目标名对应的角标 * * [135.88397,120.17752,68.061325,204.02115,28.0,43.642334] * */ @@ -20,8 +20,5 @@ yolo.position = array yolo.type = this[4].toInt() - - //保留两位有效小数 - yolo.prob = "${"%.2f".format(this[5])}%" return yolo } \ 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 378395c..6c416a4 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 @@ -3,8 +3,6 @@ public class YoloResult { private float[] position; private int type; - private String prob; - public float[] getPosition() { return position; } @@ -20,12 +18,4 @@ public void setType(int type) { this.type = type; } - - public String getProb() { - return prob; - } - - public void setProb(String prob) { - this.prob = 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 4bcdf90..93a543d 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 @@ -6,14 +6,12 @@ import android.os.Bundle import android.os.Handler import android.os.Message -import android.util.Log import android.view.SurfaceHolder import android.view.View import android.view.WindowManager import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.lifecycleScope import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding @@ -45,8 +43,6 @@ import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import org.opencv.core.Mat import java.io.File @@ -86,6 +82,8 @@ useClassify = false, useSegmentation = false, useDetect = true ) + yolov8ncnn.openCamera(1) + binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) @@ -243,6 +241,8 @@ ActivityResultContracts.StartActivityForResult() ) { if (it.resultCode == Activity.RESULT_OK) { + yolov8ncnn.closeCamera() + finish() } } @@ -282,9 +282,7 @@ if (isDetectTarget) { binding.detectView.updateTargetPosition(results) if (results.isEmpty()) { - lifecycleScope.launch(Dispatchers.Main) { - detectResultDialog.dismiss() - } + weakReferenceHandler.sendEmptyMessage(2024083001) } else { results.forEach { val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] @@ -319,52 +317,57 @@ } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024082901) { - val scene = msg.obj as String - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") - .setMessage("识别到${scene}场景,是否开始检查?") - .setNegativeButton("重新识别") - .setPositiveButton("开始检查") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - detectedScene = scene - detectedSceneSet.add(scene) - binding.titleView.setTitle(scene) - //显示场景清单 - binding.listTagView.visibility = View.VISIBLE - binding.listTagView.text = "${detectedSceneSet.size}" + when (msg.what) { + 2024082901 -> { + val scene = msg.obj as String + AlertControlDialog.Builder() + .setContext(this) + .setTitle("温馨提示") + .setMessage("识别到${scene}场景,是否开始检查?") + .setNegativeButton("重新识别") + .setPositiveButton("开始检查") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + detectedScene = scene + detectedSceneSet.add(scene) + binding.titleView.setTitle(scene) + //显示场景清单 + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" - //继续调用检测模型检测无标物品 - yolov8ncnn.onRestart() - isDetectTarget = true - } + //继续调用检测模型检测无标物品 + yolov8ncnn.onRestart() + isDetectTarget = true + } - override fun onCancelClick() { - yolov8ncnn.onRestart() - } - }).build().show() - } else if (msg.what == 2024082902) { - binding.tipsTagView.visibility = View.VISIBLE - binding.tipsTagView.text = "${targetSet.size}" - - //弹框 - if (detectResultDialog.isShowing) { - return true + override fun onCancelClick() { + yolov8ncnn.onRestart() + } + }).build().show() } - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView( - "${msg.obj}", mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onConfirmClick(file: File) { -// imageFileViewModel.uploadImage(file) - } - }).show() - } else { - Log.d(kTag, "width: ${mat.width()}, height: ${mat.height()}") + 2024082902 -> { + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + //弹框 + if (detectResultDialog.isShowing) { + return true + } + + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView("${msg.obj}", mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onConfirmClick(file: File) { +// imageFileViewModel.uploadImage(file) + } + }).show() + } + } + + 2024083001 -> { + detectResultDialog.dismiss() } } return true @@ -374,16 +377,6 @@ override fun surfaceDestroyed(holder: SurfaceHolder) {} - override fun onResume() { - super.onResume() - yolov8ncnn.openCamera(1) - } - - override fun onPause() { - super.onPause() - yolov8ncnn.closeCamera() - } - override fun onDestroy() { super.onDestroy() locationManager.stopLocation() diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index c421dc5..02ff8d7 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -604,16 +604,17 @@ } for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(segment_array_obj, arraylist_add, result_array); @@ -676,16 +677,17 @@ std::sort(objects.begin(), objects.end(), objects_area_greater); for (const auto &item: objects) { - 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; + auto rect = item.rect; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + float array[5]; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; + array[4] = (float) item.label; + + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(detect_array_obj, arraylist_add, result_array); @@ -807,16 +809,15 @@ for (const auto &item: objects) { auto rect = item.rect; - float array[6]; + float array[5]; array[0] = rect.x; array[1] = rect.y; - array[2] = rect.width; - array[3] = rect.height; + array[2] = rect.x + rect.width; + array[3] = rect.y + rect.height; array[4] = (float) item.label; - array[5] = item.prob * 100; - jfloatArray result_array = env->NewFloatArray(6); - env->SetFloatArrayRegion(result_array, 0, 6, array); + jfloatArray result_array = env->NewFloatArray(5); + env->SetFloatArrayRegion(result_array, 0, 5, array); //add env->CallBooleanMethod(arraylist_obj, arraylist_add, result_array); diff --git a/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt b/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt index c20033d..d3577bc 100644 --- a/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt +++ b/app/src/main/java/com/casic/br/app/extensions/FloatArray.kt @@ -6,7 +6,7 @@ fun FloatArray.convert2YoloResult(activity: AppCompatActivity): YoloResult { /** - * 前四位是目标Rect,第五位是目标名对应的角标,第六位是可信度 + * 前四位是目标左上角和右下角坐标,第五位是目标名对应的角标 * * [135.88397,120.17752,68.061325,204.02115,28.0,43.642334] * */ @@ -20,8 +20,5 @@ yolo.position = array yolo.type = this[4].toInt() - - //保留两位有效小数 - yolo.prob = "${"%.2f".format(this[5])}%" return yolo } \ 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 378395c..6c416a4 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 @@ -3,8 +3,6 @@ public class YoloResult { private float[] position; private int type; - private String prob; - public float[] getPosition() { return position; } @@ -20,12 +18,4 @@ public void setType(int type) { this.type = type; } - - public String getProb() { - return prob; - } - - public void setProb(String prob) { - this.prob = 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 4bcdf90..93a543d 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 @@ -6,14 +6,12 @@ import android.os.Bundle import android.os.Handler import android.os.Message -import android.util.Log import android.view.SurfaceHolder import android.view.View import android.view.WindowManager import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.lifecycleScope import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding @@ -45,8 +43,6 @@ import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import org.opencv.core.Mat import java.io.File @@ -86,6 +82,8 @@ useClassify = false, useSegmentation = false, useDetect = true ) + yolov8ncnn.openCamera(1) + binding.surfaceView.holder.setFormat(PixelFormat.RGBA_8888) binding.surfaceView.holder.addCallback(this) @@ -243,6 +241,8 @@ ActivityResultContracts.StartActivityForResult() ) { if (it.resultCode == Activity.RESULT_OK) { + yolov8ncnn.closeCamera() + finish() } } @@ -282,9 +282,7 @@ if (isDetectTarget) { binding.detectView.updateTargetPosition(results) if (results.isEmpty()) { - lifecycleScope.launch(Dispatchers.Main) { - detectResultDialog.dismiss() - } + weakReferenceHandler.sendEmptyMessage(2024083001) } else { results.forEach { val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] @@ -319,52 +317,57 @@ } override fun handleMessage(msg: Message): Boolean { - if (msg.what == 2024082901) { - val scene = msg.obj as String - AlertControlDialog.Builder() - .setContext(this) - .setTitle("温馨提示") - .setMessage("识别到${scene}场景,是否开始检查?") - .setNegativeButton("重新识别") - .setPositiveButton("开始检查") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - detectedScene = scene - detectedSceneSet.add(scene) - binding.titleView.setTitle(scene) - //显示场景清单 - binding.listTagView.visibility = View.VISIBLE - binding.listTagView.text = "${detectedSceneSet.size}" + when (msg.what) { + 2024082901 -> { + val scene = msg.obj as String + AlertControlDialog.Builder() + .setContext(this) + .setTitle("温馨提示") + .setMessage("识别到${scene}场景,是否开始检查?") + .setNegativeButton("重新识别") + .setPositiveButton("开始检查") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + detectedScene = scene + detectedSceneSet.add(scene) + binding.titleView.setTitle(scene) + //显示场景清单 + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" - //继续调用检测模型检测无标物品 - yolov8ncnn.onRestart() - isDetectTarget = true - } + //继续调用检测模型检测无标物品 + yolov8ncnn.onRestart() + isDetectTarget = true + } - override fun onCancelClick() { - yolov8ncnn.onRestart() - } - }).build().show() - } else if (msg.what == 2024082902) { - binding.tipsTagView.visibility = View.VISIBLE - binding.tipsTagView.text = "${targetSet.size}" - - //弹框 - if (detectResultDialog.isShowing) { - return true + override fun onCancelClick() { + yolov8ncnn.onRestart() + } + }).build().show() } - if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView( - "${msg.obj}", mat, - object : DetectResultDialog.OnDialogButtonClickListener { - override fun onConfirmClick(file: File) { -// imageFileViewModel.uploadImage(file) - } - }).show() - } else { - Log.d(kTag, "width: ${mat.width()}, height: ${mat.height()}") + 2024082902 -> { + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + //弹框 + if (detectResultDialog.isShowing) { + return true + } + + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView("${msg.obj}", mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onConfirmClick(file: File) { +// imageFileViewModel.uploadImage(file) + } + }).show() + } + } + + 2024083001 -> { + detectResultDialog.dismiss() } } return true @@ -374,16 +377,6 @@ override fun surfaceDestroyed(holder: SurfaceHolder) {} - override fun onResume() { - super.onResume() - yolov8ncnn.openCamera(1) - } - - override fun onPause() { - super.onPause() - yolov8ncnn.closeCamera() - } - override fun onDestroy() { super.onDestroy() locationManager.stopLocation() diff --git a/app/src/main/java/com/casic/br/app/widgets/YoloTargetDetectView.kt b/app/src/main/java/com/casic/br/app/widgets/YoloTargetDetectView.kt index c93f171..d497e9b 100644 --- a/app/src/main/java/com/casic/br/app/widgets/YoloTargetDetectView.kt +++ b/app/src/main/java/com/casic/br/app/widgets/YoloTargetDetectView.kt @@ -70,20 +70,22 @@ private fun drawTarget(canvas: Canvas, it: YoloResult, label: String) { val textLength = textPaint.measureText(label) - //文字背景。数字仅为了纠正背景和文字以及边框对齐,因为坐标值转px时会丢失一次精度,转int会再丢失一次精度,最后会导致背景和文字以及边框无法完美对齐 + val textRectWidth = textLength * 1.1 //文字背景宽度 + val textRectHeight = textHeight * 1.1 //文字背景高度 + textRect.set( it.position[0].toInt(), it.position[1].toInt(), - (it.position[0] + textLength).toInt() + 10, - it.position[1].toInt() - textHeight + (it.position[0] + textRectWidth).toInt(), + (it.position[1] - textRectHeight).toInt() ) canvas.drawRect(textRect, backgroundPaint) //画文字。数值是文字左右边距,可酌情调整 canvas.drawText( label, - it.position[0] + (textLength + 10) / 2, - it.position[1] - 15, + (it.position[0] + textRectWidth / 2).toFloat(), + (it.position[1] - textRectHeight / 4).toFloat(), textPaint ) @@ -91,8 +93,8 @@ rect.set( it.position[0].toInt(), it.position[1].toInt(), - (it.position[0] + it.position[2]).toInt(), - (it.position[1] + it.position[3]).toInt() + it.position[2].toInt(), + it.position[3].toInt() ) canvas.drawRect(rect, borderPaint) }