Escolar Documentos
Profissional Documentos
Cultura Documentos
X
Manoel Vieira Coelho Neto
Resumo Esse artigo objetiva mostrar a diferena entre a Verso 1.x e 2.x do OpenCV comparando diferentes
algoritmos para fazer a mesma transformao numa imagem preta de pixeis de 8 bits e apenas um canal de cor.
Todos os arquivos fontes foram escritos em linguagem C++ e compilados com o compilador g++ usando as
diretivas do OpenCV e seus linkadores de biblioteca. O primeiro algoritmo usa OpenCV 1.x, ento as funes
implementadas so funes C puras as funes C puras as quais tm cv antes do nome da funo, enquanto o
segundo usa OpenCV 2.x assim as funes usadas so pertencentes ao namespace cv::. Comparaes so feitas
usando distribuio Gaussiana, uma vez que as blibliotecas de tempo usam o clock da CPU e por causa disso so
imprecisas. Ao modelar como uma distribuio normal, podemos desconsiderar atrasos aleatrios causados por
processos do sistema e aplicaes em segundo plano.
Palavras-chave
Introduo
cv::Mat se encarrega de liberar e deletar da memria o que for necessrio. importante ressaltar
que mesmo que o processo em OpenCV 2.x seja
abstrado no h perda em perfomance em relao ao cdigo em OpenCV 1.x, pelo contrrio, o
desempenho da primeira aplicao em relao
segunda para uma imagem em 720p chega a ser
3ms melhor -demonstrado posteriormente neste
artigo-. Assim, pode-se notar de incio as vantagens de escrever o cdigo em OpenCV 2.x, uma
vez que consome menos linha de cdigo e consequentemente menos tempo de desenvolvimento e
tem um desempenho semelhante ou melhor que o
cdigo em C para obter o mesmo resultado esperado.
O computador usado para os testes foi um
Inspiron 14R, 8gb de RAM e processador i5 de 2
gerao.
2
O cdigo de OpenCV 1.x verifica-se ser um cdigo demasiadamente extenso para criao de uma
imagem e uma unica operao nela. Declara-se
um ponteiro de imagem Ipl e uma struct de cvSize para associar o tamanho da imagem, a esse
ponteiro, ento criar uma imagem e fazer a operao que se deseja. Percebe-se como o acesso a um
elemento dessa matriz de difcil entendimento
primeira vez que se le a linha.
((uchar*)(cvImg->imageData
+ cvImg->widthStep*j1))[i1] =
( char ) ( ( i1 * j1 ) % 256 );
H muito acesso referenciado -> na struct em
que se est trabalhando e no to intuitivo
como deveria ser. Aps a criao da janela que
mostrar a imagem e da mostragem estritamente necessrio destruir tanto a janela como
liberar o ponteiro de imagem para desalocar a
memria usada durante a execuo, como se
oberva nas duas linhas que antecedem o return
do cdigo. [talvez explicar o funcionamento da
ipl seja importante.
Para o cdigo em OpenCV 2.x tem-se um cdigo muito mais enxuto e legvel em relao ao anterior, com menos declaraes e com acessos mais
fceis de entender. As melhorias da verso 1.x
para a 2.x so vsiveis e extremamente agrdaveis.
Assim, basta declarar um objeto da classe Mat
e inicializ-lo usando seu construtor[referenciar]
de acordo com os parmetros disponveis na documentao[referenciar]. O acesso feito como
explicado nessse tutorial[referenciar] do prprio
opencv - e citado como forma mais eficiente de
acessar os elementos de uma cv::Mat -. O processo, em ambos os casos, consiste em multiplicar
o ndice i pelo ndice j da matrix e extrair o mdulo da diviso por 256 associando o resultado
esse pixel de ndice (i,j). O resultado de ambos os cdigos a imagem apresentada abaixo.
2.1
Cdigos utilizados
matplotlib.pyplot as plt
numpy as np
matplotlib.mlab as mlab
math
statistics
with open("timevaluesRESOLp.txt") as f:
lines = f.read().splitlines()
numbers = list(map(float, lines))
mean = statistics.mean(numbers)
variance = statistics.variance(numbers)
sigma = math.sqrt(variance)
x = np.linspace(-0.02, 0.2, 300)
plt.plot(x, mlab.normpdf(x, mean, sigma)/80)
plt.show()
Concluso
Referncias