UNPKG

@lightsailed/ngx-open-cv

Version:
1 lines 18.9 kB
{"version":3,"file":"lightsailed-ngx-open-cv.mjs","sources":["../../../projects/ngx-open-cv/src/lib/ng-open-cv.service.ts","../../../projects/ngx-open-cv/src/lib/ng-open-cv.module.ts","../../../projects/ngx-open-cv/src/public_api.ts","../../../projects/ngx-open-cv/src/lightsailed-ngx-open-cv.ts"],"sourcesContent":["import { Inject, Injectable, InjectionToken } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nimport { OpenCVLoadResult, OpenCVOptions } from './ng-open-cv.models';\n\n/*\nAngular modifification of the OpenCV utils script found at https://docs.opencv.org/master/utils.js\n*/\ndeclare var cv: any;\n\nexport const OPEN_CV_CONFIGURATION = new InjectionToken<OpenCVOptions>('Angular OpenCV Configuration Object');\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NgOpenCVService {\n errorOutput: HTMLElement;\n src = null;\n dstC1 = null;\n dstC3 = null;\n dstC4 = null;\n\n stream: any;\n video: any;\n private isReady = new BehaviorSubject<OpenCVLoadResult>({\n ready: false,\n error: false,\n loading: true\n });\n isReady$: Observable<OpenCVLoadResult> = this.isReady.asObservable();\n onCameraStartedCallback: (a, b) => void;\n OPENCV_URL = 'opencv.js';\n DEFAULT_OPTIONS = {\n scriptUrl: 'assets/opencv/asm/3.4/opencv.js',\n wasmBinaryFile: 'wasm/3.4/opencv_js.wasm',\n usingWasm: false,\n locateFile: this.locateFile.bind(this),\n onRuntimeInitialized: () => {}\n };\n\n constructor(@Inject(OPEN_CV_CONFIGURATION) options: OpenCVOptions) {\n this.setScriptUrl(options.scriptUrl);\n const opts = { ...this.DEFAULT_OPTIONS, options };\n this.loadOpenCv(opts);\n }\n\n private locateFile(path, scriptDirectory): string {\n if (path === 'opencv_js.wasm') {\n return scriptDirectory + '/wasm/' + path;\n } else {\n return scriptDirectory + path;\n }\n }\n\n setScriptUrl(url: string) {\n this.OPENCV_URL = url;\n }\n\n loadOpenCv(options: OpenCVOptions) {\n this.isReady.next({\n ready: false,\n error: false,\n loading: true\n });\n window['Module'] = { ...options };\n const script = document.createElement('script');\n script.setAttribute('async', '');\n script.setAttribute('type', 'text/javascript');\n script.addEventListener('load', () => {\n const onRuntimeInitializedCallback = () => {\n if (options.onRuntimeInitialized) {\n options.onRuntimeInitialized();\n }\n this.isReady.next({\n ready: true,\n error: false,\n loading: false\n });\n };\n cv.onRuntimeInitialized = onRuntimeInitializedCallback;\n });\n script.addEventListener('error', () => {\n const err = this.printError('Failed to load ' + this.OPENCV_URL);\n this.isReady.next({\n ready: false,\n error: true,\n loading: false\n });\n this.isReady.error(err);\n });\n script.src = this.OPENCV_URL;\n const node = document.getElementsByTagName('script')[0];\n if (node) {\n node.parentNode.insertBefore(script, node);\n } else {\n document.head.appendChild(script);\n }\n }\n\n createFileFromUrl(path, url) {\n const request = new XMLHttpRequest();\n request.open('GET', url, true);\n request.responseType = 'arraybuffer';\n return new Observable(observer => {\n const { next, error: catchError, complete } = observer;\n request.onload = ev => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n const data = new Uint8Array(request.response);\n cv.FS_createDataFile('/', path, data, true, false, false);\n observer.next();\n observer.complete();\n } else {\n this.printError('Failed to load ' + url + ' status: ' + request.status);\n observer.error();\n }\n }\n };\n request.send();\n });\n }\n\n loadImageToCanvas(imageUrl, canvasId: string): Observable<any> {\n return Observable.create(observer => {\n const canvas: HTMLCanvasElement = <HTMLCanvasElement>document.getElementById(canvasId);\n const ctx = canvas.getContext('2d');\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n observer.next();\n observer.complete();\n };\n img.src = imageUrl;\n });\n }\n\n loadImageToHTMLCanvas(imageUrl: string, canvas: HTMLCanvasElement): Observable<any> {\n return Observable.create(observer => {\n const ctx = canvas.getContext('2d');\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n observer.next();\n observer.complete();\n };\n img.src = imageUrl;\n });\n }\n\n clearError() {\n this.errorOutput.innerHTML = '';\n }\n\n printError(err) {\n if (typeof err === 'undefined') {\n err = '';\n } else if (typeof err === 'number') {\n if (!isNaN(err)) {\n if (typeof cv !== 'undefined') {\n err = 'Exception: ' + cv.exceptionFromPtr(err).msg;\n }\n }\n } else if (typeof err === 'string') {\n const ptr = Number(err.split(' ')[0]);\n if (!isNaN(ptr)) {\n if (typeof cv !== 'undefined') {\n err = 'Exception: ' + cv.exceptionFromPtr(ptr).msg;\n }\n }\n } else if (err instanceof Error) {\n err = err.stack.replace(/\\n/g, '<br>');\n }\n throw new Error(err);\n }\n\n loadCode(scriptId, textAreaId) {\n const scriptNode = <HTMLScriptElement>document.getElementById(scriptId);\n const textArea = <HTMLTextAreaElement>document.getElementById(textAreaId);\n if (scriptNode.type !== 'text/code-snippet') {\n throw Error('Unknown code snippet type');\n }\n textArea.value = scriptNode.text.replace(/^\\n/, '');\n }\n\n addFileInputHandler(fileInputId, canvasId) {\n const inputElement = document.getElementById(fileInputId);\n inputElement.addEventListener(\n 'change',\n e => {\n const files = e.target['files'];\n if (files.length > 0) {\n const imgUrl = URL.createObjectURL(files[0]);\n this.loadImageToCanvas(imgUrl, canvasId);\n }\n },\n false\n );\n }\n\n onVideoCanPlay() {\n if (this.onCameraStartedCallback) {\n this.onCameraStartedCallback(this.stream, this.video);\n }\n }\n\n startCamera(resolution, callback, videoId) {\n const constraints = {\n qvga: { width: { exact: 320 }, height: { exact: 240 } },\n vga: { width: { exact: 640 }, height: { exact: 480 } }\n };\n let video = <HTMLVideoElement>document.getElementById(videoId);\n if (!video) {\n video = document.createElement('video');\n }\n\n let videoConstraint = constraints[resolution];\n if (!videoConstraint) {\n videoConstraint = true;\n }\n\n navigator.mediaDevices\n .getUserMedia({ video: videoConstraint, audio: false })\n .then(stream => {\n video.srcObject = stream;\n video.play();\n this.video = video;\n this.stream = stream;\n this.onCameraStartedCallback = callback;\n video.addEventListener('canplay', this.onVideoCanPlay.bind(this), false);\n })\n .catch(err => {\n this.printError('Camera Error: ' + err.name + ' ' + err.message);\n });\n }\n\n stopCamera() {\n if (this.video) {\n this.video.pause();\n this.video.srcObject = null;\n this.video.removeEventListener('canplay', this.onVideoCanPlay.bind(this));\n }\n if (this.stream) {\n this.stream.getVideoTracks()[0].stop();\n }\n }\n\n getContours(src, width, height) {\n cv.cvtColor(src, this.dstC1, cv.COLOR_RGBA2GRAY);\n cv.threshold(this.dstC1, this.dstC4, 120, 200, cv.THRESH_BINARY);\n const contours = new cv.MatVector();\n const hierarchy = new cv.Mat();\n cv.findContours(this.dstC4, contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE, {\n x: 0,\n y: 0\n });\n this.dstC3.delete();\n this.dstC3 = cv.Mat.ones(height, width, cv.CV_8UC3);\n for (let i = 0; i < contours.size(); ++i) {\n const color = new cv.Scalar(0, 255, 0);\n cv.drawContours(this.dstC3, contours, i, color, 1, cv.LINE_8, hierarchy);\n }\n contours.delete();\n hierarchy.delete();\n return this.dstC3;\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { NgOpenCVService, OPEN_CV_CONFIGURATION } from './ng-open-cv.service';\nimport { OpenCVOptions } from './ng-open-cv.models';\n\n@NgModule({\n imports: [],\n declarations: [],\n exports: [],\n providers: [NgOpenCVService]\n})\nexport class NgOpenCVModule {\n /**\n *\n * Setup the module in your application's root bootstrap.\n *\n *\n * @memberOf NgOpenCvModule\n */\n static forRoot(config: OpenCVOptions): ModuleWithProviders<NgOpenCVModule> {\n return {\n ngModule: NgOpenCVModule,\n providers: [{ provide: OPEN_CV_CONFIGURATION, useValue: config }]\n };\n }\n}\n","/*\n * Public API Surface of ngx-open-cv\n */\n\nexport * from './lib/ng-open-cv.models';\nexport * from './lib/ng-open-cv.service';\nexport * from './lib/ng-open-cv.module';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}