<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Efeitos de Distorção de Lentes Parametrizáveis a 1000+ FPS</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Lucas Oliveira Maggi</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>João Marcelo Xavier Natário Teixeira</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Lucas Silva Figueiredo</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Veronica Teichrieb</string-name>
        </contrib>
      </contrib-group>
      <fpage>67</fpage>
      <lpage>77</lpage>
      <abstract>
        <p>This paper describes the implementation of a parameterizable lens distortion effect technique running at 1000+ FPS on CPU. Different image resolutions were used to validate the implemented technique and the visual result obtained showed to be very satisfactory. Resumo. Este artigo descreve a implementação de uma técnica de efeito de distorção de lentes parametrizáveis com desempenho superior a 1000 FPS em CPU. Diferentes resoluções de imagem foram utilizadas na validação da técnica implementada e o resultado visual obtido mostrou-se bastante satisfatório.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introdução</title>
      <p>conclusões acerca do projeto e indica possíveis caminhos a serem traçados como
trabalhos futuros.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Trabalhos relacionados</title>
      <p>Todos os trabalhos relacionados são voltados para distorção de lente e/ou calibração de
câmera, e podem ser categorizados quanto à finalidade:


</p>
      <p>
        Em [Tsai 1987, Weng et al. 1992,
        <xref ref-type="bibr" rid="ref11">Gribbon et al. 2003</xref>
        , Thirthala et Pollefeys 2005] é
considerada a distorção radial de lente para correção da imagem. Já em [Claus et
Fitzgibbon 2005], a distorção radial é utilizada para fins de comparação com outras
distorções.
      </p>
    </sec>
    <sec id="sec-3">
      <title>3. Conceitos básicos</title>
      <p>
        Distorções de lente são causadas pelo formato da lente utilizada, e pelo efeito de
refração da luz na mesma. Tais distorções podem ser descritas e parametrizadas
matematicamente. Distorções radiais são distorções que apresentam uma variação da
distorção de acordo com a distância radial em relação a algum centro. São distorções
radiais: Barrel Distortion e Pincushion Distortion, ambas ilustradas na Figura 1
[
        <xref ref-type="bibr" rid="ref11">Gribbon el al 2003</xref>
        ].
      </p>
    </sec>
    <sec id="sec-4">
      <title>Figura 1. Efeitos de distorção de lentes: Distorção de Barril (esquerda) e Distorção de Almofada (direita).</title>
    </sec>
    <sec id="sec-5">
      <title>4. O algoritmo</title>
      <p>O algoritmo proposto leva em consideração apenas a distorção radial, desconsiderando a
distorção tangencial, utilizando as seguintes equações:</p>
    </sec>
    <sec id="sec-6">
      <title>Equação 1. Transformação não linear de Brown-Conrady em x.</title>
    </sec>
    <sec id="sec-7">
      <title>Equação 2. Transformação não linear de Brown-Conrady em y.</title>
      <p>e representam as coordenadas na imagem original, e r é o valor do raio calculado.
é dado em função da seguinte equação:</p>
    </sec>
    <sec id="sec-8">
      <title>Equação 3. Equação da circunferência no plano.</title>
      <p>Uma vez que o valor do raio não é utilizado nas equações listadas anteriormente, apenas
