From 2d8188ae790d45c67d943b53203fe65df897e338 Mon Sep 17 00:00:00 2001 From: Boris Sekachev Date: Wed, 5 Feb 2025 15:22:27 +0200 Subject: [PATCH] Updated minimal object size limitation (#9055) --- ..._122237_sekachev.bs_small_objects_limit.md | 4 ++ cvat-core/src/object-utils.ts | 57 ++++++++++--------- 2 files changed, 34 insertions(+), 27 deletions(-) create mode 100644 changelog.d/20250205_122237_sekachev.bs_small_objects_limit.md diff --git a/changelog.d/20250205_122237_sekachev.bs_small_objects_limit.md b/changelog.d/20250205_122237_sekachev.bs_small_objects_limit.md new file mode 100644 index 000000000000..1b0b9ec8d84b --- /dev/null +++ b/changelog.d/20250205_122237_sekachev.bs_small_objects_limit.md @@ -0,0 +1,4 @@ +### Changed + +- Updated limitation for minimal object size from 9px area to 1px in dimensions + () diff --git a/cvat-core/src/object-utils.ts b/cvat-core/src/object-utils.ts index 12712032dca5..000d169de847 100644 --- a/cvat-core/src/object-utils.ts +++ b/cvat-core/src/object-utils.ts @@ -67,45 +67,48 @@ export function findAngleDiff(rightAngle: number, leftAngle: number): number { } export function checkShapeArea(shapeType: ShapeType, points: number[]): boolean { - const MIN_SHAPE_LENGTH = 3; - const MIN_SHAPE_AREA = 9; - const MIN_MASK_SHAPE_AREA = 1; + const MIN_SHAPE_SIZE = 1; if (shapeType === ShapeType.POINTS) { return true; } + let width = 0; + let height = 0; + if (shapeType === ShapeType.MASK) { const [left, top, right, bottom] = points.slice(-4); - const area = (right - left + 1) * (bottom - top + 1); - return area >= MIN_MASK_SHAPE_AREA; - } - - if (shapeType === ShapeType.ELLIPSE) { + [width, height] = [right - left + 1, bottom - top + 1]; + } else if (shapeType === ShapeType.RECTANGLE) { + const [xtl, ytl, xbr, ybr] = points; + [width, height] = [xbr - xtl, ybr - ytl]; + } else if (shapeType === ShapeType.ELLIPSE) { const [cx, cy, rightX, topY] = points; - const [rx, ry] = [rightX - cx, cy - topY]; - return rx * ry * Math.PI > MIN_SHAPE_AREA; - } - - let xmin = Number.MAX_SAFE_INTEGER; - let xmax = Number.MIN_SAFE_INTEGER; - let ymin = Number.MAX_SAFE_INTEGER; - let ymax = Number.MIN_SAFE_INTEGER; + [width, height] = [(rightX - cx) * 2, (cy - topY) * 2]; + } else { + // polygon, polyline, cuboid, skeleton + let xmin = Number.MAX_SAFE_INTEGER; + let xmax = Number.MIN_SAFE_INTEGER; + let ymin = Number.MAX_SAFE_INTEGER; + let ymax = Number.MIN_SAFE_INTEGER; + + for (let i = 0; i < points.length - 1; i += 2) { + xmin = Math.min(xmin, points[i]); + xmax = Math.max(xmax, points[i]); + ymin = Math.min(ymin, points[i + 1]); + ymax = Math.max(ymax, points[i + 1]); + } - for (let i = 0; i < points.length - 1; i += 2) { - xmin = Math.min(xmin, points[i]); - xmax = Math.max(xmax, points[i]); - ymin = Math.min(ymin, points[i + 1]); - ymax = Math.max(ymax, points[i + 1]); - } + if (shapeType === ShapeType.POLYLINE) { + // horizontal / vertical lines have one of dimensions equal to zero + const length = Math.max(xmax - xmin, ymax - ymin); + return length >= MIN_SHAPE_SIZE; + } - if (shapeType === ShapeType.POLYLINE) { - const length = Math.max(xmax - xmin, ymax - ymin); - return length >= MIN_SHAPE_LENGTH; + [width, height] = [xmax - xmin, ymax - ymin]; } - const area = (xmax - xmin) * (ymax - ymin); - return area >= MIN_SHAPE_AREA; + return width >= MIN_SHAPE_SIZE && height >= MIN_SHAPE_SIZE; } export function rotatePoint(x: number, y: number, angle: number, cx = 0, cy = 0): number[] {