diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index bea13e0..cc1f13e 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -50,8 +50,8 @@ //协程预加载算法模型 lifecycleScope.launch(Dispatchers.IO) { - yolov8ncnn.loadModel(assets, 2, 0) - yolov8ncnn.updateYoloState(YoloStateConst.DETECT) + yolov8ncnn.loadModel(assets, 1, 0) + yolov8ncnn.updateYoloState(YoloStateConst.CLASSIFY) } //初始化OpenCV diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index bea13e0..cc1f13e 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -50,8 +50,8 @@ //协程预加载算法模型 lifecycleScope.launch(Dispatchers.IO) { - yolov8ncnn.loadModel(assets, 2, 0) - yolov8ncnn.updateYoloState(YoloStateConst.DETECT) + yolov8ncnn.loadModel(assets, 1, 0) + yolov8ncnn.updateYoloState(YoloStateConst.CLASSIFY) } //初始化OpenCV 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 dd30acd..fc8dccf 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,6 +6,7 @@ import android.os.Bundle 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 @@ -14,6 +15,7 @@ import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding +import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult @@ -24,6 +26,7 @@ import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.InspectionViewModel +import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -52,8 +55,10 @@ private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } + private val detectedSceneSet by lazy { HashSet() } private val yolov8ncnn by lazy { Yolov8ncnn() } private val mat by lazy { Mat() } + private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private var inspectionAddress = "" @@ -258,19 +263,6 @@ } override fun onDetect(output: ArrayList) { - //需要根据检测结果反推属于什么场景 -// val label = LocaleConstant.CLASS_NAMES_ARRAY[output.type] -// -// targetSet.add(label) -// detectedScene = label.getSceneByTarget() -// lifecycleScope.launch(Dispatchers.Main) { -// binding.titleView.setTitle(detectedScene) -// //显示角标 -// binding.tipsTagView.visibility = View.VISIBLE -// binding.tipsTagView.text = "${targetSet.size}" -// } - - //["0 0.376022 303.246338 117.298019 116.764282 91.2%","4 180.254959 298.435974 102.782669 127.369995 89.6%"] //转成泛型集合 val results = ArrayList() output.forEach { @@ -288,6 +280,28 @@ yolo.prob = strings.last() results.add(yolo) + + //需要根据检测结果反推属于什么场景 + val label = LocaleConstant.CLASS_NAMES_ARRAY[yolo.type] + + targetSet.add(label) + detectedScene = label.getSceneByTarget() + detectedSceneSet.add(detectedScene) + lifecycleScope.launch(Dispatchers.Main) { + binding.titleView.setTitle(detectedScene) + //显示角标 + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" + + //显示弹框 +// if (!detectResultDialog.isShowing) { +// detectResultDialog.updateDialogMessage(label) +// detectResultDialog.show() +// } + } } Log.d(kTag, results.toJson()) binding.detectView.updateTargetPosition(results) diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index bea13e0..cc1f13e 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -50,8 +50,8 @@ //协程预加载算法模型 lifecycleScope.launch(Dispatchers.IO) { - yolov8ncnn.loadModel(assets, 2, 0) - yolov8ncnn.updateYoloState(YoloStateConst.DETECT) + yolov8ncnn.loadModel(assets, 1, 0) + yolov8ncnn.updateYoloState(YoloStateConst.CLASSIFY) } //初始化OpenCV 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 dd30acd..fc8dccf 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,6 +6,7 @@ import android.os.Bundle 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 @@ -14,6 +15,7 @@ import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding +import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult @@ -24,6 +26,7 @@ import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.InspectionViewModel +import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -52,8 +55,10 @@ private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } + private val detectedSceneSet by lazy { HashSet() } private val yolov8ncnn by lazy { Yolov8ncnn() } private val mat by lazy { Mat() } + private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private var inspectionAddress = "" @@ -258,19 +263,6 @@ } override fun onDetect(output: ArrayList) { - //需要根据检测结果反推属于什么场景 -// val label = LocaleConstant.CLASS_NAMES_ARRAY[output.type] -// -// targetSet.add(label) -// detectedScene = label.getSceneByTarget() -// lifecycleScope.launch(Dispatchers.Main) { -// binding.titleView.setTitle(detectedScene) -// //显示角标 -// binding.tipsTagView.visibility = View.VISIBLE -// binding.tipsTagView.text = "${targetSet.size}" -// } - - //["0 0.376022 303.246338 117.298019 116.764282 91.2%","4 180.254959 298.435974 102.782669 127.369995 89.6%"] //转成泛型集合 val results = ArrayList() output.forEach { @@ -288,6 +280,28 @@ yolo.prob = strings.last() results.add(yolo) + + //需要根据检测结果反推属于什么场景 + val label = LocaleConstant.CLASS_NAMES_ARRAY[yolo.type] + + targetSet.add(label) + detectedScene = label.getSceneByTarget() + detectedSceneSet.add(detectedScene) + lifecycleScope.launch(Dispatchers.Main) { + binding.titleView.setTitle(detectedScene) + //显示角标 + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" + + //显示弹框 +// if (!detectResultDialog.isShowing) { +// detectResultDialog.updateDialogMessage(label) +// detectResultDialog.show() +// } + } } Log.d(kTag, results.toJson()) binding.detectView.updateTargetPosition(results) diff --git a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt new file mode 100644 index 0000000..ff2c3f6 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt @@ -0,0 +1,26 @@ +package com.casic.br.app.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.br.app.databinding.DialogDetectResultBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class DetectResultDialog(context: Context) : Dialog(context) { + + private val binding: DialogDetectResultBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(0.8f) + + binding.confirmButton.setOnClickListener { } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun updateDialogMessage(message: String) { + binding.messageView.text = message + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index bea13e0..cc1f13e 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -50,8 +50,8 @@ //协程预加载算法模型 lifecycleScope.launch(Dispatchers.IO) { - yolov8ncnn.loadModel(assets, 2, 0) - yolov8ncnn.updateYoloState(YoloStateConst.DETECT) + yolov8ncnn.loadModel(assets, 1, 0) + yolov8ncnn.updateYoloState(YoloStateConst.CLASSIFY) } //初始化OpenCV 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 dd30acd..fc8dccf 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,6 +6,7 @@ import android.os.Bundle 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 @@ -14,6 +15,7 @@ import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding +import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult @@ -24,6 +26,7 @@ import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.InspectionViewModel +import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -52,8 +55,10 @@ private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } + private val detectedSceneSet by lazy { HashSet() } private val yolov8ncnn by lazy { Yolov8ncnn() } private val mat by lazy { Mat() } + private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private var inspectionAddress = "" @@ -258,19 +263,6 @@ } override fun onDetect(output: ArrayList) { - //需要根据检测结果反推属于什么场景 -// val label = LocaleConstant.CLASS_NAMES_ARRAY[output.type] -// -// targetSet.add(label) -// detectedScene = label.getSceneByTarget() -// lifecycleScope.launch(Dispatchers.Main) { -// binding.titleView.setTitle(detectedScene) -// //显示角标 -// binding.tipsTagView.visibility = View.VISIBLE -// binding.tipsTagView.text = "${targetSet.size}" -// } - - //["0 0.376022 303.246338 117.298019 116.764282 91.2%","4 180.254959 298.435974 102.782669 127.369995 89.6%"] //转成泛型集合 val results = ArrayList() output.forEach { @@ -288,6 +280,28 @@ yolo.prob = strings.last() results.add(yolo) + + //需要根据检测结果反推属于什么场景 + val label = LocaleConstant.CLASS_NAMES_ARRAY[yolo.type] + + targetSet.add(label) + detectedScene = label.getSceneByTarget() + detectedSceneSet.add(detectedScene) + lifecycleScope.launch(Dispatchers.Main) { + binding.titleView.setTitle(detectedScene) + //显示角标 + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" + + //显示弹框 +// if (!detectResultDialog.isShowing) { +// detectResultDialog.updateDialogMessage(label) +// detectResultDialog.show() +// } + } } Log.d(kTag, results.toJson()) binding.detectView.updateTargetPosition(results) diff --git a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt new file mode 100644 index 0000000..ff2c3f6 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt @@ -0,0 +1,26 @@ +package com.casic.br.app.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.br.app.databinding.DialogDetectResultBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class DetectResultDialog(context: Context) : Dialog(context) { + + private val binding: DialogDetectResultBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(0.8f) + + binding.confirmButton.setOnClickListener { } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun updateDialogMessage(message: String) { + binding.messageView.text = message + } +} \ No newline at end of file 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 90cf175..3442717 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 @@ -22,12 +22,15 @@ private val borderPaint by lazy { Paint() } private val rect by lazy { Rect() } private var results = ArrayList() + private var textHeight = 0 init { textPaint.color = Color.WHITE textPaint.isAntiAlias = true textPaint.textAlign = Paint.Align.CENTER textPaint.textSize = 14f.sp2px(context) + val fontMetrics = textPaint.fontMetrics + textHeight = (fontMetrics.bottom - fontMetrics.top).toInt() backgroundPaint.color = Color.BLUE backgroundPaint.style = Paint.Style.FILL @@ -41,7 +44,7 @@ fun updateTargetPosition(results: ArrayList) { this.results = results - postInvalidate() + invalidate() } override fun onDraw(canvas: Canvas) { @@ -55,7 +58,7 @@ (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() - 50 + it.position[1].dp2px(context).toInt() - textHeight ) canvas.drawRect(rect, backgroundPaint) diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index bea13e0..cc1f13e 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -50,8 +50,8 @@ //协程预加载算法模型 lifecycleScope.launch(Dispatchers.IO) { - yolov8ncnn.loadModel(assets, 2, 0) - yolov8ncnn.updateYoloState(YoloStateConst.DETECT) + yolov8ncnn.loadModel(assets, 1, 0) + yolov8ncnn.updateYoloState(YoloStateConst.CLASSIFY) } //初始化OpenCV 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 dd30acd..fc8dccf 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,6 +6,7 @@ import android.os.Bundle 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 @@ -14,6 +15,7 @@ import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding +import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult @@ -24,6 +26,7 @@ import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.InspectionViewModel +import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -52,8 +55,10 @@ private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } + private val detectedSceneSet by lazy { HashSet() } private val yolov8ncnn by lazy { Yolov8ncnn() } private val mat by lazy { Mat() } + private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private var inspectionAddress = "" @@ -258,19 +263,6 @@ } override fun onDetect(output: ArrayList) { - //需要根据检测结果反推属于什么场景 -// val label = LocaleConstant.CLASS_NAMES_ARRAY[output.type] -// -// targetSet.add(label) -// detectedScene = label.getSceneByTarget() -// lifecycleScope.launch(Dispatchers.Main) { -// binding.titleView.setTitle(detectedScene) -// //显示角标 -// binding.tipsTagView.visibility = View.VISIBLE -// binding.tipsTagView.text = "${targetSet.size}" -// } - - //["0 0.376022 303.246338 117.298019 116.764282 91.2%","4 180.254959 298.435974 102.782669 127.369995 89.6%"] //转成泛型集合 val results = ArrayList() output.forEach { @@ -288,6 +280,28 @@ yolo.prob = strings.last() results.add(yolo) + + //需要根据检测结果反推属于什么场景 + val label = LocaleConstant.CLASS_NAMES_ARRAY[yolo.type] + + targetSet.add(label) + detectedScene = label.getSceneByTarget() + detectedSceneSet.add(detectedScene) + lifecycleScope.launch(Dispatchers.Main) { + binding.titleView.setTitle(detectedScene) + //显示角标 + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" + + //显示弹框 +// if (!detectResultDialog.isShowing) { +// detectResultDialog.updateDialogMessage(label) +// detectResultDialog.show() +// } + } } Log.d(kTag, results.toJson()) binding.detectView.updateTargetPosition(results) diff --git a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt new file mode 100644 index 0000000..ff2c3f6 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt @@ -0,0 +1,26 @@ +package com.casic.br.app.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.br.app.databinding.DialogDetectResultBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class DetectResultDialog(context: Context) : Dialog(context) { + + private val binding: DialogDetectResultBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(0.8f) + + binding.confirmButton.setOnClickListener { } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun updateDialogMessage(message: String) { + binding.messageView.text = message + } +} \ No newline at end of file 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 90cf175..3442717 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 @@ -22,12 +22,15 @@ private val borderPaint by lazy { Paint() } private val rect by lazy { Rect() } private var results = ArrayList() + private var textHeight = 0 init { textPaint.color = Color.WHITE textPaint.isAntiAlias = true textPaint.textAlign = Paint.Align.CENTER textPaint.textSize = 14f.sp2px(context) + val fontMetrics = textPaint.fontMetrics + textHeight = (fontMetrics.bottom - fontMetrics.top).toInt() backgroundPaint.color = Color.BLUE backgroundPaint.style = Paint.Style.FILL @@ -41,7 +44,7 @@ fun updateTargetPosition(results: ArrayList) { this.results = results - postInvalidate() + invalidate() } override fun onDraw(canvas: Canvas) { @@ -55,7 +58,7 @@ (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() - 50 + it.position[1].dp2px(context).toInt() - textHeight ) canvas.drawRect(rect, backgroundPaint) diff --git a/app/src/main/res/drawable/button_dialog_selector_gray_22.xml b/app/src/main/res/drawable/button_dialog_selector_gray_22.xml new file mode 100644 index 0000000..4bcce86 --- /dev/null +++ b/app/src/main/res/drawable/button_dialog_selector_gray_22.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index bea13e0..cc1f13e 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -50,8 +50,8 @@ //协程预加载算法模型 lifecycleScope.launch(Dispatchers.IO) { - yolov8ncnn.loadModel(assets, 2, 0) - yolov8ncnn.updateYoloState(YoloStateConst.DETECT) + yolov8ncnn.loadModel(assets, 1, 0) + yolov8ncnn.updateYoloState(YoloStateConst.CLASSIFY) } //初始化OpenCV 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 dd30acd..fc8dccf 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,6 +6,7 @@ import android.os.Bundle 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 @@ -14,6 +15,7 @@ import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding +import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult @@ -24,6 +26,7 @@ import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.InspectionViewModel +import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -52,8 +55,10 @@ private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } + private val detectedSceneSet by lazy { HashSet() } private val yolov8ncnn by lazy { Yolov8ncnn() } private val mat by lazy { Mat() } + private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private var inspectionAddress = "" @@ -258,19 +263,6 @@ } override fun onDetect(output: ArrayList) { - //需要根据检测结果反推属于什么场景 -// val label = LocaleConstant.CLASS_NAMES_ARRAY[output.type] -// -// targetSet.add(label) -// detectedScene = label.getSceneByTarget() -// lifecycleScope.launch(Dispatchers.Main) { -// binding.titleView.setTitle(detectedScene) -// //显示角标 -// binding.tipsTagView.visibility = View.VISIBLE -// binding.tipsTagView.text = "${targetSet.size}" -// } - - //["0 0.376022 303.246338 117.298019 116.764282 91.2%","4 180.254959 298.435974 102.782669 127.369995 89.6%"] //转成泛型集合 val results = ArrayList() output.forEach { @@ -288,6 +280,28 @@ yolo.prob = strings.last() results.add(yolo) + + //需要根据检测结果反推属于什么场景 + val label = LocaleConstant.CLASS_NAMES_ARRAY[yolo.type] + + targetSet.add(label) + detectedScene = label.getSceneByTarget() + detectedSceneSet.add(detectedScene) + lifecycleScope.launch(Dispatchers.Main) { + binding.titleView.setTitle(detectedScene) + //显示角标 + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" + + //显示弹框 +// if (!detectResultDialog.isShowing) { +// detectResultDialog.updateDialogMessage(label) +// detectResultDialog.show() +// } + } } Log.d(kTag, results.toJson()) binding.detectView.updateTargetPosition(results) diff --git a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt new file mode 100644 index 0000000..ff2c3f6 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt @@ -0,0 +1,26 @@ +package com.casic.br.app.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.br.app.databinding.DialogDetectResultBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class DetectResultDialog(context: Context) : Dialog(context) { + + private val binding: DialogDetectResultBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(0.8f) + + binding.confirmButton.setOnClickListener { } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun updateDialogMessage(message: String) { + binding.messageView.text = message + } +} \ No newline at end of file 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 90cf175..3442717 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 @@ -22,12 +22,15 @@ private val borderPaint by lazy { Paint() } private val rect by lazy { Rect() } private var results = ArrayList() + private var textHeight = 0 init { textPaint.color = Color.WHITE textPaint.isAntiAlias = true textPaint.textAlign = Paint.Align.CENTER textPaint.textSize = 14f.sp2px(context) + val fontMetrics = textPaint.fontMetrics + textHeight = (fontMetrics.bottom - fontMetrics.top).toInt() backgroundPaint.color = Color.BLUE backgroundPaint.style = Paint.Style.FILL @@ -41,7 +44,7 @@ fun updateTargetPosition(results: ArrayList) { this.results = results - postInvalidate() + invalidate() } override fun onDraw(canvas: Canvas) { @@ -55,7 +58,7 @@ (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() - 50 + it.position[1].dp2px(context).toInt() - textHeight ) canvas.drawRect(rect, backgroundPaint) diff --git a/app/src/main/res/drawable/button_dialog_selector_gray_22.xml b/app/src/main/res/drawable/button_dialog_selector_gray_22.xml new file mode 100644 index 0000000..4bcce86 --- /dev/null +++ b/app/src/main/res/drawable/button_dialog_selector_gray_22.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_dialog_selector_red_22.xml b/app/src/main/res/drawable/button_dialog_selector_red_22.xml new file mode 100644 index 0000000..3983cdc --- /dev/null +++ b/app/src/main/res/drawable/button_dialog_selector_red_22.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index bea13e0..cc1f13e 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -50,8 +50,8 @@ //协程预加载算法模型 lifecycleScope.launch(Dispatchers.IO) { - yolov8ncnn.loadModel(assets, 2, 0) - yolov8ncnn.updateYoloState(YoloStateConst.DETECT) + yolov8ncnn.loadModel(assets, 1, 0) + yolov8ncnn.updateYoloState(YoloStateConst.CLASSIFY) } //初始化OpenCV 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 dd30acd..fc8dccf 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,6 +6,7 @@ import android.os.Bundle 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 @@ -14,6 +15,7 @@ import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding +import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult @@ -24,6 +26,7 @@ import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.InspectionViewModel +import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -52,8 +55,10 @@ private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } + private val detectedSceneSet by lazy { HashSet() } private val yolov8ncnn by lazy { Yolov8ncnn() } private val mat by lazy { Mat() } + private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private var inspectionAddress = "" @@ -258,19 +263,6 @@ } override fun onDetect(output: ArrayList) { - //需要根据检测结果反推属于什么场景 -// val label = LocaleConstant.CLASS_NAMES_ARRAY[output.type] -// -// targetSet.add(label) -// detectedScene = label.getSceneByTarget() -// lifecycleScope.launch(Dispatchers.Main) { -// binding.titleView.setTitle(detectedScene) -// //显示角标 -// binding.tipsTagView.visibility = View.VISIBLE -// binding.tipsTagView.text = "${targetSet.size}" -// } - - //["0 0.376022 303.246338 117.298019 116.764282 91.2%","4 180.254959 298.435974 102.782669 127.369995 89.6%"] //转成泛型集合 val results = ArrayList() output.forEach { @@ -288,6 +280,28 @@ yolo.prob = strings.last() results.add(yolo) + + //需要根据检测结果反推属于什么场景 + val label = LocaleConstant.CLASS_NAMES_ARRAY[yolo.type] + + targetSet.add(label) + detectedScene = label.getSceneByTarget() + detectedSceneSet.add(detectedScene) + lifecycleScope.launch(Dispatchers.Main) { + binding.titleView.setTitle(detectedScene) + //显示角标 + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" + + //显示弹框 +// if (!detectResultDialog.isShowing) { +// detectResultDialog.updateDialogMessage(label) +// detectResultDialog.show() +// } + } } Log.d(kTag, results.toJson()) binding.detectView.updateTargetPosition(results) diff --git a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt new file mode 100644 index 0000000..ff2c3f6 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt @@ -0,0 +1,26 @@ +package com.casic.br.app.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.br.app.databinding.DialogDetectResultBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class DetectResultDialog(context: Context) : Dialog(context) { + + private val binding: DialogDetectResultBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(0.8f) + + binding.confirmButton.setOnClickListener { } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun updateDialogMessage(message: String) { + binding.messageView.text = message + } +} \ No newline at end of file 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 90cf175..3442717 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 @@ -22,12 +22,15 @@ private val borderPaint by lazy { Paint() } private val rect by lazy { Rect() } private var results = ArrayList() + private var textHeight = 0 init { textPaint.color = Color.WHITE textPaint.isAntiAlias = true textPaint.textAlign = Paint.Align.CENTER textPaint.textSize = 14f.sp2px(context) + val fontMetrics = textPaint.fontMetrics + textHeight = (fontMetrics.bottom - fontMetrics.top).toInt() backgroundPaint.color = Color.BLUE backgroundPaint.style = Paint.Style.FILL @@ -41,7 +44,7 @@ fun updateTargetPosition(results: ArrayList) { this.results = results - postInvalidate() + invalidate() } override fun onDraw(canvas: Canvas) { @@ -55,7 +58,7 @@ (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() - 50 + it.position[1].dp2px(context).toInt() - textHeight ) canvas.drawRect(rect, backgroundPaint) diff --git a/app/src/main/res/drawable/button_dialog_selector_gray_22.xml b/app/src/main/res/drawable/button_dialog_selector_gray_22.xml new file mode 100644 index 0000000..4bcce86 --- /dev/null +++ b/app/src/main/res/drawable/button_dialog_selector_gray_22.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_dialog_selector_red_22.xml b/app/src/main/res/drawable/button_dialog_selector_red_22.xml new file mode 100644 index 0000000..3983cdc --- /dev/null +++ b/app/src/main/res/drawable/button_dialog_selector_red_22.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..9a4c13c --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index bea13e0..cc1f13e 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -50,8 +50,8 @@ //协程预加载算法模型 lifecycleScope.launch(Dispatchers.IO) { - yolov8ncnn.loadModel(assets, 2, 0) - yolov8ncnn.updateYoloState(YoloStateConst.DETECT) + yolov8ncnn.loadModel(assets, 1, 0) + yolov8ncnn.updateYoloState(YoloStateConst.CLASSIFY) } //初始化OpenCV 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 dd30acd..fc8dccf 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,6 +6,7 @@ import android.os.Bundle 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 @@ -14,6 +15,7 @@ import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckByYoloBinding +import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult @@ -24,6 +26,7 @@ import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.InspectionViewModel +import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -52,8 +55,10 @@ private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } + private val detectedSceneSet by lazy { HashSet() } private val yolov8ncnn by lazy { Yolov8ncnn() } private val mat by lazy { Mat() } + private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private var inspectionAddress = "" @@ -258,19 +263,6 @@ } override fun onDetect(output: ArrayList) { - //需要根据检测结果反推属于什么场景 -// val label = LocaleConstant.CLASS_NAMES_ARRAY[output.type] -// -// targetSet.add(label) -// detectedScene = label.getSceneByTarget() -// lifecycleScope.launch(Dispatchers.Main) { -// binding.titleView.setTitle(detectedScene) -// //显示角标 -// binding.tipsTagView.visibility = View.VISIBLE -// binding.tipsTagView.text = "${targetSet.size}" -// } - - //["0 0.376022 303.246338 117.298019 116.764282 91.2%","4 180.254959 298.435974 102.782669 127.369995 89.6%"] //转成泛型集合 val results = ArrayList() output.forEach { @@ -288,6 +280,28 @@ yolo.prob = strings.last() results.add(yolo) + + //需要根据检测结果反推属于什么场景 + val label = LocaleConstant.CLASS_NAMES_ARRAY[yolo.type] + + targetSet.add(label) + detectedScene = label.getSceneByTarget() + detectedSceneSet.add(detectedScene) + lifecycleScope.launch(Dispatchers.Main) { + binding.titleView.setTitle(detectedScene) + //显示角标 + binding.tipsTagView.visibility = View.VISIBLE + binding.tipsTagView.text = "${targetSet.size}" + + binding.listTagView.visibility = View.VISIBLE + binding.listTagView.text = "${detectedSceneSet.size}" + + //显示弹框 +// if (!detectResultDialog.isShowing) { +// detectResultDialog.updateDialogMessage(label) +// detectResultDialog.show() +// } + } } Log.d(kTag, results.toJson()) binding.detectView.updateTargetPosition(results) diff --git a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt new file mode 100644 index 0000000..ff2c3f6 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt @@ -0,0 +1,26 @@ +package com.casic.br.app.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.casic.br.app.databinding.DialogDetectResultBinding +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.initDialogLayoutParams + +class DetectResultDialog(context: Context) : Dialog(context) { + + private val binding: DialogDetectResultBinding by binding() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + initDialogLayoutParams(0.8f) + + binding.confirmButton.setOnClickListener { } + + binding.cancelButton.setOnClickListener { dismiss() } + } + + fun updateDialogMessage(message: String) { + binding.messageView.text = message + } +} \ No newline at end of file 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 90cf175..3442717 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 @@ -22,12 +22,15 @@ private val borderPaint by lazy { Paint() } private val rect by lazy { Rect() } private var results = ArrayList() + private var textHeight = 0 init { textPaint.color = Color.WHITE textPaint.isAntiAlias = true textPaint.textAlign = Paint.Align.CENTER textPaint.textSize = 14f.sp2px(context) + val fontMetrics = textPaint.fontMetrics + textHeight = (fontMetrics.bottom - fontMetrics.top).toInt() backgroundPaint.color = Color.BLUE backgroundPaint.style = Paint.Style.FILL @@ -41,7 +44,7 @@ fun updateTargetPosition(results: ArrayList) { this.results = results - postInvalidate() + invalidate() } override fun onDraw(canvas: Canvas) { @@ -55,7 +58,7 @@ (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() - 50 + it.position[1].dp2px(context).toInt() - textHeight ) canvas.drawRect(rect, backgroundPaint) diff --git a/app/src/main/res/drawable/button_dialog_selector_gray_22.xml b/app/src/main/res/drawable/button_dialog_selector_gray_22.xml new file mode 100644 index 0000000..4bcce86 --- /dev/null +++ b/app/src/main/res/drawable/button_dialog_selector_gray_22.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_dialog_selector_red_22.xml b/app/src/main/res/drawable/button_dialog_selector_red_22.xml new file mode 100644 index 0000000..3983cdc --- /dev/null +++ b/app/src/main/res/drawable/button_dialog_selector_red_22.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..9a4c13c --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/dialog_detect_result.xml b/app/src/main/res/layout/dialog_detect_result.xml new file mode 100644 index 0000000..cd8a077 --- /dev/null +++ b/app/src/main/res/layout/dialog_detect_result.xml @@ -0,0 +1,58 @@ + + + + + + + + + +