diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index b72a381..c421dc5 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -707,7 +707,7 @@ // pad to multiple of 32 int w = width; int h = height; - float scale = 1.f; + float scale; if (w > h) { scale = (float) target_size / w; w = target_size; @@ -805,11 +805,13 @@ //初始化ArrayList对象 jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); for (const auto &item: objects) { + auto rect = item.rect; + float array[6]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.width; + array[3] = rect.height; array[4] = (float) item.label; array[5] = item.prob * 100; diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index b72a381..c421dc5 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -707,7 +707,7 @@ // pad to multiple of 32 int w = width; int h = height; - float scale = 1.f; + float scale; if (w > h) { scale = (float) target_size / w; w = target_size; @@ -805,11 +805,13 @@ //初始化ArrayList对象 jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); for (const auto &item: objects) { + auto rect = item.rect; + float array[6]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.width; + array[3] = rect.height; array[4] = (float) item.label; array[5] = item.prob * 100; 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 8d414f7..c20033d 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 @@ -1,8 +1,10 @@ package com.casic.br.app.extensions +import androidx.appcompat.app.AppCompatActivity import com.casic.br.app.external.YoloResult +import com.pengxh.kt.lite.extensions.dp2px -fun FloatArray.convert2YoloResult(): YoloResult { +fun FloatArray.convert2YoloResult(activity: AppCompatActivity): YoloResult { /** * 前四位是目标Rect,第五位是目标名对应的角标,第六位是可信度 * @@ -11,15 +13,15 @@ val yolo = YoloResult() val array = FloatArray(4) - array[0] = this[0] - array[1] = this[1] - array[2] = this[2] - array[3] = this[3] + array[0] = this[0].dp2px(activity) + array[1] = this[1].dp2px(activity) + array[2] = this[2].dp2px(activity) + array[3] = this[3].dp2px(activity) yolo.position = array yolo.type = this[4].toInt() //保留两位有效小数 - yolo.prob = "${String.format("%.2f", this[5])}%" + 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 b72a381..c421dc5 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -707,7 +707,7 @@ // pad to multiple of 32 int w = width; int h = height; - float scale = 1.f; + float scale; if (w > h) { scale = (float) target_size / w; w = target_size; @@ -805,11 +805,13 @@ //初始化ArrayList对象 jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); for (const auto &item: objects) { + auto rect = item.rect; + float array[6]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.width; + array[3] = rect.height; array[4] = (float) item.label; array[5] = item.prob * 100; 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 8d414f7..c20033d 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 @@ -1,8 +1,10 @@ package com.casic.br.app.extensions +import androidx.appcompat.app.AppCompatActivity import com.casic.br.app.external.YoloResult +import com.pengxh.kt.lite.extensions.dp2px -fun FloatArray.convert2YoloResult(): YoloResult { +fun FloatArray.convert2YoloResult(activity: AppCompatActivity): YoloResult { /** * 前四位是目标Rect,第五位是目标名对应的角标,第六位是可信度 * @@ -11,15 +13,15 @@ val yolo = YoloResult() val array = FloatArray(4) - array[0] = this[0] - array[1] = this[1] - array[2] = this[2] - array[3] = this[3] + array[0] = this[0].dp2px(activity) + array[1] = this[1].dp2px(activity) + array[2] = this[2].dp2px(activity) + array[3] = this[3].dp2px(activity) yolo.position = array yolo.type = this[4].toInt() //保留两位有效小数 - yolo.prob = "${String.format("%.2f", this[5])}%" + 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/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index a1db260..4bcdf90 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 @@ -13,6 +13,7 @@ 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 @@ -44,6 +45,8 @@ 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 @@ -258,12 +261,12 @@ //转成泛型集合 val segmentationResults = ArrayList() segmentationOutput.forEach { - segmentationResults.add(it.convert2YoloResult()) + segmentationResults.add(it.convert2YoloResult(this)) } val detectResults = ArrayList() detectOutput.forEach { - detectResults.add(it.convert2YoloResult()) + detectResults.add(it.convert2YoloResult(this)) } binding.detectView.updateTargetPosition(segmentationResults, detectResults) } @@ -272,14 +275,16 @@ //转成泛型集合 val results = ArrayList() output.forEach { - val yolo = it.convert2YoloResult() + val yolo = it.convert2YoloResult(this) results.add(yolo) } if (isDetectTarget) { binding.detectView.updateTargetPosition(results) if (results.isEmpty()) { - detectResultDialog.dismiss() + lifecycleScope.launch(Dispatchers.Main) { + detectResultDialog.dismiss() + } } else { results.forEach { val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index b72a381..c421dc5 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -707,7 +707,7 @@ // pad to multiple of 32 int w = width; int h = height; - float scale = 1.f; + float scale; if (w > h) { scale = (float) target_size / w; w = target_size; @@ -805,11 +805,13 @@ //初始化ArrayList对象 jobject arraylist_obj = env->NewObject(list_clazz, arraylist_init); for (const auto &item: objects) { + auto rect = item.rect; + float array[6]; - array[0] = item.rect.x; - array[1] = item.rect.y; - array[2] = item.rect.width; - array[3] = item.rect.height; + array[0] = rect.x; + array[1] = rect.y; + array[2] = rect.width; + array[3] = rect.height; array[4] = (float) item.label; array[5] = item.prob * 100; 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 8d414f7..c20033d 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 @@ -1,8 +1,10 @@ package com.casic.br.app.extensions +import androidx.appcompat.app.AppCompatActivity import com.casic.br.app.external.YoloResult +import com.pengxh.kt.lite.extensions.dp2px -fun FloatArray.convert2YoloResult(): YoloResult { +fun FloatArray.convert2YoloResult(activity: AppCompatActivity): YoloResult { /** * 前四位是目标Rect,第五位是目标名对应的角标,第六位是可信度 * @@ -11,15 +13,15 @@ val yolo = YoloResult() val array = FloatArray(4) - array[0] = this[0] - array[1] = this[1] - array[2] = this[2] - array[3] = this[3] + array[0] = this[0].dp2px(activity) + array[1] = this[1].dp2px(activity) + array[2] = this[2].dp2px(activity) + array[3] = this[3].dp2px(activity) yolo.position = array yolo.type = this[4].toInt() //保留两位有效小数 - yolo.prob = "${String.format("%.2f", this[5])}%" + 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/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index a1db260..4bcdf90 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 @@ -13,6 +13,7 @@ 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 @@ -44,6 +45,8 @@ 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 @@ -258,12 +261,12 @@ //转成泛型集合 val segmentationResults = ArrayList() segmentationOutput.forEach { - segmentationResults.add(it.convert2YoloResult()) + segmentationResults.add(it.convert2YoloResult(this)) } val detectResults = ArrayList() detectOutput.forEach { - detectResults.add(it.convert2YoloResult()) + detectResults.add(it.convert2YoloResult(this)) } binding.detectView.updateTargetPosition(segmentationResults, detectResults) } @@ -272,14 +275,16 @@ //转成泛型集合 val results = ArrayList() output.forEach { - val yolo = it.convert2YoloResult() + val yolo = it.convert2YoloResult(this) results.add(yolo) } if (isDetectTarget) { binding.detectView.updateTargetPosition(results) if (results.isEmpty()) { - detectResultDialog.dismiss() + lifecycleScope.launch(Dispatchers.Main) { + detectResultDialog.dismiss() + } } else { results.forEach { val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] 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 7d2c7cc..c93f171 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 @@ -20,6 +20,7 @@ private val textPaint by lazy { TextPaint() } private val backgroundPaint by lazy { Paint() } private val borderPaint by lazy { Paint() } + private val textRect by lazy { Rect() } private val rect by lazy { Rect() } private var results: MutableList = ArrayList() private var segmentationResults: MutableList = ArrayList() @@ -29,7 +30,7 @@ textPaint.color = Color.WHITE textPaint.isAntiAlias = true textPaint.textAlign = Paint.Align.CENTER - textPaint.textSize = 14f.sp2px(context) + textPaint.textSize = 16f.sp2px(context) val fontMetrics = textPaint.fontMetrics textHeight = (fontMetrics.bottom - fontMetrics.top).toInt() @@ -39,7 +40,7 @@ borderPaint.color = Color.BLUE borderPaint.style = Paint.Style.STROKE - borderPaint.strokeWidth = 2f.dp2px(context) //设置线宽 + borderPaint.strokeWidth = 3f.dp2px(context) //设置线宽 borderPaint.isAntiAlias = true } @@ -70,28 +71,28 @@ private fun drawTarget(canvas: Canvas, it: YoloResult, label: String) { val textLength = textPaint.measureText(label) //文字背景。数字仅为了纠正背景和文字以及边框对齐,因为坐标值转px时会丢失一次精度,转int会再丢失一次精度,最后会导致背景和文字以及边框无法完美对齐 - rect.set( - (it.position[0].dp2px(context)).toInt(), - (it.position[1].dp2px(context)).toInt(), - (it.position[0].dp2px(context) + textLength).toInt() + 10, - it.position[1].dp2px(context).toInt() - textHeight + textRect.set( + it.position[0].toInt(), + it.position[1].toInt(), + (it.position[0] + textLength).toInt() + 10, + it.position[1].toInt() - textHeight ) - canvas.drawRect(rect, backgroundPaint) + canvas.drawRect(textRect, backgroundPaint) //画文字。数值是文字左右边距,可酌情调整 canvas.drawText( label, - it.position[0].dp2px(context) + (textLength + 10) / 2, - it.position[1].dp2px(context) - 10, + it.position[0] + (textLength + 10) / 2, + it.position[1] - 15, textPaint ) //画框 rect.set( - (it.position[0].dp2px(context)).toInt(), - (it.position[1].dp2px(context)).toInt(), - (it.position[2] + it.position[0]).dp2px(context).toInt(), - (it.position[3] + it.position[1]).dp2px(context).toInt() + it.position[0].toInt(), + it.position[1].toInt(), + (it.position[0] + it.position[2]).toInt(), + (it.position[1] + it.position[3]).toInt() ) canvas.drawRect(rect, borderPaint) }