You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Andrey Zhavoronkov e7808cfb03
Data streaming using chunks (#1007)
Huge feature (200+ commits from different developers). It completely changes layout of data (please expect very long DB migration process if you have a lot of tasks). The primary idea is to send data as zip chunks (e.g. 36 images in one chunk) or encoded video chunks and decode them on the client side. It helps to solve the problem with latency  when you try to view a separate frame in the UI quickly (play mode).
Another important feature of the patch is to provide access to the original images. Thus for annotations the client uses compressed chunks but if you want to export a dataset Datumaro will use original chunks (but video will be decoded with original quality and encoded with maximum/optimal quality in any case).
6 years ago
..
images Base code and settings for cvat-canvas (#594) 7 years ago
src Data streaming using chunks (#1007) 6 years ago
.eslintrc.js CVAT-Canvas Updates (#675) 7 years ago
.gitignore cvat-canvas proposals (#588) 7 years ago
README.md React UI: Added logging (#1288) 6 years ago
package-lock.json Data streaming using chunks (#1007) 6 years ago
package.json Data streaming using chunks (#1007) 6 years ago
postcss.config.js Added license headers (#1208) 6 years ago
tsconfig.json Added displayed versions of core, canvas, and ui in about (#1191) 6 years ago
webpack.config.js Data streaming using chunks (#1007) 6 years ago

README.md

Module CVAT-CANVAS

Description

The CVAT module written in TypeScript language. It presents a canvas to viewing, drawing and editing of annotations.

Commands

  • Building of the module from sources in the dist directory:
npm run build
npm run build -- --mode=development     # without a minification
  • Updating of a module version:
npm version patch   # updated after minor fixes
npm version minor   # updated after major changes which don't affect API compatibility with previous versions
npm version major   # updated after major changes which affect API compatibility with previous versions

Using

Canvas itself handles:

  • Shape context menu (PKM)
  • Image moving (mousedrag)
  • Image resizing (mousewheel)
  • Image fit (dblclick)
  • Remove point (PKM)
  • Polyshape editing (Shift + LKM)

API Methods

    enum RectDrawingMethod {
        CLASSIC = 'By 2 points',
        EXTREME_POINTS = 'By 4 points'
    }

    enum Mode {
        IDLE = 'idle',
        DRAG = 'drag',
        RESIZE = 'resize',
        DRAW = 'draw',
        EDIT = 'edit',
        MERGE = 'merge',
        SPLIT = 'split',
        GROUP = 'group',
        DRAG_CANVAS = 'drag_canvas',
        ZOOM_CANVAS = 'zoom_canvas',
    }

    interface DrawData {
        enabled: boolean;
        shapeType?: string;
        rectDrawingMethod?: RectDrawingMethod;
        numberOfPoints?: number;
        initialState?: any;
        crosshair?: boolean;
    }

    interface GroupData {
        enabled: boolean;
        resetGroup?: boolean;
    }

    interface MergeData {
        enabled: boolean;
    }

    interface SplitData {
        enabled: boolean;
    }

    interface DrawnData {
        shapeType: string;
        points: number[];
        objectType?: string;
        occluded?: boolean;
        attributes?: [index: number]: string;
        label?: Label;
        color?: string;
    }

    interface Canvas {
        mode(): Mode;
        html(): HTMLDivElement;
        setZLayer(zLayer: number | null): void;
        setup(frameData: any, objectStates: any[]): void;
        activate(clientID: number, attributeID?: number): void;
        rotate(frameAngle: number): void;
        focus(clientID: number, padding?: number): void;
        fit(): void;
        grid(stepX: number, stepY: number): void;

        draw(drawData: DrawData): void;
        group(groupData: GroupData): void;
        split(splitData: SplitData): void;
        merge(mergeData: MergeData): void;
        select(objectState: any): void;

        fitCanvas(): void;
        dragCanvas(enable: boolean): void;
        zoomCanvas(enable: boolean): void;

        cancel(): void;
    }

API CSS

  • All drawn objects (shapes, tracks) have an id cvat_canvas_shape_{objectState.clientID}
  • Drawn shapes and tracks have classes cvat_canvas_shape, cvat_canvas_shape_activated, cvat_canvas_shape_grouping, cvat_canvas_shape_merging, cvat_canvas_shape_drawing, cvat_canvas_shape_occluded
  • Drawn texts have the class cvat_canvas_text
  • Tags have the class cvat_canvas_tag
  • Canvas image has ID cvat_canvas_image
  • Grid on the canvas has ID cvat_canvas_grid and cvat_canvas_grid_pattern
  • Crosshair during a draw has class cvat_canvas_crosshair

Events

Standard JS events are used.

    - canvas.setup
    - canvas.activated => {state: ObjectState}
    - canvas.clicked => {state: ObjectState}
    - canvas.moved => {states: ObjectState[], x: number, y: number}
    - canvas.find => {states: ObjectState[], x: number, y: number}
    - canvas.drawn => {state: DrawnData}
    - canvas.editstart
    - canvas.edited => {state: ObjectState, points: number[]}
    - canvas.splitted => {state: ObjectState}
    - canvas.groupped => {states: ObjectState[]}
    - canvas.merged => {states: ObjectState[]}
    - canvas.canceled
    - canvas.dragstart
    - canvas.dragstop
    - canvas.zoomstart
    - canvas.zoomstop
    - canvas.zoom
    - canvas.fit
    - canvas.dragshape => {id: number}
    - canvas.resizeshape => {id: number}

WEB

    // Create an instance of a canvas
    const canvas = new window.canvas.Canvas();

    console.log('Version ', window.canvas.CanvasVersion);
    console.log('Current mode is ', window.canvas.mode());

    // Put canvas to a html container
    htmlContainer.appendChild(canvas.html());
    canvas.fitCanvas();

    // Next you can use its API methods. For example:
    canvas.rotate(270);
    canvas.draw({
        enabled: true,
        shapeType: 'rectangle',
        crosshair: true,
        rectDrawingMethod: window.Canvas.RectDrawingMethod.CLASSIC,
    });

API Reaction

IDLE GROUPING SPLITTING DRAWING MERGING EDITING DRAG ZOOM
html() + + + + + + + +
setup() + + + + + - + +
activate() + - - - - - - -
rotate() + + + + + + + +
focus() + + + + + + + +
fit() + + + + + + + +
grid() + + + + + + + +
draw() + - - - - - - -
split() + - + - - - - -
group() + + - - - - - -
merge() + - - - + - - -
fitCanvas() + + + + + + + +
dragCanvas() + - - - - - + -
zoomCanvas() + - - - - - - +
cancel() - + + + + + + +
setZLayer() + + + + + + + +