UNPKG

@libs-scripts-mep/inv-img-tool

Version:

Ferramenta de visão computacional com implementações dedicadas à validação de displays em testes automatizados de linha de produção.

289 lines (239 loc) 12.7 kB
- [INV Image Tool](#inv-image-tool) - [Instalando](#instalando) - [Desinstalando](#desinstalando) - [Server Websocket](#server-websocket) - [Workflow](#workflow) - [Estrutura do Workflow (.JSON)](#estrutura-do-workflow-json) - [Executando etapas isoladas do workflow (Development Only)](#executando-etapas-isoladas-do-workflow-development-only) - [camera.py](#camerapy) - [hsvfilter.py](#hsvfilterpy) - [grayscale.py](#grayscalepy) - [Dependency Checker](#dependency-checker) - [Try-out](#try-out) # INV Image Tool Ferramenta para validações de elementos IHM de um produto. A aplicação sobe um servidor websocket `localhost:8765` que fica aguardando um workflow para ser executado. Quando recebe um workflow do `client`, executa as etapas pré-determinadas no `.JSON` e retorna os resultados para o `client` em tempo real. # Instalando Abra o terminal, e na pasta do script, execute: ``` npm i @libs-scripts-mep/inv-img-tool ``` # Desinstalando Abra o terminal, e na pasta do script, execute: ``` npm uninstall @libs-scripts-mep/inv-img-tool ``` # Server Websocket ```js import { IITServer, IITClient } from "../node_modules/@libs-scripts-mep/inv-img-tool/IIT.js" //💡 Recomendado executar a cada teste o seguinte comando para iniciar o servidor, caso já esteja iniciado, o comando será ignorado. const serverStart = await IITServer.startWebsocket() if (!serverStart.success) { throw new Error('Failed server start') } const relativeRefPath = "../my/relative/path/" const fileName = "pattern.json" await IITClient.startWorkflow(relativeRefPath, fileName, streamVideoElement, resultVideoElement, debugMode) ``` > 💡Para que seja renderizado o stream de video, é necessário passar um elemento HTML para `streamVideoElement` e/ou um elemento HTML para `resultVideoElement`. # Workflow Um `workflow` é uma sequência de etapas - `steps` - de processamento de imagem sobre o frame da camera - `haystack` - relacionando à um conjunto específico de imagens de referência - `needle image`. Esse workflow pode ou não configurar parâmetros do firmware da câmera - `cap_props` - afim de alcançar uma condição específica de imagem em uma determinada situação. ## Estrutura do Workflow (.JSON) ```js { "pattern1.png": { "timeout": 5, //tempo em segundos que a aplicação tenta validar a imagem. Cada imagem possui seu proprio timeout configurado. "result": null, //result em null significa que ainda não foi validada. true ou false são resultados da validação finalizada. "setup": { "cap_props": { //❔propriedades opcionais do firmware da câmera. ⚠️ OBS: essas propriedades podem variar de acordo com a câmera. "BRIGHTNESS": { "cvenum": 10, //valor do enumerador da biblioteca OpenCV para o respectiva propriedade ⚠️ OBS: NÃO ALTERAR ESSES VALORES. "value": 128.0, //valor absoluto que será configurado "min": 0, //valor minimo que o parâmetro influenciará no firmware da câmera. ⚠️ OBS: esses valores podem variar de acordo com a câmera "max": 255 //valor maximo que o parâmetro influenciará no firmware da câmera. ⚠️ OBS: esses valores podem variar de acordo com a câmera }, "CONTRAST": { "cvenum": 11, "value": 32.0, "min": 0, "max": 255 }, "SATURATION": { "cvenum": 12, "value": 32.0, "min": 0, "max": 255 }, "GAIN": { "cvenum": 14, "value": 12.0, "min": 0, "max": 255 }, "EXPOSURE": { "cvenum": 15, "value": -6.0, "min": 0, "max": 15, "negative": true //Essa propriedade exclusivamente necessita ser passada com valor negativo. }, "SHARPNESS": { "cvenum": 20, "value": 24.0, "min": 0, "max": 255 }, "ZOOM": { "cvenum": 27, "value": 100.0, "min": 0, "max": 400 }, "FOCUS": { //💡câmeras que tem autofoco, é recomendado encontrar o foco ideal, e durante a aplicação sempre configurar esse parâmetro. "cvenum": 28, "value": 80, "min": 0, "max": 255 } } }, "steps": { "stream": {}, //❔ passo opcional, caso esteja listado nesse objeto, será transmitido para o client os frames da câmera "homography": { // Realiza correção de PERSPECTIVA, ROTAÇÃO e ESCALA da imagem haystack em relação ao needle "debug": false //Esse modo habilita janelas durante essa etapa e imagem especificamente para detectar problemas ou ajustar alguma configuração. }, "template": { //⚠️ OBS: `main_color`, `template` e `template_xor` são as únicas etapas que realizam validação "score_target": 0.8, //❔propriedade opcional que define o percentual minimo de pixels coincidentes entre needle image e haystack para aprovação. Default 0.5 "debug": false }, "grayscale": { "debug": false }, "bin_threshold": { "threshold": 180, //❔propriedade opcional que define o valor limiar para binarização da imagem. Default 200 "debug": false }, "template_xor": { "mask_size": [ //❔ propriedade opcional que define o tamanho da mascara para aplicação de XOR. Default [10, 10] 30, //altura em pixels 50 //largura em pixels ], "min_score" : 0.9, //❔ propriedade opcional que define o percentual minimo de pixels coincidentes entre a mascara aplicada sobre needle image e haystack. Default 0.8 "validate": true, //propriedade indicando que esta etapa realizará a aprovação ou reprovação da imagem. "debug": false } } }, "pattern2.png": { "timeout": 5, "delay": 2, //❔ propriedade opcional que define o tempo de espera para iniciar a validação. "result": null, "setup": { "cap_props": {} //se as propriedades para validar a segunda imagem forem iguais as da primeira, pode-se informar um objeto vazio. }, "steps": { "stream": {}, "homography": { "debug": false }, "hsv_filter": { "debug": false }, "template": { "score_target": 0.5, "debug": false }, "grayscale": { "debug": false }, "bin_threshold": { "debug": false }, "template_xor": { "validate": true, "debug": false } } }, "color.png": { "timeout": 5, "result": null, "setup": { "cap_props": { "EXPOSURE": { "cvenum": 15, "value": 4.0, "min": 0, "max": 15, "negative": true } } }, "steps": { "stream": {}, "hsv_filter": { //Etapa que aplica um filtro HSV na imagem, excluindo (pintando de preto) tudo que não corresponder ao range informado. "filter": { "hMin": 0, //HUE minimo "sMin": 0, //SATURATION minimo "vMin": 0, //VALUE minimo "hMax": 14, //HUE maximo "sMax": 255, //SATURATION maximo "vMax": 255, //VALUE maximo "sAdd": 0, //SATURATION adicional "sSub": 0, //SATURATION subtrativo "vAdd": 255, //VALUE adicional "vSub": 0 //VALUE subtrativo }, "debug": false }, "template": { "debug": false }, "main_color": { //Etapa que extrai a cor predominante, e compara com a cor informada em "expected_color" "debug": false, "expected_color": "vermelho", //cores possíveis: 🟥vermelho, 🟧laranja, 🟨amarelo, 🟩verde, 🩳ciano, 🟦azul, 🟪roxo "validate": true } } } } ``` > ⚠️ Para mais informações, inspecione a implementação nos arquivos do repositório # Executando etapas isoladas do workflow (Development Only) É póssivel executar alguns algorítmos de forma isolada, esse recurso existe especialmente para `desenvolvimento`, onde por vezes é necessário combinar uma série de filtros e configurações para realizar uma validação. ## camera.py ![Image](https://i.imgur.com/KkwPKVg.png) Habilita trackbars para alterar as configurações da camera. Cada vez que uma configuração for alterada, a imagem será atualizada e será printado no terminal a configuração atual. Nesse momento é possível copiar o objeto, e colar no `.json` do ```workflow```. O output se parece com isso: ```json cam props has changed: {'BRIGHTNESS': {'cvenum': 10, 'value': 128.0, 'min': 0, 'max': 255}, 'CONTRAST': {'cvenum': 11, 'value': 32.0, 'min': 0, 'max': 255}, 'SATURATION': {'cvenum': 12, 'value': 126.0, 'min': 0, 'max': 255}, 'GAIN': {'cvenum': 14, 'value': 0.0, 'min': 0, 'max': 255}, 'EXPOSURE': {'cvenum': 15, 'value': 6.0, 'min': 0, 'max': 15, 'negative': True}, 'SHARPNESS': {'cvenum': 20, 'value': 24.0, 'min': 0, 'max': 255}, 'ZOOM': {'cvenum': 27, 'value': -1.0, 'min': 0, 'max': 400}, 'FOCUS': {'cvenum': 28, 'value': -1.0, 'min': 0, 'max': 255}} ``` ## hsvfilter.py ![Image](https://i.imgur.com/AWhmwRO.png) Similar ao `camera.py`, o `hsvfilter.py` possibilita aplicar um filtro HSV `E` alterar as configurações da camera. Também similar ao `camera.py`, o `hsvfilter.py` printa os valores de filtros e configurações da câmera no terminal (sempre printa a última alteração realizada). Output: ```json {'hMin': 82, 'sMin': 198, 'vMin': 159, 'hMax': 114, 'sMax': 255, 'vMax': 255, 'sAdd': 0, 'sSub': 0, 'vAdd': 0, 'vSub': 0, 'trackbar_is_active': True} ``` ## grayscale.py ![Image](https://i.imgur.com/tzWtuZL.png) Ao executar separadamente o `grayscale.py`, abrirá todas as configurações anteriores, e uma nova configuração de `Threshold`. Essa configuração determina o limiar do processo de binarização, etapa responsável por preparar a imagem para `template_over_xor` # Dependency Checker Foi implementado um script para verificar as dependências do projeto. Caso não estejam instaladas ou instaladas na versão incorreta, o script irá resolver baixando e instalando as dependências. Para isso, basta executar o seguinte método: ```js import { DepChecker } from "../node_modules/@libs-scripts-mep/inv-img-tool/IIT.js" const depCheckResult = await DepChecker.checkDependencies() if (!depCheckResult.success) { throw new Error('Failed dependency check') } ``` # Try-out Implementação minimalista para realizar o primeiro contato com a ferramenta. Necessita: 1. Abrir o repositório `inv-img-tool` como workspace no VScode (⚠️não abrir o repositório principal do script como workspace) 2. Executar manualmente o arquivo `websocket.py` 3. Ter uma câmera conectada à máquina 4. Abrir o arquivo `test/index.html` no navegador 5. Clique em start, e aponte a camera para a window `Template` que abrirá. ![Image](https://i.imgur.com/yTqD62p.png) ![Image](https://i.imgur.com/SpBv9S4.png)