diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 1d12556..abef1cd 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -827,17 +827,6 @@ return 0; } -static bool isLabelEqual(const Object &obj, int targetLabel) { - return obj.label == targetLabel; -} - -bool containsLabel(const std::vector &objects, int targetLabel) { - auto it = std::find_if(objects.begin(), objects.end(), [&](const Object &obj) { - return isLabelEqual(obj, targetLabel); - }); - return it != objects.end(); -} - static const char *class_names[] = { "三脚架", "三通", "专用软管", "人", "切断阀", "危险告知牌", "压力测试仪", "压力表", "反光衣", "呼吸面罩", "喉箍", "四合一", "圆头水枪", "头", @@ -849,140 +838,34 @@ "非专用软管", "风管", "鼓风机" }; -static void draw_target(cv::Mat &rgb, const Object &obj) { - cv::Scalar rect_cc(0, 255, 0); - cv::rectangle(rgb, obj.rect, rect_cc, 2); - - char text[256]; - sprintf(text, "%s", class_names[obj.label]); - - int baseLine = 0; - cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); - int x = obj.rect.x; - int y = obj.rect.y - label_size.height - baseLine; - if (y < 0) - y = 0; - if (x + label_size.width > rgb.cols) - x = rgb.cols - label_size.width; - - MyFontFace chinese_font; - cv::Point org = cv::Point(x, y + label_size.height); - cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); - cv::rectangle(rgb, rc, rect_cc, -1); - cv::Scalar text_scalar = cv::Scalar(255, 255, 255); - cv::putText(rgb, text, org, text_scalar, chinese_font, 8); -} - -static void draw_warning_text(cv::Mat &rgb, const Object &obj, const char text[]) { - cv::Scalar rect_cc(255, 0, 0); - cv::rectangle(rgb, obj.rect, rect_cc, 2); - - int baseLine = 0; - cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); - int x = obj.rect.x; - int y = obj.rect.y - label_size.height - baseLine; - if (y < 0) - y = 0; - if (x + label_size.width > rgb.cols) - x = rgb.cols - label_size.width; - - MyFontFace chinese_font; - cv::Point org = cv::Point(x, y + label_size.height); - cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); - cv::rectangle(rgb, rc, rect_cc, -1); - cv::Scalar text_scalar = cv::Scalar(255, 255, 255); - cv::putText(rgb, text, org, text_scalar, chinese_font, 8); -} - int Yolo::draw(cv::Mat &rgb, const std::vector &objects) { for (const auto &obj: objects) { - //需要根据类别绘制不同颜色的边框以及不同的文字提示 - cv::Scalar rect_cc(255, 0, 0); - char text[256]; - if (obj.label == 44) { - //it此时代表配电箱 - if (!containsLabel(objects, 16)) { - sprintf(text, "%s", "配电箱无警示标识"); - draw_warning_text(rgb, obj, text); - } else { - //配电箱内。有开关说明在内部 - if (containsLabel(objects, 21)) { - if (!containsLabel(objects, 36)) { - sprintf(text, "%s", "配电箱内无电路图"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 35)) { - sprintf(text, "%s", "配电箱内部电线裸露"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 41)) { - sprintf(text, "%s", "配电箱有跨电线"); - draw_warning_text(rgb, obj, text); - } - } - } - } else if (obj.label == 13) { - //it此时代表头 - if (!containsLabel(objects, 15)) { - sprintf(text, "%s", "未佩戴安全帽"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 3) { - //it此时代表人 - if (!containsLabel(objects, 20)) { - sprintf(text, "%s", "未着工服"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 17)) { - sprintf(text, "%s", "没有佩戴安全带、安全绳"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 31 || obj.label == 32) { - //it此时代表灶台、灶眼 - if (!containsLabel(objects, 34)) { - sprintf(text, "%s", "未发现熄火保护装置"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 22)) { - sprintf(text, "%s", "未发现燃气泄漏报警装置"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 4)) { - sprintf(text, "%s", "未发现切断阀"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 2 || obj.label == 49) { - //it此时代表软管 - if (containsLabel(objects, 1)) { - sprintf(text, "%s", "软管有接头或三通"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 9 || obj.label == 42 || obj.label == 37 || obj.label == 14 || - obj.label == 50 || obj.label == 51 || obj.label == 33 || obj.label == 18 || - obj.label == 0 || obj.label == 25) { - if (!containsLabel(objects, 9)) { - sprintf(text, "%s", "未发现呼吸防护设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 42) || !containsLabel(objects, 37)) { - sprintf(text, "%s", "未发现路锥、警戒线"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 14)) { - sprintf(text, "%s", "未发现安全告知牌"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 50) || !containsLabel(objects, 51)) { - sprintf(text, "%s", "未发现通风设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 33)) { - sprintf(text, "%s", "未发现井下照明设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 18)) { - sprintf(text, "%s", "未发现井下对讲设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 0)) { - sprintf(text, "%s", "未发现施工三脚架"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 25)) { - sprintf(text, "%s", "未发现气体检测仪"); - draw_warning_text(rgb, obj, text); - } + cv::Scalar rect_cc; + if (obj.label == 35 || obj.label == 41 || obj.label == 47 || obj.label == 49) { + rect_cc = cv::Scalar(255, 0, 0); } else { - draw_target(rgb, obj); + rect_cc = cv::Scalar(0, 255, 0); } + cv::rectangle(rgb, obj.rect, rect_cc, 2); + + char text[256]; + sprintf(text, "%s", class_names[obj.label]); + + int baseLine = 0; + cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); + int x = obj.rect.x; + int y = obj.rect.y - label_size.height - baseLine; + if (y < 0) + y = 0; + if (x + label_size.width > rgb.cols) + x = rgb.cols - label_size.width; + + MyFontFace chinese_font; + cv::Point org = cv::Point(x, y + label_size.height); + cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); + cv::rectangle(rgb, rc, rect_cc, -1); + cv::Scalar text_scalar = cv::Scalar(255, 255, 255); + cv::putText(rgb, text, org, text_scalar, chinese_font, 8); } return 0; } \ No newline at end of file diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 1d12556..abef1cd 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -827,17 +827,6 @@ return 0; } -static bool isLabelEqual(const Object &obj, int targetLabel) { - return obj.label == targetLabel; -} - -bool containsLabel(const std::vector &objects, int targetLabel) { - auto it = std::find_if(objects.begin(), objects.end(), [&](const Object &obj) { - return isLabelEqual(obj, targetLabel); - }); - return it != objects.end(); -} - static const char *class_names[] = { "三脚架", "三通", "专用软管", "人", "切断阀", "危险告知牌", "压力测试仪", "压力表", "反光衣", "呼吸面罩", "喉箍", "四合一", "圆头水枪", "头", @@ -849,140 +838,34 @@ "非专用软管", "风管", "鼓风机" }; -static void draw_target(cv::Mat &rgb, const Object &obj) { - cv::Scalar rect_cc(0, 255, 0); - cv::rectangle(rgb, obj.rect, rect_cc, 2); - - char text[256]; - sprintf(text, "%s", class_names[obj.label]); - - int baseLine = 0; - cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); - int x = obj.rect.x; - int y = obj.rect.y - label_size.height - baseLine; - if (y < 0) - y = 0; - if (x + label_size.width > rgb.cols) - x = rgb.cols - label_size.width; - - MyFontFace chinese_font; - cv::Point org = cv::Point(x, y + label_size.height); - cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); - cv::rectangle(rgb, rc, rect_cc, -1); - cv::Scalar text_scalar = cv::Scalar(255, 255, 255); - cv::putText(rgb, text, org, text_scalar, chinese_font, 8); -} - -static void draw_warning_text(cv::Mat &rgb, const Object &obj, const char text[]) { - cv::Scalar rect_cc(255, 0, 0); - cv::rectangle(rgb, obj.rect, rect_cc, 2); - - int baseLine = 0; - cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); - int x = obj.rect.x; - int y = obj.rect.y - label_size.height - baseLine; - if (y < 0) - y = 0; - if (x + label_size.width > rgb.cols) - x = rgb.cols - label_size.width; - - MyFontFace chinese_font; - cv::Point org = cv::Point(x, y + label_size.height); - cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); - cv::rectangle(rgb, rc, rect_cc, -1); - cv::Scalar text_scalar = cv::Scalar(255, 255, 255); - cv::putText(rgb, text, org, text_scalar, chinese_font, 8); -} - int Yolo::draw(cv::Mat &rgb, const std::vector &objects) { for (const auto &obj: objects) { - //需要根据类别绘制不同颜色的边框以及不同的文字提示 - cv::Scalar rect_cc(255, 0, 0); - char text[256]; - if (obj.label == 44) { - //it此时代表配电箱 - if (!containsLabel(objects, 16)) { - sprintf(text, "%s", "配电箱无警示标识"); - draw_warning_text(rgb, obj, text); - } else { - //配电箱内。有开关说明在内部 - if (containsLabel(objects, 21)) { - if (!containsLabel(objects, 36)) { - sprintf(text, "%s", "配电箱内无电路图"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 35)) { - sprintf(text, "%s", "配电箱内部电线裸露"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 41)) { - sprintf(text, "%s", "配电箱有跨电线"); - draw_warning_text(rgb, obj, text); - } - } - } - } else if (obj.label == 13) { - //it此时代表头 - if (!containsLabel(objects, 15)) { - sprintf(text, "%s", "未佩戴安全帽"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 3) { - //it此时代表人 - if (!containsLabel(objects, 20)) { - sprintf(text, "%s", "未着工服"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 17)) { - sprintf(text, "%s", "没有佩戴安全带、安全绳"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 31 || obj.label == 32) { - //it此时代表灶台、灶眼 - if (!containsLabel(objects, 34)) { - sprintf(text, "%s", "未发现熄火保护装置"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 22)) { - sprintf(text, "%s", "未发现燃气泄漏报警装置"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 4)) { - sprintf(text, "%s", "未发现切断阀"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 2 || obj.label == 49) { - //it此时代表软管 - if (containsLabel(objects, 1)) { - sprintf(text, "%s", "软管有接头或三通"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 9 || obj.label == 42 || obj.label == 37 || obj.label == 14 || - obj.label == 50 || obj.label == 51 || obj.label == 33 || obj.label == 18 || - obj.label == 0 || obj.label == 25) { - if (!containsLabel(objects, 9)) { - sprintf(text, "%s", "未发现呼吸防护设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 42) || !containsLabel(objects, 37)) { - sprintf(text, "%s", "未发现路锥、警戒线"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 14)) { - sprintf(text, "%s", "未发现安全告知牌"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 50) || !containsLabel(objects, 51)) { - sprintf(text, "%s", "未发现通风设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 33)) { - sprintf(text, "%s", "未发现井下照明设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 18)) { - sprintf(text, "%s", "未发现井下对讲设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 0)) { - sprintf(text, "%s", "未发现施工三脚架"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 25)) { - sprintf(text, "%s", "未发现气体检测仪"); - draw_warning_text(rgb, obj, text); - } + cv::Scalar rect_cc; + if (obj.label == 35 || obj.label == 41 || obj.label == 47 || obj.label == 49) { + rect_cc = cv::Scalar(255, 0, 0); } else { - draw_target(rgb, obj); + rect_cc = cv::Scalar(0, 255, 0); } + cv::rectangle(rgb, obj.rect, rect_cc, 2); + + char text[256]; + sprintf(text, "%s", class_names[obj.label]); + + int baseLine = 0; + cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); + int x = obj.rect.x; + int y = obj.rect.y - label_size.height - baseLine; + if (y < 0) + y = 0; + if (x + label_size.width > rgb.cols) + x = rgb.cols - label_size.width; + + MyFontFace chinese_font; + cv::Point org = cv::Point(x, y + label_size.height); + cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); + cv::rectangle(rgb, rc, rect_cc, -1); + cv::Scalar text_scalar = cv::Scalar(255, 255, 255); + cv::putText(rgb, text, org, text_scalar, chinese_font, 8); } return 0; } \ No newline at end of file diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 6845359..9edfe04 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -83,7 +83,7 @@ g_yolo->detect(rgb, objects); //绘制 -// g_yolo->draw(rgb, objects); + g_yolo->draw(rgb, objects); } else { draw_unsupported(rgb); } diff --git a/app/src/main/cpp/yolo.cpp b/app/src/main/cpp/yolo.cpp index 1d12556..abef1cd 100644 --- a/app/src/main/cpp/yolo.cpp +++ b/app/src/main/cpp/yolo.cpp @@ -827,17 +827,6 @@ return 0; } -static bool isLabelEqual(const Object &obj, int targetLabel) { - return obj.label == targetLabel; -} - -bool containsLabel(const std::vector &objects, int targetLabel) { - auto it = std::find_if(objects.begin(), objects.end(), [&](const Object &obj) { - return isLabelEqual(obj, targetLabel); - }); - return it != objects.end(); -} - static const char *class_names[] = { "三脚架", "三通", "专用软管", "人", "切断阀", "危险告知牌", "压力测试仪", "压力表", "反光衣", "呼吸面罩", "喉箍", "四合一", "圆头水枪", "头", @@ -849,140 +838,34 @@ "非专用软管", "风管", "鼓风机" }; -static void draw_target(cv::Mat &rgb, const Object &obj) { - cv::Scalar rect_cc(0, 255, 0); - cv::rectangle(rgb, obj.rect, rect_cc, 2); - - char text[256]; - sprintf(text, "%s", class_names[obj.label]); - - int baseLine = 0; - cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); - int x = obj.rect.x; - int y = obj.rect.y - label_size.height - baseLine; - if (y < 0) - y = 0; - if (x + label_size.width > rgb.cols) - x = rgb.cols - label_size.width; - - MyFontFace chinese_font; - cv::Point org = cv::Point(x, y + label_size.height); - cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); - cv::rectangle(rgb, rc, rect_cc, -1); - cv::Scalar text_scalar = cv::Scalar(255, 255, 255); - cv::putText(rgb, text, org, text_scalar, chinese_font, 8); -} - -static void draw_warning_text(cv::Mat &rgb, const Object &obj, const char text[]) { - cv::Scalar rect_cc(255, 0, 0); - cv::rectangle(rgb, obj.rect, rect_cc, 2); - - int baseLine = 0; - cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); - int x = obj.rect.x; - int y = obj.rect.y - label_size.height - baseLine; - if (y < 0) - y = 0; - if (x + label_size.width > rgb.cols) - x = rgb.cols - label_size.width; - - MyFontFace chinese_font; - cv::Point org = cv::Point(x, y + label_size.height); - cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); - cv::rectangle(rgb, rc, rect_cc, -1); - cv::Scalar text_scalar = cv::Scalar(255, 255, 255); - cv::putText(rgb, text, org, text_scalar, chinese_font, 8); -} - int Yolo::draw(cv::Mat &rgb, const std::vector &objects) { for (const auto &obj: objects) { - //需要根据类别绘制不同颜色的边框以及不同的文字提示 - cv::Scalar rect_cc(255, 0, 0); - char text[256]; - if (obj.label == 44) { - //it此时代表配电箱 - if (!containsLabel(objects, 16)) { - sprintf(text, "%s", "配电箱无警示标识"); - draw_warning_text(rgb, obj, text); - } else { - //配电箱内。有开关说明在内部 - if (containsLabel(objects, 21)) { - if (!containsLabel(objects, 36)) { - sprintf(text, "%s", "配电箱内无电路图"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 35)) { - sprintf(text, "%s", "配电箱内部电线裸露"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 41)) { - sprintf(text, "%s", "配电箱有跨电线"); - draw_warning_text(rgb, obj, text); - } - } - } - } else if (obj.label == 13) { - //it此时代表头 - if (!containsLabel(objects, 15)) { - sprintf(text, "%s", "未佩戴安全帽"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 3) { - //it此时代表人 - if (!containsLabel(objects, 20)) { - sprintf(text, "%s", "未着工服"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 17)) { - sprintf(text, "%s", "没有佩戴安全带、安全绳"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 31 || obj.label == 32) { - //it此时代表灶台、灶眼 - if (!containsLabel(objects, 34)) { - sprintf(text, "%s", "未发现熄火保护装置"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 22)) { - sprintf(text, "%s", "未发现燃气泄漏报警装置"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 4)) { - sprintf(text, "%s", "未发现切断阀"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 2 || obj.label == 49) { - //it此时代表软管 - if (containsLabel(objects, 1)) { - sprintf(text, "%s", "软管有接头或三通"); - draw_warning_text(rgb, obj, text); - } - } else if (obj.label == 9 || obj.label == 42 || obj.label == 37 || obj.label == 14 || - obj.label == 50 || obj.label == 51 || obj.label == 33 || obj.label == 18 || - obj.label == 0 || obj.label == 25) { - if (!containsLabel(objects, 9)) { - sprintf(text, "%s", "未发现呼吸防护设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 42) || !containsLabel(objects, 37)) { - sprintf(text, "%s", "未发现路锥、警戒线"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 14)) { - sprintf(text, "%s", "未发现安全告知牌"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 50) || !containsLabel(objects, 51)) { - sprintf(text, "%s", "未发现通风设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 33)) { - sprintf(text, "%s", "未发现井下照明设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 18)) { - sprintf(text, "%s", "未发现井下对讲设备"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 0)) { - sprintf(text, "%s", "未发现施工三脚架"); - draw_warning_text(rgb, obj, text); - } else if (!containsLabel(objects, 25)) { - sprintf(text, "%s", "未发现气体检测仪"); - draw_warning_text(rgb, obj, text); - } + cv::Scalar rect_cc; + if (obj.label == 35 || obj.label == 41 || obj.label == 47 || obj.label == 49) { + rect_cc = cv::Scalar(255, 0, 0); } else { - draw_target(rgb, obj); + rect_cc = cv::Scalar(0, 255, 0); } + cv::rectangle(rgb, obj.rect, rect_cc, 2); + + char text[256]; + sprintf(text, "%s", class_names[obj.label]); + + int baseLine = 0; + cv::Size label_size = cv::getTextSize(text, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); + int x = obj.rect.x; + int y = obj.rect.y - label_size.height - baseLine; + if (y < 0) + y = 0; + if (x + label_size.width > rgb.cols) + x = rgb.cols - label_size.width; + + MyFontFace chinese_font; + cv::Point org = cv::Point(x, y + label_size.height); + cv::Rect rc = cv::getTextSize(rgb.size(), text, org, chinese_font, 8); + cv::rectangle(rgb, rc, rect_cc, -1); + cv::Scalar text_scalar = cv::Scalar(255, 255, 255); + cv::putText(rgb, text, org, text_scalar, chinese_font, 8); } return 0; } \ No newline at end of file diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 6845359..9edfe04 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -83,7 +83,7 @@ g_yolo->detect(rgb, objects); //绘制 -// g_yolo->draw(rgb, objects); + g_yolo->draw(rgb, objects); } else { draw_unsupported(rgb); } 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 2bfe14b..4dc03a2 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 @@ -24,8 +24,6 @@ private val borderPaint by lazy { Paint() } private val textRect by lazy { Rect() } 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 @@ -46,13 +44,9 @@ } 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) { @@ -77,7 +71,7 @@ callback.onDetected(result) hiddenTroubles.add(result) break - } else if (!detectResults.isContains(35)) { + } else if (detectResults.isContains(35)) { val result = HiddenTroubleResult() result.position = it.position result.alarmCode = "" @@ -85,7 +79,7 @@ callback.onDetected(result) hiddenTroubles.add(result) break - } else if (!detectResults.isContains(41)) { + } else if (detectResults.isContains(41)) { val result = HiddenTroubleResult() result.position = it.position result.alarmCode = "DistributionBoxHasNoJumperWire" @@ -232,83 +226,49 @@ } } } - 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) + when (it.type) { + 4 -> { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "NonResidentUserHasPipelineRust" + result.warning = "腐蚀、锈蚀" + callback.onDetected(result) + hiddenTroubles.add(result) + } + + 0 -> { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "NonResidentUserHasHoseFlexure" + result.warning = "软管不可恢复的弯折拉伸" + callback.onDetected(result) + hiddenTroubles.add(result) + } + + else -> { + val result = HiddenTroubleResult() + result.position = it.position + result.alarmCode = "" + result.warning = LocaleConstant.SEGMENTATION_ARRAY[it.type] + hiddenTroubles.add(result) + } } } + this.hiddenTroubles = hiddenTroubles + postInvalidate() } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - detectResults.forEach { - drawTarget(canvas, it, LocaleConstant.CLASS_NAMES_ARRAY[it.type]) - } - - segmentationResults.forEach { - drawAlarmTips(canvas, it, LocaleConstant.SEGMENTATION_ARRAY[it.type]) - } - hiddenTroubles.forEach { drawAlarmTips(canvas, it, it.warning) } } - private fun drawTarget(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() - ) - if (label == "非专用软管" || label == "电线暴露") { - backgroundPaint.color = Color.RED - } else { - backgroundPaint.color = Color.GREEN - } - 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() - ) - 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 //文字背景宽度