diff --git a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt b/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt deleted file mode 100644 index c9cb0f3..0000000 --- a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.br.app.extensions - -import com.casic.br.app.external.YoloResult - -/** - * 判断集合中是否含有某一类元素 - * */ -fun ArrayList.isContains(target: Int): Boolean { - var result = false - for (yolo in this) { - if (yolo.type == target) { - result = true - break - } - } - return result -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt b/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt deleted file mode 100644 index c9cb0f3..0000000 --- a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.br.app.extensions - -import com.casic.br.app.external.YoloResult - -/** - * 判断集合中是否含有某一类元素 - * */ -fun ArrayList.isContains(target: Int): Boolean { - var result = false - for (yolo in this) { - if (yolo.type == target) { - result = true - break - } - } - return result -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/List.kt b/app/src/main/java/com/casic/br/app/extensions/List.kt new file mode 100644 index 0000000..b6276f2 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/extensions/List.kt @@ -0,0 +1,17 @@ +package com.casic.br.app.extensions + +import com.casic.br.app.external.YoloResult + +/** + * 判断集合中是否含有某一类元素 + * */ +fun List.isContains(target: Int): Boolean { + var result = false + for (yolo in this) { + if (yolo.type == target) { + result = true + break + } + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt b/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt deleted file mode 100644 index c9cb0f3..0000000 --- a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.br.app.extensions - -import com.casic.br.app.external.YoloResult - -/** - * 判断集合中是否含有某一类元素 - * */ -fun ArrayList.isContains(target: Int): Boolean { - var result = false - for (yolo in this) { - if (yolo.type == target) { - result = true - break - } - } - return result -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/List.kt b/app/src/main/java/com/casic/br/app/extensions/List.kt new file mode 100644 index 0000000..b6276f2 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/extensions/List.kt @@ -0,0 +1,17 @@ +package com.casic.br.app.extensions + +import com.casic.br.app.external.YoloResult + +/** + * 判断集合中是否含有某一类元素 + * */ +fun List.isContains(target: Int): Boolean { + var result = false + for (yolo in this) { + if (yolo.type == target) { + result = true + break + } + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java b/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java new file mode 100644 index 0000000..4c4f0c0 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java @@ -0,0 +1,24 @@ +package com.casic.br.app.model; + +import com.casic.br.app.external.YoloResult; + +public class HiddenTroubleResult extends YoloResult { + private String alarmCode; + private String warning; + + public String getAlarmCode() { + return alarmCode; + } + + public void setAlarmCode(String alarmCode) { + this.alarmCode = alarmCode; + } + + public String getWarning() { + return warning; + } + + public void setWarning(String warning) { + this.warning = warning; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt b/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt deleted file mode 100644 index c9cb0f3..0000000 --- a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.br.app.extensions - -import com.casic.br.app.external.YoloResult - -/** - * 判断集合中是否含有某一类元素 - * */ -fun ArrayList.isContains(target: Int): Boolean { - var result = false - for (yolo in this) { - if (yolo.type == target) { - result = true - break - } - } - return result -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/List.kt b/app/src/main/java/com/casic/br/app/extensions/List.kt new file mode 100644 index 0000000..b6276f2 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/extensions/List.kt @@ -0,0 +1,17 @@ +package com.casic.br.app.extensions + +import com.casic.br.app.external.YoloResult + +/** + * 判断集合中是否含有某一类元素 + * */ +fun List.isContains(target: Int): Boolean { + var result = false + for (yolo in this) { + if (yolo.type == target) { + result = true + break + } + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java b/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java new file mode 100644 index 0000000..4c4f0c0 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java @@ -0,0 +1,24 @@ +package com.casic.br.app.model; + +import com.casic.br.app.external.YoloResult; + +public class HiddenTroubleResult extends YoloResult { + private String alarmCode; + private String warning; + + public String getAlarmCode() { + return alarmCode; + } + + public void setAlarmCode(String alarmCode) { + this.alarmCode = alarmCode; + } + + public String getWarning() { + return warning; + } + + public void setWarning(String warning) { + this.warning = warning; + } +} \ 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 cf9366b..e6cff5d 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 @@ -20,12 +20,12 @@ import com.casic.br.app.extensions.convert2YoloResult import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar -import com.casic.br.app.extensions.isContains import com.casic.br.app.extensions.isInScene import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult import com.casic.br.app.external.Yolov8ncnn import com.casic.br.app.model.DictionaryModel +import com.casic.br.app.model.HiddenTroubleResult import com.casic.br.app.utils.LocaleConstant import com.casic.br.app.utils.LocationManager import com.casic.br.app.utils.RuntimeCache @@ -34,6 +34,7 @@ import com.casic.br.app.vm.ImageFileViewModel import com.casic.br.app.vm.InspectionViewModel import com.casic.br.app.widgets.DetectResultDialog +import com.casic.br.app.widgets.YoloTargetDetectView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -58,11 +59,6 @@ private val kTag = "StartCheckActivity" private val context = this - - /** - * 需要和训练出来的模型里面类别顺序保持一致 - * */ - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } @@ -260,202 +256,33 @@ override fun onSegmentation( segmentationOutput: ArrayList, detectOutput: ArrayList ) { - Log.d(kTag, "onSegmentation: ") - if (segmentationOutput.isEmpty() || detectOutput.isEmpty()) { - binding.detectView.updateTargetPosition() - } else { - val segmentationResults = ArrayList() - segmentationOutput.forEach { - segmentationResults.add(it.convert2YoloResult(this)) - } + val segmentationResults = ArrayList() + segmentationOutput.forEach { + segmentationResults.add(it.convert2YoloResult(this)) + } - val detectResults = ArrayList() - detectOutput.forEach { - detectResults.add(it.convert2YoloResult(this)) - } + val detectResults = ArrayList() + detectOutput.forEach { + detectResults.add(it.convert2YoloResult(this)) + } - binding.detectView.updateTargetPosition(segmentationResults, detectResults) - - detectResults.forEach { - val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] - if (label.isInScene(detectedScene)) { - targetSet.add(label) + binding.detectView.updateTargetPosition( + segmentationResults, detectResults, + object : YoloTargetDetectView.OnDetectCallback { + override fun onDetected(result: HiddenTroubleResult) { + //显示隐患弹框 + val message = weakReferenceHandler.obtainMessage() + message.what = 2024082902 + message.obj = result + weakReferenceHandler.sendMessage(message) } + }) + + detectResults.forEach { + val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] + if (label.isInScene(detectedScene)) { + targetSet.add(label) } - - //只显示隐患 - var warnings = "" - when (detectedScene) { - "配电箱" -> { - if (!detectResults.isContains(16)) { - warnings = "配电箱无警示标识" - alarmCode = "DistributionBoxHasNoWarningSign" - } - - if (!detectResults.isContains(36)) { - warnings = "配电箱内无电路图" - alarmCode = "DistributionBoxHasNoCircuitDiagram" - } - - if (detectResults.isContains(35)) { - warnings = "配电箱内部电线裸露" - alarmCode = "" - } - - if (detectResults.isContains(41)) { - warnings = "配电箱有跨电线" - alarmCode = "DistributionBoxHasNoJumperWire" - } - - if (segmentationResults.isNotEmpty()) { - warnings = "配电箱内电线杂乱" - alarmCode = "DistributionBoxHasTangledWire" - } - } - - "有限空间作业" -> { - if (detectResults.isContains(3)) { - if (!detectResults.isContains(15)) { - warnings = "未佩戴安全帽" - alarmCode = "ConfinedSpaceHasNoWorkerSafelyHat" - } - - if (!detectResults.isContains(20)) { - warnings = "未着工服" - alarmCode = "ConfinedSpaceHasNoWorkerClothes" - } - - if (!detectResults.isContains(15) && !detectResults.isContains(17)) { - warnings = "没有佩戴安全带、安全绳" - alarmCode = "ConfinedSpaceHasNoWorkerSafelyLine" - } - } - - if (!detectResults.isContains(9)) { - warnings = "未发现呼吸防护设备" - alarmCode = "ConfinedSpaceHasNoWorkerMask" - } - - if (!detectResults.isContains(42) && !detectResults.isContains(37)) { - warnings = "未发现路锥、警戒线" - alarmCode = "ConfinedSpaceHasNoEnclosure" - } - - if (!detectResults.isContains(14)) { - warnings = "未发现安全告知牌" - alarmCode = "ConfinedSpaceHasNoWarningSign" - } - - if (!detectResults.isContains(51)) { - warnings = "未发现通风设备" - alarmCode = "ConfinedSpaceHasNoAirSupply" - } - - if (!detectResults.isContains(33)) { - warnings = "未发现井下照明设备" - alarmCode = "ConfinedSpaceHasNoLighting" - } - - if (!detectResults.isContains(18)) { - warnings = "未发现井下对讲设备" - alarmCode = "ConfinedSpaceHasNoIntercom" - } - - if (!detectResults.isContains(0)) { - warnings = "未发现施工三脚架" - alarmCode = "ConfinedSpaceHasNoTripod" - } - - if (!detectResults.isContains(25)) { - warnings = "未发现气体检测仪" - alarmCode = "ConfinedSpaceHasNoGasDetector" - } - } - - "非居民用户" -> { - if (segmentationResults.isContains(4)) { - warnings = "腐蚀、锈蚀" - alarmCode = "NonResidentUserHasPipelineRust" - } - - if (segmentationResults.isContains(0)) { - warnings = "软管不可恢复的弯折拉伸" - alarmCode = "NonResidentUserHasHoseFlexure" - } - - if (detectResults.isContains(49)) { - warnings = "非专用软管" - alarmCode = "NonResidentUserHasNonDedicatedHose" - } - - if (detectResults.isContains(1)) { - warnings = "软管有接头或三通" - alarmCode = "NonResidentUserHasNoHoseJoint" - } - - if (!detectResults.isContains(4)) { - warnings = "未发现切断阀" - alarmCode = "NonResidentUserHasNoShutoffValve" - } - - if (detectResults.isContains(34)) { - warnings = "未发现熄火保护装置" - alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" - } - - if (detectResults.isContains(22)) { - warnings = "未发现燃气泄漏报警装置" - alarmCode = "NonResidentUserHasNoAlarmDevice" - } - } - - "居民用户" -> { - if (segmentationResults.isContains(4)) { - warnings = "腐蚀、锈蚀" - alarmCode = "NonResidentUserHasPipelineRust" - } - - if (segmentationResults.isContains(0)) { - warnings = "软管不可恢复的弯折拉伸" - alarmCode = "NonResidentUserHasHoseFlexure" - } - - if (detectResults.isContains(49)) { - warnings = "非专用软管" - alarmCode = "NonResidentUserHasNonDedicatedHose" - } - - if (detectResults.isContains(1)) { - warnings = "软管有接头或三通" - alarmCode = "NonResidentUserHasNoHoseJoint" - } - - if (!detectResults.isContains(4)) { - warnings = "未发现切断阀" - alarmCode = "NonResidentUserHasNoShutoffValve" - } - - if (detectResults.isContains(34)) { - warnings = "未发现熄火保护装置" - alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" - } - - if (detectResults.isContains(22)) { - warnings = "未发现燃气泄漏报警装置" - alarmCode = "NonResidentUserHasNoAlarmDevice" - } - } - } - - if (warnings == "") { - return - } - - //显示弹框 - val message = weakReferenceHandler.obtainMessage() - message.what = 2024082902 - message.obj = warnings - weakReferenceHandler.sendMessage(message) } } @@ -465,9 +292,6 @@ return } - //暂停算法 - yolov8ncnn.onPause() - val firstYoloResult = output.first().toInt() //取结果的第一个为场景判断 val label = LocaleConstant.CLASS_NAMES_ARRAY[firstYoloResult] @@ -477,6 +301,9 @@ return } + //暂停算法 + yolov8ncnn.onPause() + val message = weakReferenceHandler.obtainMessage() message.what = 2024082901 message.obj = scene @@ -522,8 +349,8 @@ binding.tipsTagView.visibility = View.VISIBLE binding.tipsTagView.text = "${targetSet.size}" - val target = msg.obj as String - if (detectedTargetSet.contains(target)) { + val target = msg.obj as HiddenTroubleResult + if (detectedTargetSet.contains(target.warning)) { "该目标/隐患已识别过".show(this) return true } @@ -534,11 +361,12 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, + detectResultDialog.updateDialogContentView(target.warning, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onConfirmClick(file: File) { + alarmCode = target.alarmCode imageFileViewModel.uploadImage(file) - detectedTargetSet.add(target) + detectedTargetSet.add(target.warning) } }).show() } diff --git a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt b/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt deleted file mode 100644 index c9cb0f3..0000000 --- a/app/src/main/java/com/casic/br/app/extensions/ArrayList.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.br.app.extensions - -import com.casic.br.app.external.YoloResult - -/** - * 判断集合中是否含有某一类元素 - * */ -fun ArrayList.isContains(target: Int): Boolean { - var result = false - for (yolo in this) { - if (yolo.type == target) { - result = true - break - } - } - return result -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/List.kt b/app/src/main/java/com/casic/br/app/extensions/List.kt new file mode 100644 index 0000000..b6276f2 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/extensions/List.kt @@ -0,0 +1,17 @@ +package com.casic.br.app.extensions + +import com.casic.br.app.external.YoloResult + +/** + * 判断集合中是否含有某一类元素 + * */ +fun List.isContains(target: Int): Boolean { + var result = false + for (yolo in this) { + if (yolo.type == target) { + result = true + break + } + } + return result +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java b/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java new file mode 100644 index 0000000..4c4f0c0 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/HiddenTroubleResult.java @@ -0,0 +1,24 @@ +package com.casic.br.app.model; + +import com.casic.br.app.external.YoloResult; + +public class HiddenTroubleResult extends YoloResult { + private String alarmCode; + private String warning; + + public String getAlarmCode() { + return alarmCode; + } + + public void setAlarmCode(String alarmCode) { + this.alarmCode = alarmCode; + } + + public String getWarning() { + return warning; + } + + public void setWarning(String warning) { + this.warning = warning; + } +} \ 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 cf9366b..e6cff5d 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 @@ -20,12 +20,12 @@ import com.casic.br.app.extensions.convert2YoloResult import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar -import com.casic.br.app.extensions.isContains import com.casic.br.app.extensions.isInScene import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult import com.casic.br.app.external.Yolov8ncnn import com.casic.br.app.model.DictionaryModel +import com.casic.br.app.model.HiddenTroubleResult import com.casic.br.app.utils.LocaleConstant import com.casic.br.app.utils.LocationManager import com.casic.br.app.utils.RuntimeCache @@ -34,6 +34,7 @@ import com.casic.br.app.vm.ImageFileViewModel import com.casic.br.app.vm.InspectionViewModel import com.casic.br.app.widgets.DetectResultDialog +import com.casic.br.app.widgets.YoloTargetDetectView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo @@ -58,11 +59,6 @@ private val kTag = "StartCheckActivity" private val context = this - - /** - * 需要和训练出来的模型里面类别顺序保持一致 - * */ - private val classArray = arrayOf("电线整洁", "电线杂乱", "餐馆厨房") private val locationManager by lazy { LocationManager(this) } private val targetSet by lazy { HashSet() } private val detectedSceneSet by lazy { HashSet() } @@ -260,202 +256,33 @@ override fun onSegmentation( segmentationOutput: ArrayList, detectOutput: ArrayList ) { - Log.d(kTag, "onSegmentation: ") - if (segmentationOutput.isEmpty() || detectOutput.isEmpty()) { - binding.detectView.updateTargetPosition() - } else { - val segmentationResults = ArrayList() - segmentationOutput.forEach { - segmentationResults.add(it.convert2YoloResult(this)) - } + val segmentationResults = ArrayList() + segmentationOutput.forEach { + segmentationResults.add(it.convert2YoloResult(this)) + } - val detectResults = ArrayList() - detectOutput.forEach { - detectResults.add(it.convert2YoloResult(this)) - } + val detectResults = ArrayList() + detectOutput.forEach { + detectResults.add(it.convert2YoloResult(this)) + } - binding.detectView.updateTargetPosition(segmentationResults, detectResults) - - detectResults.forEach { - val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] - if (label.isInScene(detectedScene)) { - targetSet.add(label) + binding.detectView.updateTargetPosition( + segmentationResults, detectResults, + object : YoloTargetDetectView.OnDetectCallback { + override fun onDetected(result: HiddenTroubleResult) { + //显示隐患弹框 + val message = weakReferenceHandler.obtainMessage() + message.what = 2024082902 + message.obj = result + weakReferenceHandler.sendMessage(message) } + }) + + detectResults.forEach { + val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] + if (label.isInScene(detectedScene)) { + targetSet.add(label) } - - //只显示隐患 - var warnings = "" - when (detectedScene) { - "配电箱" -> { - if (!detectResults.isContains(16)) { - warnings = "配电箱无警示标识" - alarmCode = "DistributionBoxHasNoWarningSign" - } - - if (!detectResults.isContains(36)) { - warnings = "配电箱内无电路图" - alarmCode = "DistributionBoxHasNoCircuitDiagram" - } - - if (detectResults.isContains(35)) { - warnings = "配电箱内部电线裸露" - alarmCode = "" - } - - if (detectResults.isContains(41)) { - warnings = "配电箱有跨电线" - alarmCode = "DistributionBoxHasNoJumperWire" - } - - if (segmentationResults.isNotEmpty()) { - warnings = "配电箱内电线杂乱" - alarmCode = "DistributionBoxHasTangledWire" - } - } - - "有限空间作业" -> { - if (detectResults.isContains(3)) { - if (!detectResults.isContains(15)) { - warnings = "未佩戴安全帽" - alarmCode = "ConfinedSpaceHasNoWorkerSafelyHat" - } - - if (!detectResults.isContains(20)) { - warnings = "未着工服" - alarmCode = "ConfinedSpaceHasNoWorkerClothes" - } - - if (!detectResults.isContains(15) && !detectResults.isContains(17)) { - warnings = "没有佩戴安全带、安全绳" - alarmCode = "ConfinedSpaceHasNoWorkerSafelyLine" - } - } - - if (!detectResults.isContains(9)) { - warnings = "未发现呼吸防护设备" - alarmCode = "ConfinedSpaceHasNoWorkerMask" - } - - if (!detectResults.isContains(42) && !detectResults.isContains(37)) { - warnings = "未发现路锥、警戒线" - alarmCode = "ConfinedSpaceHasNoEnclosure" - } - - if (!detectResults.isContains(14)) { - warnings = "未发现安全告知牌" - alarmCode = "ConfinedSpaceHasNoWarningSign" - } - - if (!detectResults.isContains(51)) { - warnings = "未发现通风设备" - alarmCode = "ConfinedSpaceHasNoAirSupply" - } - - if (!detectResults.isContains(33)) { - warnings = "未发现井下照明设备" - alarmCode = "ConfinedSpaceHasNoLighting" - } - - if (!detectResults.isContains(18)) { - warnings = "未发现井下对讲设备" - alarmCode = "ConfinedSpaceHasNoIntercom" - } - - if (!detectResults.isContains(0)) { - warnings = "未发现施工三脚架" - alarmCode = "ConfinedSpaceHasNoTripod" - } - - if (!detectResults.isContains(25)) { - warnings = "未发现气体检测仪" - alarmCode = "ConfinedSpaceHasNoGasDetector" - } - } - - "非居民用户" -> { - if (segmentationResults.isContains(4)) { - warnings = "腐蚀、锈蚀" - alarmCode = "NonResidentUserHasPipelineRust" - } - - if (segmentationResults.isContains(0)) { - warnings = "软管不可恢复的弯折拉伸" - alarmCode = "NonResidentUserHasHoseFlexure" - } - - if (detectResults.isContains(49)) { - warnings = "非专用软管" - alarmCode = "NonResidentUserHasNonDedicatedHose" - } - - if (detectResults.isContains(1)) { - warnings = "软管有接头或三通" - alarmCode = "NonResidentUserHasNoHoseJoint" - } - - if (!detectResults.isContains(4)) { - warnings = "未发现切断阀" - alarmCode = "NonResidentUserHasNoShutoffValve" - } - - if (detectResults.isContains(34)) { - warnings = "未发现熄火保护装置" - alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" - } - - if (detectResults.isContains(22)) { - warnings = "未发现燃气泄漏报警装置" - alarmCode = "NonResidentUserHasNoAlarmDevice" - } - } - - "居民用户" -> { - if (segmentationResults.isContains(4)) { - warnings = "腐蚀、锈蚀" - alarmCode = "NonResidentUserHasPipelineRust" - } - - if (segmentationResults.isContains(0)) { - warnings = "软管不可恢复的弯折拉伸" - alarmCode = "NonResidentUserHasHoseFlexure" - } - - if (detectResults.isContains(49)) { - warnings = "非专用软管" - alarmCode = "NonResidentUserHasNonDedicatedHose" - } - - if (detectResults.isContains(1)) { - warnings = "软管有接头或三通" - alarmCode = "NonResidentUserHasNoHoseJoint" - } - - if (!detectResults.isContains(4)) { - warnings = "未发现切断阀" - alarmCode = "NonResidentUserHasNoShutoffValve" - } - - if (detectResults.isContains(34)) { - warnings = "未发现熄火保护装置" - alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" - } - - if (detectResults.isContains(22)) { - warnings = "未发现燃气泄漏报警装置" - alarmCode = "NonResidentUserHasNoAlarmDevice" - } - } - } - - if (warnings == "") { - return - } - - //显示弹框 - val message = weakReferenceHandler.obtainMessage() - message.what = 2024082902 - message.obj = warnings - weakReferenceHandler.sendMessage(message) } } @@ -465,9 +292,6 @@ return } - //暂停算法 - yolov8ncnn.onPause() - val firstYoloResult = output.first().toInt() //取结果的第一个为场景判断 val label = LocaleConstant.CLASS_NAMES_ARRAY[firstYoloResult] @@ -477,6 +301,9 @@ return } + //暂停算法 + yolov8ncnn.onPause() + val message = weakReferenceHandler.obtainMessage() message.what = 2024082901 message.obj = scene @@ -522,8 +349,8 @@ binding.tipsTagView.visibility = View.VISIBLE binding.tipsTagView.text = "${targetSet.size}" - val target = msg.obj as String - if (detectedTargetSet.contains(target)) { + val target = msg.obj as HiddenTroubleResult + if (detectedTargetSet.contains(target.warning)) { "该目标/隐患已识别过".show(this) return true } @@ -534,11 +361,12 @@ } if (mat.width() > 0 || mat.height() > 0) { - detectResultDialog.updateDialogContentView(target, mat, + detectResultDialog.updateDialogContentView(target.warning, mat, object : DetectResultDialog.OnDialogButtonClickListener { override fun onConfirmClick(file: File) { + alarmCode = target.alarmCode imageFileViewModel.uploadImage(file) - detectedTargetSet.add(target) + detectedTargetSet.add(target.warning) } }).show() } 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 ba96200..fd0a010 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 @@ -8,7 +8,9 @@ import android.text.TextPaint import android.util.AttributeSet import android.view.View +import com.casic.br.app.extensions.isContains import com.casic.br.app.external.YoloResult +import com.casic.br.app.model.HiddenTroubleResult import com.casic.br.app.utils.LocaleConstant import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.sp2px @@ -24,6 +26,7 @@ private val rect by lazy { Rect() } private var detectResults: MutableList = ArrayList() private var segmentationResults: MutableList = ArrayList() + private var hiddenTroubles: MutableList = ArrayList() private var textHeight = 0 init { @@ -34,27 +37,219 @@ val fontMetrics = textPaint.fontMetrics textHeight = (fontMetrics.bottom - fontMetrics.top).toInt() - backgroundPaint.color = Color.BLUE backgroundPaint.style = Paint.Style.FILL backgroundPaint.isAntiAlias = true - borderPaint.color = Color.BLUE borderPaint.style = Paint.Style.STROKE borderPaint.strokeWidth = 2f.dp2px(context) //设置线宽 borderPaint.isAntiAlias = true } - fun updateTargetPosition() { - this.segmentationResults.clear() - this.detectResults.clear() - postInvalidate() - } - fun updateTargetPosition( - segmentationResults: MutableList, detectResults: MutableList + segmentationResults: MutableList, + detectResults: MutableList, + callback: OnDetectCallback ) { this.segmentationResults = segmentationResults this.detectResults = detectResults + + //筛选出隐患 + val hiddenTroubles = ArrayList() + for (it in detectResults) { + if (it.type == 44) { + //it此时代表配电箱 + if (!detectResults.isContains(16)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "DistributionBoxHasNoWarningSign" + result.warning = "配电箱无警示标识" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else { + //配电箱内。有开关说明在内部 + if (detectResults.isContains(21)) { + if (!detectResults.isContains(36)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "DistributionBoxHasNoCircuitDiagram" + result.warning = "配电箱内无电路图" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(35)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "配电箱内部电线裸露" + result.warning = "配电箱内部电线裸露" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(41)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "DistributionBoxHasNoJumperWire" + result.warning = "配电箱有跨电线" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } + } + } + } else if (it.type == 13) { + //it此时代表头 + if (!detectResults.isContains(15)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoWorkerSafelyHat" + result.warning = "未佩戴安全帽" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } + } else if (it.type == 3) { + //it此时代表人 + if (!detectResults.isContains(20)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoWorkerClothes" + result.warning = "未着工服" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(17)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoWorkerSafelyLine" + result.warning = "没有佩戴安全带、安全绳" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } + } else if (it.type == 31 || it.type == 32) { + //it此时代表灶台、灶眼 + if (!detectResults.isContains(34)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "" + result.warning = "未发现熄火保护装置" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(22)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "NonResidentUserHasNoStoveFlameoutProtection" + result.warning = "未发现燃气泄漏报警装置" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(4)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "NonResidentUserHasNoShutoffValve" + result.warning = "未发现切断阀" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } + } else if (it.type == 2 || it.type == 49) { + //it此时代表软管 + if (detectResults.isContains(1)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "NonResidentUserHasNoHoseJoint" + result.warning = "软管有接头或三通" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } + } else if (it.type == 9 || it.type == 42 || it.type == 37 || it.type == 14 || it.type == 50 || it.type == 51 || it.type == 33 || it.type == 18 || it.type == 0 || it.type == 25) { + if (!detectResults.isContains(9)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoWorkerMask" + result.warning = "未发现呼吸防护设备" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(42) || !detectResults.isContains(37)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoEnclosure" + result.warning = "未发现路锥、警戒线" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(14)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoWarningSign" + result.warning = "未发现安全告知牌" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(50) || !detectResults.isContains(51)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoAirSupply" + result.warning = "未发现通风设备" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(33)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoLighting" + result.warning = "未发现井下照明设备" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(18)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoIntercom" + result.warning = "未发现井下对讲设备" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(0)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoTripod" + result.warning = "未发现施工三脚架" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } else if (!detectResults.isContains(25)) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "ConfinedSpaceHasNoGasDetector" + result.warning = "未发现气体检测仪" + callback.onDetected(result) + hiddenTroubles.add(result) + break + } + } + } + this.hiddenTroubles = hiddenTroubles + + for (it in segmentationResults) { + if (it.type == 4) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "NonResidentUserHasPipelineRust" + result.warning = "腐蚀、锈蚀" + callback.onDetected(result) + } else if (it.type == 0) { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "NonResidentUserHasHoseFlexure" + result.warning = "软管不可恢复的弯折拉伸" + callback.onDetected(result) + } + } + postInvalidate() } @@ -65,7 +260,11 @@ } segmentationResults.forEach { - drawTarget(canvas, it, LocaleConstant.SEGMENTATION_ARRAY[it.type]) + drawAlarmTips(canvas, it, LocaleConstant.SEGMENTATION_ARRAY[it.type]) + } + + hiddenTroubles.forEach { + drawAlarmTips(canvas, it, it.warning) } } @@ -80,6 +279,11 @@ (it.position[0] + textRectWidth).toInt(), (it.position[1] - textRectHeight).toInt() ) + if (label == "非专用软管" || label == "电线暴露") { + backgroundPaint.color = Color.RED + } else { + backgroundPaint.color = Color.GREEN + } canvas.drawRect(textRect, backgroundPaint) //画文字 @@ -97,6 +301,48 @@ it.position[2].toInt(), it.position[3].toInt() ) + if (label == "非专用软管" || label == "电线暴露") { + borderPaint.color = Color.RED + } else { + borderPaint.color = Color.GREEN + } canvas.drawRect(rect, borderPaint) } + + private fun drawAlarmTips(canvas: Canvas, it: YoloResult, label: String) { + val textLength = textPaint.measureText(label) + val textRectWidth = textLength * 1.1 //文字背景宽度 + val textRectHeight = textHeight * 1.1 //文字背景高度 + + textRect.set( + it.position[0].toInt(), + it.position[1].toInt(), + (it.position[0] + textRectWidth).toInt(), + (it.position[1] - textRectHeight).toInt() + ) + backgroundPaint.color = Color.RED + canvas.drawRect(textRect, backgroundPaint) + + //画文字 + canvas.drawText( + label, + (it.position[0] + textRectWidth / 2).toFloat(), + (it.position[1] - textRectHeight / 4).toFloat(), + textPaint + ) + + //画框 + rect.set( + it.position[0].toInt(), + it.position[1].toInt(), + it.position[2].toInt(), + it.position[3].toInt() + ) + borderPaint.color = Color.RED + canvas.drawRect(rect, borderPaint) + } + + interface OnDetectCallback { + fun onDetected(result: HiddenTroubleResult) + } } \ No newline at end of file