Tuesday 18 July 2017

Moving Average Opencv


Calibração da câmera Com as câmeras OpenCV existem há muito tempo. No entanto, com a introdução das câmeras pinhole baratas no final do século 20, elas se tornaram uma ocorrência comum em nossa vida cotidiana. Infelizmente, este preço barato vem com o preço: distorção significativa. Felizmente, estas são constantes e com uma calibração e alguns remapeamentos podemos corrigir isso. Além disso, com a calibração, você também pode determinar a relação entre as unidades naturais (pixels) da camera8217s e as unidades do mundo real (por exemplo, milímetros). Para a distorção, o OpenCV leva em consideração os fatores radiais e tangenciais. Para o fator radial, um usa a seguinte fórmula: Então, para um ponto de pixel antigo em coordenadas na imagem de entrada, sua posição na imagem de saída corrigida será. A presença da distorção radial se manifesta na forma do efeito 8220barrel8221 ou 8220fish-eye8221. A distorção tangencial ocorre porque as lentes de captura de imagem não são perfeitamente paralelas ao plano de imagem. Pode ser corrigido através das fórmulas: Portanto, temos cinco parâmetros de distorção que, em OpenCV, são apresentados como matriz de uma linha com 5 colunas: Agora, para a conversão da unidade, usamos a seguinte fórmula: O processo de determinação dessas duas matrizes é a calibração. O cálculo desses parâmetros é feito através de equações geométricas básicas. As equações utilizadas dependem dos objetos de calibração escolhidos. Atualmente OpenCV suporta três tipos de objetos para calibração: xadrez preto e branco clássico Padrão de círculo simétrico Padrão de círculo assimétrico Basicamente, você precisa tirar instantâneos desses padrões com sua câmera e deixar a OpenCV encontrá-los. Cada padrão encontrado resulta em uma nova equação. Para resolver a equação, você precisa de pelo menos um número predeterminado de instantâneos padrão para formar um sistema de equações bem posicionado. Este número é maior para o padrão do tabuleiro de xadrez e menos para os círculos. Por exemplo, em teoria, o padrão do tabuleiro de xadrez requer pelo menos dois instantâneos. No entanto, na prática, temos uma boa quantidade de ruído presente em nossas imagens de entrada, então, para bons resultados, você provavelmente precisará pelo menos 10 instantâneos do padrão de entrada em diferentes posições. A aplicação de exemplo: Determina a matriz de distorção Determine a matriz da câmera Pegue a entrada da lista de arquivos de câmera, vídeo e imagem Leia a configuração do arquivo XMLYAML Salve os resultados no arquivo XMLYAML Calcule o erro de re-projeção Código fonte Você também pode encontrar o código-fonte no Samplecpptutorialcodecalib3dcameracalibration pasta da biblioteca de origem OpenCV ou baixe-a daqui. O programa possui um único argumento: o nome do seu arquivo de configuração. Se nenhum for dado, ele tentará abrir o nomeado 8220default. xml8221. Heres um exemplo de arquivo de configuração em formato XML. No arquivo de configuração, você pode optar por usar a câmera como uma entrada, um arquivo de vídeo ou uma lista de imagens. Se você optar pela última, você precisará criar um arquivo de configuração onde você enumerará as imagens para usar. Aqui, um exemplo disso. A parte importante a lembrar é que as imagens precisam ser especificadas usando o caminho absoluto ou o relativo do diretório de trabalho do seu aplicativo8217s. Você pode encontrar tudo isso no diretório de amostras mencionado acima. O aplicativo é iniciado com a leitura das configurações do arquivo de configuração. Embora, esta seja uma parte importante disso, não tem nada a ver com o assunto deste tutorial: calibração da câmera. Portanto, I8217ve escolheu não publicar o código para essa parte aqui. Contexto técnico sobre como fazer isso você pode encontrar no arquivo de entrada e saída usando o tutorial de arquivos XML e YAML. Explicação Para este I8217ve usou a operação de entrada de classe OpenCV simples. Depois de ler o arquivo I8217ve uma função de pós-processamento adicional que verifica a validade da entrada. Somente se todas as entradas forem boas, então a variável goodInput será verdadeira. Obtenha a próxima entrada, se falhar ou tivermos o suficiente - calibre. Depois disso, temos um grande loop onde realizamos as seguintes operações: obtenha a próxima imagem da lista de imagens, câmera ou arquivo de vídeo. Se isso falhar ou temos imagens suficientes, então nós executamos o processo de calibração. Em caso de imagem, saímos do loop e, de outra forma, os quadros restantes não serão distorcidos (se a opção estiver configurada) através da mudança do modo DETECÇÃO para o CALIBRADO. Para algumas câmeras, talvez precisemos virar a imagem de entrada. Aqui fazemos isso também. Encontre o padrão na entrada atual. A formação das equações que mencionei acima tem como objetivo encontrar padrões importantes na entrada: no caso do tabuleiro de xadrez, são os cantos dos quadrados e para os círculos, bem, os próprios círculos. A posição destes irá formar o resultado que será escrito no vetor pointBuf. Dependendo do tipo de padrão de entrada, você usa o findChessboardCorners ou a função findCirclesGrid. Para ambos, você passa a imagem atual e o tamanho da placa e you8217ll obtém as posições dos padrões. Além disso, eles retornam uma variável booleana que indica se o padrão foi encontrado na entrada (precisamos apenas levar em consideração essas imagens onde isso é verdade). Então, novamente, no caso de câmeras, nós apenas levamos imagens de câmera quando um tempo de atraso de entrada é passado. Isso é feito para permitir que o usuário mova o tabuleiro de xadrez ao redor e obtenha imagens diferentes. Imagens semelhantes resultam em equações semelhantes, e equações similares no passo de calibração formam um problema mal posto, então a calibração falhará. Para imagens quadradas, as posições dos cantos são apenas aproximadas. Podemos melhorar isso chamando a função cornerSubPix. Ele produzirá melhores resultados de calibração. Depois disso, adicionamos um resultado de entrada válido ao vetor imagesPoints para coletar todas as equações em um único contêiner. Finalmente, para fins de feedback de visualização, desenharemos os pontos encontrados na imagem de entrada usando a função findChessboardCorners. Mostrar estado e resultado para o usuário, além do controle de linha de comando do aplicativo. Esta parte mostra a saída de texto na imagem. Se corremos a calibração e obtivemos a matriz camera8217s com os coeficientes de distorção, podemos querer corrigir a imagem usando a função undistort: ​​então esperamos uma chave de entrada e, se for isso, alternamos a remoção de distorção, se for g, começamos de novo a detecção Processo e, finalmente, para a chave ESC, encerramos o aplicativo: mostre a remoção de distorção para as imagens também. Quando você trabalha com uma lista de imagens, não é possível remover a distorção dentro do loop. Portanto, você deve fazer isso após o loop. Aproveitando isso agora I8217ll expandir a função undistort, que é de fato as primeiras chamadas initUndistortRectifyMap para encontrar matrizes de transformação e, em seguida, executa transformação usando a função remap. Porque, depois de um cálculo de mapa de calibração bem sucedido, deve ser feito apenas uma vez, usando este formulário expandido, você pode acelerar seu aplicativo: a calibração e salvamento. Porque a calibração precisa ser feita apenas uma vez por câmera, faz sentido salvá-lo após uma Calibração bem sucedida. Dessa forma, você pode simplesmente carregar esses valores no seu programa. Devido a isso, fazemos a calibração e, se for bem-sucedida, salvamos o resultado em um arquivo XML ou YAML de estilo OpenCV, dependendo da extensão que você fornece no arquivo de configuração. Portanto, na primeira função, dividimos esses dois processos. Porque queremos salvar muitas das variáveis ​​de calibração we8217ll, crie estas variáveis ​​aqui e transmita-as para a função de calibração e salvamento. Novamente, I8217 não mostra a parte de economia, pois isso tem pouco em comum com a calibração. Explore o arquivo de origem para descobrir como e o que: Fazemos a calibração com a ajuda da função calibrateCamera. Possui os seguintes parâmetros: o objeto aponta. Este é um vetor do vetor Point3f que, para cada imagem de entrada, descreve como o padrão deve ser observado. Se tivermos um padrão plano (como um tabuleiro de xadrez), podemos simplesmente definir todas as coordenadas Z em zero. Esta é uma coleção dos pontos onde esses pontos importantes estão presentes. Porque, usamos um padrão único para todas as imagens de entrada, podemos calcular isso apenas uma vez e multiplicá-lo para todas as outras visualizações de entrada. Calculamos os pontos de canto com a função calcBoardCornerPositions como: E, em seguida, multiplique-o como: A imagem dá pontos. Este é um vetor do vetor Point2f que para cada imagem de entrada contém coordenadas dos pontos importantes (cantos para o tabuleiro de xadrez e centros dos círculos para o padrão de círculo). Nós já recolhemos isso de findChessboardCorners ou findCirclesGrid function. Nós só precisamos transmitir isso. O tamanho da imagem adquirida a partir da câmera, arquivo de vídeo ou as imagens. A matriz da câmera. Se usássemos a opção de relação de aspecto fixa, precisamos definir a zero: a matriz do coeficiente de distorção. Inicialize com zero. Para todas as visualizações, a função calculará os vetores de rotação e tradução que transformam os pontos de objeto (dados no espaço de coordenadas do modelo) para os pontos de imagem (dados no espaço de coordenadas mundial). Os parâmetros 7º e 8º são o vetor de saída de matrizes contendo na i-ésima posição o vetor de rotação e tradução para o i-ésimo ponto de objeto para o i-ésimo ponto de imagem. O argumento final é a bandeira. Você precisa especificar aqui opções como corrigir a relação de aspecto para a distância focal, assumir a distorção tangencial zero ou consertar o ponto principal. A função retorna o erro médio de re-projeção. Este número fornece uma boa estimativa da precisão dos parâmetros encontrados. Isso deve ser o mais próximo possível de zero. Dadas as matrizes intrínsecas, de distorção, de rotação e de tradução, podemos calcular o erro para uma visualização usando os ProjectPoints para primeiro transformar o ponto do objeto no ponto da imagem. Então calculamos a norma absoluta entre o que obtivemos com a nossa transformação e o algoritmo de descoberta do canto. Para encontrar o erro médio, calculamos a média aritmética dos erros calculados para todas as imagens de calibração. Deixe que haja um padrão de xadrez de entrada com um tamanho de 9 X 6. O I8217ve usou uma câmera IP AXIS para criar alguns instantâneos da placa e salvou-o no diretório VID5. I8217ve colocar isso dentro da pasta imagesCameraCalibration do meu diretório de trabalho e criei o seguinte arquivo VID5.XML que descreve as imagens a serem usadas: então passou imagensCameraCalibrationVID5VID5.XML como uma entrada no arquivo de configuração. Aqui, um padrão de xadrez encontrado durante o tempo de execução da aplicação: Após a aplicação da remoção de distorção, obtemos: O mesmo funciona para este padrão de círculo assimétrico, definindo a largura de entrada para 4 e a altura para 11. Desta vez, I8217ve usou uma alimentação de câmera ao vivo especificando Seu ID (822018221) para a entrada. Here8217s, como um padrão detectado deve ser visto: em ambos os casos no arquivo XMLYAML de saída especificada, você achou as matrizes de coeficientes de câmera e distorção: adicione esses valores como constantes ao seu programa, chame o initUndistortRectifyMap e a função remape para remover a distorção e desfrute de distorção livre Entradas para câmeras baratas e de baixa qualidade. Você pode observar uma instância de tempo de execução no YouTube aqui. Ajuda e comentários Você não encontrou o que estava procurando Pergunte sobre o fórum de QA. Se você acha que alguma coisa está faltando ou está errada na documentação, arquive um relatório de erro. A filtragem de imagem pode ser agrupada em dois dependendo dos efeitos: Filtros de passagem baixa (Suavização) A filtragem passa-baixa (aka alisamento) é empregada para remover o alto espaço Ruído de freqüência de uma imagem digital. Os filtros passa-baixa geralmente empregam o operador da janela móvel que afeta um pixel da imagem ao mesmo tempo, alterando seu valor por alguma função de uma região local (janela) de pixels. O operador move-se sobre a imagem para afetar todos os pixels da imagem. Filtros de passagem alta (detecção de borda, afiação) Um filtro passa-alto pode ser usado para tornar a imagem mais nítida. Esses filtros enfatizam detalhes finos na imagem - o oposto do filtro passa-baixa. A filtragem passa-alto funciona da mesma maneira que a filtragem de passagem baixa, apenas usa um kernel de convolução diferente. Ao filtrar uma imagem, cada pixel é afetado por seus vizinhos, e o efeito líquido da filtragem é mover informações em torno da imagem. Neste capítulo, use esta imagem: bogotobogo site search: bogotobogo site search: A filtragem média é fácil de implementar. É usado como um método de suavização de imagens, reduzindo a quantidade de variação de intensidade entre um pixel e o próximo, resultando em redução de ruído nas imagens. A idéia de filtragem média é simplesmente substituir cada valor de pixel em uma imagem com o valor médio (médio) de seus vizinhos, inclusive em si. Isso tem o efeito de eliminar valores de pixels que não são representativos de seus arredores. A filtragem média geralmente é pensada como um filtro de convolução. Como outras circunvoluções, ela é baseada em um núcleo, que representa a forma e o tamanho da vizinhança a ser amostrada ao calcular a média. Muitas vezes, é usado um kernel de 3 vezes 3 quadrados, como mostrado abaixo: O mf é o filtro médio: O filtro2 () é definido como: Y filter2 (h, X) filtra os dados em X com o filtro FIR bidimensional no Matriz h. Ele calcula o resultado, Y, usando correlação bidimensional e retorna a parte central da correlação que é do mesmo tamanho que X. Ele retorna a parte de Y especificada pelo parâmetro de forma. Shape é uma string com um desses valores: full. Retorna a correlação bidimensional completa. Neste caso, Y é maior do que X. mesmo. (Padrão) Retorna a parte central da correlação. Neste caso, Y é do mesmo tamanho que X. válido. Retorna apenas as partes da correlação que são computadas sem bordas remendadas. Nesse caso, Y é menor do que X. Agora queremos aplicar o kernel definido na seção anterior usando filter2 (): podemos ver a imagem filtrada (direita) foi borrada um pouco em comparação com a entrada original (esquerda) . Conforme mencionado anteriormente, o filtro de passagem baixa pode ser usado como denoising. Vamos testá-lo. Primeiro, para tornar a entrada um pouco suja, pulverizamos um pouco de pimenta e sal na imagem e, em seguida, aplique o filtro médio: Ele tem algum efeito sobre o barulho de sal e pimenta, mas não muito. Isso apenas os deixou desfocados. Que tal tentar o filtro mediano interno Matlabs bogotobogo pesquisa do site: pesquisa do site bogotobogo: Median filter - medfilt2 () Aqui está o script: Muito melhor. Ao contrário do filtro anterior que está apenas usando o valor médio, desta vez usamos a mediana. A filtragem mediana é uma operação não-linear usada frequentemente no processamento de imagens para reduzir o ruído salino e pimenta. Observe também que o medfilt2 () é um filtro 2-D, portanto, ele só funciona para a imagem em escala de cinza. Para remover o ruído para a imagem RGB, vá até o final deste capítulo: Removendo o ruído na imagem RGB. O Matlab fornece um método para criar um filtro 2-D predefinido. Seu fspecial (): h fspecial (type) cria um filtro bidimensional h do tipo especificado. Ele retorna h como um kernel de correlação, que é a forma apropriada para usar com imfilter (). O tipo é uma string com um desses valores: Matlab Image and Video Processing OpenCV 3 - processamento de vídeo de imagem Processamento de imagem e vídeo OpenCV 3 com Python

No comments:

Post a Comment