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.

95 lines
2.8 KiB
TypeScript

// Copyright (C) 2020-2021 Intel Corporation
//
// SPDX-License-Identifier: MIT
import getCore from 'cvat-core-wrapper';
import waitFor from '../wait-for';
import IntelligentScissorsImplementation, { IntelligentScissors } from './intelligent-scissors';
const core = getCore();
const baseURL = core.config.backendAPI.slice(0, -7);
export interface Segmentation {
intelligentScissorsFactory: () => IntelligentScissors;
}
export class OpenCVWrapper {
private initialized: boolean;
private cv: any;
public constructor() {
this.initialized = false;
this.cv = null;
}
public async initialize(onProgress: (percent: number) => void): Promise<void> {
const response = await fetch(`${baseURL}/opencv/opencv.js`);
if (response.status !== 200) {
throw new Error(`Response status ${response.status}. ${response.statusText}`);
}
const contentLength = response.headers.get('Content-Length');
const { body } = response;
if (contentLength === null) {
throw new Error('Content length is null, but necessary');
}
if (body === null) {
throw new Error('Response body is null, but necessary');
}
const decoder = new TextDecoder('utf-8');
const reader = (body as ReadableStream<Uint8Array>).getReader();
let received = false;
let receivedLength = 0;
let decodedScript = '';
while (!received) {
// await in the loop is necessary here
// eslint-disable-next-line
const { done, value } = await reader.read();
received = done;
if (value instanceof Uint8Array) {
decodedScript += decoder.decode(value);
receivedLength += value.length;
const percentage = (receivedLength * 100) / +(contentLength as string);
onProgress(+percentage.toFixed(0));
}
}
// Inject opencv to DOM
// eslint-disable-next-line @typescript-eslint/no-implied-eval
const OpenCVConstructor = new Function(decodedScript);
OpenCVConstructor();
const global = window as any;
await waitFor(
100,
() =>
typeof global.cv !== 'undefined' && typeof global.cv.segmentation_IntelligentScissorsMB !== 'undefined',
);
this.cv = global.cv;
this.initialized = true;
}
public get isInitialized(): boolean {
return this.initialized;
}
public get segmentation(): Segmentation {
if (!this.initialized) {
throw new Error('Need to initialize OpenCV first');
}
return {
intelligentScissorsFactory: () => new IntelligentScissorsImplementation(this.cv),
};
}
}
export default new OpenCVWrapper();