diff --git a/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java b/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java index 80cb8461622f174d2555337789805d3326bc68ea..02df9b677bbdc5c72fc1cd09b59cfff5cd4b50af 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java +++ b/src/main/java/com/hy/java/uct/umlrecog/cddetector/ClassRelationDetector.java @@ -442,32 +442,37 @@ public class ClassRelationDetector { solid_rela.source_pt_index = 1; } if (belong_to_this_solid_rela) { - String type = "继承"; + String type = "聚合"; // 裁剪原图中矩形区域 - Mat origin_rela_type_area = ImgProcessor.cutImage(origin_cls_diagram, rect); - Imgproc.erode(origin_rela_type_area, origin_rela_type_area, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2, 2)), new Point(-1, -1), 2); - Imgproc.dilate(origin_rela_type_area, origin_rela_type_area, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1)), new Point(-1, -1), 2); + Mat cutted_origin_rela_type_area = ImgProcessor.cutImage(origin_cls_diagram, rect); + Imgproc.erode(cutted_origin_rela_type_area, cutted_origin_rela_type_area, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2, 2)), new Point(-1, -1), 2); + Imgproc.dilate(cutted_origin_rela_type_area, cutted_origin_rela_type_area, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(1, 1)), new Point(-1, -1), 2); // 重新识别符号 List origin_contours = new ArrayList<>(); - Imgproc.findContours(origin_rela_type_area, origin_contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); + Imgproc.findContours(cutted_origin_rela_type_area, origin_contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); // 针对识别出来的区域做筛选 for (MatOfPoint origin_contour : origin_contours) { - /* - * 识别一下吧,估计不咋滴。下面的代码可以都删掉 - */ MatOfPoint2f origin_curve = new MatOfPoint2f(origin_contour.toArray()); MatOfPoint2f origin_approx_curve = new MatOfPoint2f(); - Imgproc.approxPolyDP(origin_curve, origin_approx_curve, 0.01 * Imgproc.arcLength(origin_curve, false), true); + Imgproc.approxPolyDP(origin_curve, origin_approx_curve, 0.05 * Imgproc.arcLength(origin_curve, false), true); + Imgproc.approxPolyDP(origin_approx_curve, origin_approx_curve, 0.01 * Imgproc.arcLength(origin_approx_curve, true), true); + if (origin_approx_curve.toArray().length == 3) { + // 获取包络矩形 + Rect if_extend_rect = Imgproc.boundingRect(new MatOfPoint(origin_approx_curve.toArray())); + Imgproc.rectangle(cutted_origin_rela_type_area, if_extend_rect, new Scalar(5, 5, 5), 1); + Imgcodecs.imwrite(temp_res_path, cutted_origin_rela_type_area); + + type = "继承"; + } - List temp_list = new ArrayList<>(); - MatOfPoint matOfPoint = new MatOfPoint(); - origin_approx_curve.convertTo(matOfPoint, CvType.CV_32S); - temp_list.add(matOfPoint); - Imgproc.polylines(origin_rela_type_area, temp_list, true, new Scalar(5, 5, 5), 5); - Imgcodecs.imwrite(temp_res_path, origin_rela_type_area); - - System.out.println(origin_approx_curve.dump()); - System.out.println(origin_approx_curve.toArray().length); + /* + * 识别一下吧,估计不咋滴。下面的代码可以都删掉 + */ + /* + * List temp_list = new ArrayList<>(); MatOfPoint matOfPoint = new MatOfPoint(); origin_approx_curve.convertTo(matOfPoint, CvType.CV_32S); + * temp_list.add(matOfPoint); Imgproc.polylines(cutted_origin_rela_type_area, temp_list, true, new Scalar(5, 5, 5), 5); + * Imgcodecs.imwrite(temp_res_path, cutted_origin_rela_type_area); System.out.println("把" + type + "画完了"); System.out.println("把上面的字打印完了"); + */ /* * 识别完毕,差不多得了。上面的代码可以都删掉 */ diff --git a/src/main/java/com/hy/java/uct/umlrecog/util/Relation.java b/src/main/java/com/hy/java/uct/umlrecog/util/Relation.java index 9d2edd8900a0a12500e550c39aa9727d068357ed..c4a983fe1a4e30711d2992a685d5ff36506776e9 100644 --- a/src/main/java/com/hy/java/uct/umlrecog/util/Relation.java +++ b/src/main/java/com/hy/java/uct/umlrecog/util/Relation.java @@ -8,7 +8,7 @@ public class Relation { * 标识poly_line中的哪个端点对应source类。若为-1,则说明还未确定哪个端点对应source类 */ public int source_pt_index = -1; - // 依赖→实现。组合→聚合,聚合→继承 + // 依赖→实现。组合→聚合 public String type = null; public Relation(PolygonalLine poly_line) {