Como posso detectar uma placa quadrilátero de uma imagem capturada usando um telefone celular? Como posso detectar formas como retângulo? retângulo arredondado (cantos arredondados em vez de cantos de forma)?
Estou usando o opencv.wrapper, mas sou novo nele.
Obrigado.
Aqui está o exemplo: alt text http://www.freeimagehosting.net/uploads/b03442fd36.png
texto alternativo http://www.freeimagehosting.net/uploads/e6b36040e8.png
Devido ao barulho e a muitas linhas, não consigo determinar qual é a linha de limite da placa. Às vezes, consigo encontrar o limite das linhas após a transformação de hough. Estou preso .... neste tipo de cenário ...
Esta é a 2 fotos cruas tiradas da câmera do telefone móvel
texto alternativo http://www.freeimagehosting.net/uploads/6dbd613edf.jpg texto alternativo http://www.freeimagehosting.net/uploads/720da20080.jpg
Preciso de conselhos para ver como posso processar a imagem para tirar a placa?
Muito obrigado
Respostas:
Suas duas imagens contêm muitas linhas que não têm nada a ver com o sinal que você está procurando. E algumas dessas linhas são mais longas / têm maior contraste do que as que você realmente deseja, então acho que detectar as linhas da borda (por exemplo, usando uma transformação hough ou resumindo os contrastes horizontal / verticalmente) não funcionará.
Mas: o sinal que você procura tem outras características que devem ser mais fáceis de detectar:
Então, você está procurando uma grande área conectada com baixo contraste. Eu invadi um algoritmo de prova de conceito no Mathematica. (Eu não sou um especialista em OpenCV, mas mencionarei a respectiva função OpenCV quando os conhecer.)
Primeiro, uso filtros derivativos gaussianos para detectar a magnitude do gradiente em cada pixel. O filtro derivado gaussiano tem uma ampla abertura (11x11 pixels neste caso), por isso é muito insensível ao ruído. Em seguida, normalizo a imagem do gradiente para média = 1, para que eu possa usar os mesmos limites para as duas amostras.
Implementação do OpenCV: você pode usar
sepFilter2D
para a filtragem real, mas , aparentemente, precisará calcular os valores do kernel do filtro .O resultado fica assim:
Nesta imagem, o fundo do sinal é escuro e as bordas do sinal são brilhantes. Para que eu possa binarizar esta imagem e procurar componentes conectados escuros.
Implementação do OpenCV: o limiar deve ser direto, mas acho que o OpenCV não contém análise de componentes conectados - você pode usar flood fill ou cvBlobsLib para isso.
Agora, encontre o maior blob próximo ao centro da imagem e o casco convexo (simplesmente usei o maior blob que não está conectado ao plano de fundo, mas isso pode não ser suficiente para todas as imagens).
Resultados:
fonte
Outra abordagem que você pode adotar que é mais robusta a ruídos nessa situação é gerar uma curva do nível médio de cinza da imagem ao longo do eixo xe do eixo y. Ou seja, calcule o nível de cinza médio para cada linha / coluna na imagem.
Se, por exemplo, a placa (ou suas bordas) for mais clara que o ambiente (que é o caso de todos os exemplos mostrados na pergunta), você terá dois picos em sua curva do eixo x (para as bordas esquerda e direita) ) e dois picos na curva do eixo y (para as bordas superior e inferior). Usando uma técnica de detecção de borda para um sinal de 1 dimensão (talvez um filtro passa-alto), é possível deduzir as coordenadas dos cantos da placa.
Eu já vi essa abordagem sendo usada para detectar placas de automóveis e também para reconhecimento de faces (o nariz tende a ser a parte mais brilhante da face, portanto gera um pico nas curvas dos eixos xe y).
fonte
Pode ser uma idéia invertida, mas vale a pena tentar. Em vez de tentar detectar o retângulo e pensar no texto como ruído , talvez você possa tratar o texto como informação e usá-lo para detectar o retângulo com mais facilidade.
Aqui está o esboço da ideia:
As explicações e vantagens:
fonte