é necessário calcular os valores de , e , evitando assim a realização de operações
de raiz quadrada, o que melhora o desempenho e a precisão do algoritmo.
Com base nas equações iniciais, é necessária a definição de três coeficientes (
para o cálculo da distorção radial. Cada um deles atua sobre uma parte específica do
polinômio. Sendo assim, a entrada da solução é dada pela imagem juntamente com os
parâmetros definidos.</p>
      <p>As coordenadas x e y da imagem original devem ser convertidas para coordenadas
canônicas, no intervalo , considerando que a origem está localizada no centro da
imagem, com o valor de invertido (diminui de cima para baixo, contrariamente ao que
acontece na biblioteca OpenCV). Para isso, são usadas as seguintes equações:</p>
    </sec>
    <sec id="sec-9">
      <title>Equação 4. Conversão de coordenadas em x.</title>
    </sec>
    <sec id="sec-10">
      <title>Equação 5. Conversão de coordenadas em y.</title>
      <p>Nas equações anteriores, e indicam as coordenadas dos pixels nas imagens
representadas pela biblioteca OpenCV.
Como o mapeamento é realizado do espaço de imagem no OpenCV para o espaço de
imagem no OpenCV, deve-se realizar agora o processo inverso, para que se tenha como
resultado as coordenadas finais e já transformadas. Para isso, são usadas as
seguintes equações:</p>
    </sec>
    <sec id="sec-11">
      <title>Equação 6. Reversão de coordenadas em x.</title>
    </sec>
    <sec id="sec-12">
      <title>Equação 7. Reversão de coordenadas em y.</title>
    </sec>
    <sec id="sec-13">
      <title>Equação 8. Rescalonando para a imagem final em x.</title>
    </sec>
    <sec id="sec-14">
      <title>Equação 9. Rescalonando para a imagem final em y.</title>
      <p>O primeiro par de equações é responsável por converter as coordenadas de volta,
considerando a origem deslocada e a reflexão no eixo . O segundo par de equações
aplica um fator de escala nas coordenadas encontradas, proporcional aos valores de
altura (rows) e largura (cols) da imagem resultante.</p>
      <p>Caso as coordenadas finais encontradas estejam fora do intervalo de pixels da imagem,
pode-se preencher aquele pixel com informação de uma cor estática. No nosso caso, foi
escolhida a cor preta como cor de fundo.</p>
    </sec>
    <sec id="sec-15">
      <title>4.1. Implementação</title>
      <p>A solução desenvolvida foi implementada usando a linguagem de programação C++,
incluindo a biblioteca padrão (STL) do C++11. Utilizou-se a biblioteca OpenCV para
fins de carregamento das imagens/videos de entrada (arquivos ou webcam) e exibição
do resultado em tempo real em janelas (resultado da distorção). Além disso, apenas a
estrutura Mat foi utilizada, o que torna todo o código desenvolvido compatível com as
versões 2.4 e 3 da biblioteca. A IDE de desenvolvimento utilizada foi o Microsoft
Visual Studio 2015 Community. O desempenho da solução foi otimizado com
paralelismo para um processador multicore através da biblioteca OpenMP em dois
momentos: criação dos endereços de mapeamento da transformação e cópia dos valores
da imagem original para a imagem transformada.
O trecho de código responsável por calcular o mapeamento entre imagem original e
imagem distorcida, ou seja, os novos endereços para cada posição de pixel na imagem
original é descrito na Figura 2:</p>
    </sec>
    <sec id="sec-16">
      <title>Figura 2. Código do cálculo de endereço.</title>
      <p>Na Figura 3 está presente o trecho de código responsável por realizar a cópia dos pixels
da imagem original para a imagem distorcida, seguindo os endereços calculados
previamente, é dado a seguir:</p>
    </sec>
    <sec id="sec-17">
      <title>Figura 3. Código de cópia/aplicação da distorção.</title>
    </sec>
    <sec id="sec-18">
      <title>5. Resultados</title>
      <p>Apresentamos nesta seção os resultados obtidos, em imagens originais e distorcidas, e
gráficos comparativos de desempenho. Utilizamos duas fontes diferentes de imagem,
uma delas foi uma webcam integrada ao computador utilizado, e outra foi de vídeo, e
três resoluções distintas. Dados de desempenho, além de sua análise, são detalhados.</p>
    </sec>
    <sec id="sec-19">
      <title>5.1 Cenários de validação</title>
      <p>Foram selecionadas três resoluções para realização dos testes de efeito visual e de
desempenho, sendo estas: 480p, 720p e 1080p. O uso de tais resoluções se justifica pelo
fato das mesmas serem comumente utilizados tanto na indústria
cinematográfica/televisiva, quanto em computadores pessoais.</p>
      <p>Os vídeos utilizados como entrada para o algoritmo foram:
A: Webcam, resolução 640x480 (480p, VGA)
B: Steve Jobs - The Man In The Machine (2015), resolução 1280x720(720p, HD)
C: Inside Out (2015), resolução 1920x1080(1080p, Full HD)
A seguir estão as configurações utilizadas dos parâmetros k1, k2, k3, juntamente com os
resultados obtidos.</p>
      <p>Originais: k1 = 0, k2 = 0, k3 = 0. (Sem distorção)</p>
      <p>A
Distorção 1: k1 = 0, k2 = 0, k3 = -12.</p>
      <p>A
Distorção 2: k1 = 0, k2 = 0, k3 = 12.</p>
    </sec>
    <sec id="sec-20">
      <title>5.2 Análise de desempenho</title>
      <p>Para validar o desempenho observado, foram realizados vários conjuntos de testes de
performance em um notebook. Temos como método para medição o uso de média
aritmética simples de 1000 (mil) amostras de desempenho, ou seja, afere-se o tempo
gasto no cálculo de cada etapa, Cálculo de endereços e Cópia, e para cada etapa é
calculada uma média dessas 1000 (mil) amostras. Executamos o procedimento descrito
anteriormente 10 (dez) vezes para realizar uma média da replicação do procedimento e
utilizar como valor final para análise de desempenho, sendo até aqui o conjunto de teste.
Foi realizado um conjunto de teste para diferentes quantidades de threads, sendo as mais
significativas nas quantidades 1, 2, 4 e 8 threads (acima de 8 threads houve queda de
desempenho, possivelmente devido ao processador utilizado na realização dos testes).
As especificações do notebook utilizado nos testes são: ASUS S46C, Intel(R) Core(™)
i7-3537U @ 2.00 GHz (2,5GHz máximo), 2 núcleos físicos, 4 processadores lógicos,
4MB cache L3, 512KB cache L2, 128KB cache L1, 8GB RAM(2x4GB) DDR3.
Sistema operacional: Microsoft Windows 8.1 Single Language. Prioridade do processo:
Normal.</p>
      <p>Constatou-se que o desempenho, medido em quadros por segundo, variava de acordo
com a quantidade de threads e de pixels (resolução) da imagem. Observou-se também
que o comportamento do desempenho acompanhava o crescimento da quantidade de
threads, no entanto com uma diferença de desempenho cada vez menor entre os
números consecutivos, como pode ser visto a seguir nas Figuras 4 e 5.</p>
    </sec>
    <sec id="sec-21">
      <title>Figura 4. Comparação de desempenho de cópia.</title>
    </sec>
    <sec id="sec-22">
      <title>Figura 5. Comparação de desempenho do cálculo de endereço.</title>
      <p>Temos que a limitação de FPS será dada pelo processo que for mais lento, ou seja, o que
possui menor FPS. Sendo assim, para uma execução em tempo real com a distorção
sendo modificada a cada quadro, o desempenho de todo o processo de distorção é
limitado pelo cálculo do endereço (Figura 5). No caso de uma distorção ser aplicada e
fixada ao longo da execução, o desempenho segue o desempenho de cópia (Figura 4).
De acordo com os testes realizados conseguimos executar o cálculo de endereço com
FPS acima de 30 com as resoluções A e B para todas as quantidades de threads
utilizadas. Com a resolução C (1080p), a única a não apresentar esse comportamento,
conseguimos executar a o cálculo de endereço com FPS acima de 30 quando a
quantidade de threads foi 4 e 8, havendo pouca diferença entre os dois.</p>
    </sec>
    <sec id="sec-23">
      <title>6. Conclusão</title>
      <p>Este artigo apresentou a possibilidade de realizar efeitos de distorções de lentes com três
parâmetros em tempo real em formatos comuns de reprodução, mostrando o potencial
para efeitos de pós-processamento da imagem, ou para correção de distorção da imagem
em tempo real.</p>
      <p>Como trabalhos futuros tem-se a implementação de distorção de múltiplos centros, neste
trabalho foi utilizado para testes apenas o centro da imagem como centro de distorção
de lente, a disponibilização de uma API pública com as técnicas implementadas e uma
versão da distorção implementada em GPU ao invés de CPU, utilizando o poder de
processamento paralelo massivo dessa plataforma.</p>
    </sec>
    <sec id="sec-24">
      <title>Referências</title>
      <p>YING Xiang-Hua e HU Zhan-Yi. (2003) “Fisheye Lense Distortion Correction Using</p>
      <p>Spherical Perspective Projection Constraint”, Chinese Journal Of Computers.
Juyang Weng, Paul Cohen, e Marc Herniou. (1992) "Camera Calibration with
Distortion Models and Accuracy Evaluation", IEEE Transactions on Pattern Analysis
and Machine Intelligence, Vol. 14, No. 10.</p>
      <p>Andrew W Fitzgibbon. (2001) "Simultaneous linear estimation of multiple view
geometry and lens distortion", IEEE Computer Vision and Pattern Recognition 2001
(CVPR 2001).</p>
      <p>Shishir Shah, J. K. Aggarwal. (1996) "Intrinsic parameter calibration procedure for a
(high-distortion) fish-eye lens camera with distortion model and accuracy
estimation", Vol. 29, No. 11., Pages 1775-1788.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          <source>Descrição de distorção paramétrica [Brown</source>
          . 1966],
          <source>Calibração [Brown</source>
          <year>1971</year>
          , Weng et al.
          <year>1992</year>
          ,
          <source>Shar et Aggarwal</source>
          <year>1996</year>
          ,
          <article-title>Zhang 2000</article-title>
          ,
          <article-title>Fitzgibbon 2001</article-title>
          ,
          <source>Thirthala et Pollefeys</source>
          <year>2005</year>
          ,
          <source>Claus et Fitzgibbon</source>
          <year>2005</year>
          , De Villiers et al.
          <year>2008</year>
          ],
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          <source>Visão [Tsai</source>
          <year>1987</year>
          , Weng et al.
          <year>1992</year>
          ,
          <string-name>
            <surname>Gribbon</surname>
          </string-name>
          , K. T. et al.
          <year>2003</year>
          ].
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          <string-name>
            <given-names>G. P.</given-names>
            <surname>Stein</surname>
          </string-name>
          , (
          <year>1997</year>
          )
          <article-title>"Lens Distortion Calibration Using Point Correspondences"</article-title>
          , IEEE,
          <source>Computer Vision and Pattern Recognition</source>
          <year>1997</year>
          (CVPR
          <year>1997</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          <string-name>
            <surname>Roger Y. TSAI.</surname>
          </string-name>
          (
          <year>1987</year>
          )
          <article-title>"A Versatile Camera Calibration Technique for High-Accuracy 3D Machine Vision Metrology Using Off-the-shelf TV Cameras and Lenses"</article-title>
          , IEEE,
          <source>Journal of Robotics and Automation</source>
          , Vol. RA-
          <volume>3</volume>
          , No.
          <volume>4</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          <string-name>
            <surname>SriRam Thirthala e Marc</surname>
            <given-names>PolleFeys.</given-names>
          </string-name>
          (
          <year>2005</year>
          )
          <article-title>"The Radial Trifocal Tensor: A tool for calibrating the radial distortion of wide-angle cameras"</article-title>
          , IEEE,
          <source>Computer Society Conference on Computer Vision and Pattern Recognition</source>
          <year>2005</year>
          (CVPR
          <year>2005</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          <string-name>
            <surname>David Claus e Andrew W. Fitzgibbon</surname>
          </string-name>
          (
          <year>2005</year>
          )
          <article-title>"A Rational Function Lens Distortion Model for General Cameras"</article-title>
          , IEEE,
          <source>Computer Society Conference on Computer Vision and Pattern Recognition</source>
          <year>2005</year>
          (CVPR
          <year>2005</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          <string-name>
            <surname>Zhengyou Zhang.</surname>
          </string-name>
          (
          <year>2000</year>
          )
          <article-title>"A Flexible New Technique for Camera Calibration"</article-title>
          , IEEE,
          <source>Transactions On Pattern Analysis and Machine Intelligence</source>
          , Vol.
          <volume>22</volume>
          , No.
          <volume>11</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          <string-name>
            <surname>Brown</surname>
            ,
            <given-names>D. C.</given-names>
          </string-name>
          (
          <year>1966</year>
          ).
          <article-title>“Decentering distortion of lenses”</article-title>
          .
          <source>Photometric Engineering</source>
          ,
          <volume>32</volume>
          (
          <issue>3</issue>
          ),
          <fpage>444</fpage>
          -
          <lpage>462</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          <string-name>
            <surname>Brown</surname>
            ,
            <given-names>D. C.</given-names>
          </string-name>
          (
          <year>1971</year>
          ) “
          <article-title>Close-range camera calibration”</article-title>
          . Photogrammetric Engineering, v.
          <volume>37</volume>
          , n. 8, p.
          <fpage>855</fpage>
          -
          <lpage>866</lpage>
          ,
          <year>1971</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          <string-name>
            <surname>De Villiers</surname>
            ,
            <given-names>J. P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Leuschner</surname>
            ,
            <given-names>F. W.</given-names>
          </string-name>
          , &amp;
          <string-name>
            <surname>Geldenhuys</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          (
          <year>2008</year>
          , November).
          <article-title>"Centi-pixel accurate real-time inverse distortion correction"</article-title>
          .
          <source>Na International Symposium on Optomechatronic Technologies</source>
          (pp.
          <fpage>726611</fpage>
          -
          <lpage>726611</lpage>
          ).
          <source>International Society for Optics and Photonics.</source>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          <string-name>
            <surname>Gribbon</surname>
            ,
            <given-names>K. T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Johnston</surname>
            ,
            <given-names>C. T.</given-names>
          </string-name>
          , &amp;
          <string-name>
            <surname>Bailey</surname>
            ,
            <given-names>D. G.</given-names>
          </string-name>
          (
          <year>2003</year>
          ,
          <article-title>November). A real-time FPGA implementation of a barrel distortion correction algorithm with bilinear interpolation</article-title>
          .
          <source>In Image and Vision</source>
          Computing New Zealand (pp.
          <fpage>408</fpage>
          -
          <lpage>413</lpage>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          <string-name>
            <surname>Ojanen</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          (
          <year>2001</year>
          ).
          <article-title>“Automatic correction of lens distortion by using digital image processing</article-title>
          ”,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>