Etiquetadora para etiquetas labiais - expanda a distorção do cilindro programaticamente

Em nosso aplicativo, há um recurso, como o filho da namorada da minha mãe, Vivino - a definição de vinho de uma fotografia. Sob o capô - o uso de serviços de terceiros, Tineye - para determinar o rótulo mais adequado, o Google Vision - para ler o texto nele. Este último é necessário para esclarecer o produto correto, porque a pesquisa de imagens não leva em consideração a importância de algumas regiões, como regra - são informações textuais - ano e tipo de vinho.

No entanto, a precisão de ambos os serviços é visivelmente reduzida devido ao fato de a etiqueta estar distorcida por uma superfície cilíndrica.

Isso é especialmente perceptível no Google Vision - qualquer texto fora da parte central do rótulo é praticamente ilegível, embora uma pessoa o reconheça facilmente. Neste artigo, descreverei como reverter a distorção e aumentar a precisão do reconhecimento do produto.



Antes de tudo, considere o que é distorção.



A etiqueta retangular, quando colada ao cilindro, tem a forma característica de um barril (b no diagrama acima). A curva ABC, neste caso, em uma aproximação bastante boa, é uma elipse, porque vemos um círculo (seção do cilindro) em ângulo. As muitas linhas horizontais da etiqueta também se transformam em muitas elipses na fotografia.

O mais interessante é que, para expandir o rótulo, basta especificar 6 marcadores (ABCDEF):



E, usando-os, construa uma grade de superfície completa:



Tendo uma grade de superfície, podemos expandir cada bloco separadamente e obter a superfície original:



O código da biblioteca está disponível no github . A conveniência desse método é que os parâmetros de entrada para a transformação inversa são características visualmente definidas do rótulo (ângulos e pontos superiores e inferiores), o que permite automatizar completamente o processo.

A próxima parte é sobre como definir marcadores. O código de trabalho está disponível apenas parcialmente na ramificação do github , como uma solução realmente funcional é coberta por hacks e xamanismo; portanto, a consciência simplesmente não permite que essa lata seja carregada no github.

Etapa um - converta a imagem em preto e branco.

Então você precisa obter os contornos da garrafa com a etiqueta. Para fazer isso, usamos a transformação sobel . Em resumo, esse filtro primeiro desfoca a imagem e depois a subtrai do original. Como resultado, áreas uniformes permanecem escuras e as bordas (alterações) permanecem claras.



A próxima coisa a fazer é identificar as duas linhas verticais mais visíveis, que, se você tiver sorte, são as bordas da garrafa. Nesse caso, isso é verdade, mas se você fotografar uma garrafa ao lado de outras garrafas, esse não será mais o caso.

Para determinar essas linhas, use a transformação Hough . A essência da técnica é que pegamos muitas linhas que atravessam a tela inteira e consideramos o valor médio dos pixels (por exemplo, pegamos linhas que vão da parte superior da imagem para a parte inferior). Transferimos esses valores para o novo plano de coordenadas e obtemos algo como um mapa de calor. Neste mapa de calor, estamos procurando dois extremos - eles são as linhas laterais.

O diagrama abaixo mostra como a linha esquerda vai para um ponto no novo plano de coordenadas:



Com as elipses, é um pouco mais complicado, mas sabendo que a transformação Hough pode ser aplicada a qualquer curva matematicamente definida, usaremos esse método novamente, mas desta vez procuraremos muitas curvas elípticas.

Mas primeiro você precisa trazer o problema para uma forma bidimensional. Sabendo que a garrafa é centralmente simétrica, pegamos o eixo central da coordenada Y e um lado para X. Para os valores no novo plano de coordenadas, pegamos muitas elipses construídas entre o eixo central e o lado. Isso é possível devido ao fato de que um ponto arbitrário no lado e no eixo central possui apenas um método de conexão. Talvez isso não seja muito óbvio à primeira vista, mas é muito mais fácil entender se recorrermos à fórmula paramétrica da elipse:

x = a * cos (t)
y = b * sin (t)



Exatamente da mesma maneira, encontramos os dois extremos procurados que definem duas elipses de rótulo (curvas AB, FE). Agora que temos todos os parâmetros de etiqueta necessários (curvas laterais e elipses superior e inferior), podemos aplicar o algoritmo da primeira parte do artigo e executar a transformação inversa.

O que pode ser melhorado. Primeiramente, o algoritmo não leva em consideração a distorção da perspectiva da elipse em si, como resultado, os fragmentos laterais do rótulo são esticados um pouco mais do que deveriam. Para fazer uma correção, você precisa conhecer o ângulo de visão real da câmera ou, pelo menos, usar o mais comum para o telefone (você pode escolher empiricamente).

Em segundo lugar, a transformação Hough funciona bastante instável em condições difíceis - por exemplo, quando garrafas adjacentes caem na estrutura e as bordas da garrafa de interesse podem não ser detectadas corretamente.

Em terceiro lugar, se o rótulo não tiver uma forma retangular (por exemplo, elíptica), os marcadores serão detectados incorretamente e a transformação distorcerá a imagem apenas com mais força.

Na prática, é muito mais interessante usar uma rede neural para identificar marcadores, porque ele pode ser treinado usando exemplos complexos para que, no mínimo, o algoritmo não realize transformação se marcadores não puderem ser determinados. Mas até agora eu não tentei usar o neurônio para esta tarefa, então talvez este seja o tópico de um artigo separado :)

Source: https://habr.com/ru/post/pt424151/


All Articles