27 (10/01/2010)
Rotinas e Programas em C++
para Processamento e Análise de Imagens e Vídeos
I. Instalação e Copyright
1. Definição
A finalidade do ProEikon é fornecer meios para testar rapidamente novos algoritmos de PAIV
(Processamento e Análise de Imagens e Vídeos).
Você também pode fazer programas usando somente a biblioteca OpenCV ou usando somente
as rotinas de FFMPEG.
2.1 Nos trabalhos cientificos (incluindo trabalhos de iniciação científica, trabalhos de formatu-
ra, exercícios-programas de disciplinas, artigos de congressos e revistas) resultantes do uso
desta biblioteca seja feita uma citação de que se utilizou o ProEikon, divulgando o site onde
se encontra o sistema http://www.lps.usp.br/~hae/software. Além disso, envie uma notificação
para mim (hae@lps.usp.br).
2.2 O ProEikon pode ser copiado e distribuído livremente para fins não-comerciais, desde que
o sistema seja distribuído integralmente, nenhum dos seus arquivos seja alterado e o endereço
internet original onde se acha o Sistema-ProEikon seja divulgado:
http://www.lps.usp.br/~hae/software.
1
Para o uso comercial e/ou lucrativo do Sistema-ProEikon (mesmo que seja de apenas um pe-
daço dele), deve entrar em contato comigo: hae@lps.usp.br.
O autor não assume nenhuma responsabilidade por hipotéticos danos que o uso do Sistema-
ProEikon possa causar.
3.1 Dev-C++:
DEV-C++: O compilador DEVCPP/GCC é antigo mas é leve, sem erros conhecidos, amigá-
vel e roda sem problemas em todos os sistemas operacionais testados. O site oficial de DEV-
C++ é http://www.bloodshed.net/
http://www.lps.usp.br/~hae/software/vcredist_x86.exe
OU
http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-
984D-389C36F85647&displaylang=en
2
4. Instalação
4.1 Instalação usando DEVCPP e OpenCV
Tentei facilitar ao máximo a instalação dos programas. Por isso, a instalação deve ser feita
obrigatoriamente no disco rígido C:.
c:\users\nome_do_usuario\appdata\roaming\dev-cpp
4. Se você executou o passo 3 com sucesso, pule este passo e vá direto para passo 5. Se
não conseguiu executar o passo 3, execute o programa Dev-C++. Vá para janela tools
compiler options compiler e acrescente o comando abaixo em “Add the following com-
mands when calling compiler”:
-Wno-deprecated-declarations -O3 -enable-auto-import -Wall
Também acrescente o comando abaixo em “add these commands to the linker command line”:
-lcv110 -lcvaux110 -lcxcore110 -lcxts001 -lffopencv110 -lhighgui110 -lml110
-lmsvcp80 -lmsvcr80 -lvcomp -lproeikon -lavformat -lavcodec -lavutil -
lavdevice -limgpv
3
Agora, vá para janela tools compiler options directories libraries e substitua o conte-
údo pelo diretório “c:\proeikon\bin”, conforme a figura abaixo:
4
Vá para janela tools compiler options directories C++ includes e substitua os diretó-
rios originais pelos diretórios abaixo:
c:\proeikon\opencv
c:\proeikon\lib
c:\proeikon\pvlib
c:\proeikon\ffmpeg
5
5. Acrescente os seguintes diretórios no path:
c:\dev-cpp\bin; c:\proeikon\bin
Em Windows XP, Vista e 7, você deve ir para explorer meu computador proprieda-
des propriedades avançadas variáveis de ambiente e editar path.
Importante 2: No path não pode haver espaços brancos. Caso contrário, os diretórios listados
depois do espaço não serão usados.
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;
c:\dev-cpp\bin;c:\proeikon\bin
6
Agora, basta abrir uma nova janela DOS para que as novas variáveis de ambiente funcionem.
c:\>pv
Se não der erro, os redistribuíveis já estão instalados e Proeikon está pronto para ser usado. Se
der erro de execução, instale:
http://www.lps.usp.br/~hae/software/vcredist_x86.exe
Pronto!
7
4.2 Atualização do ProEikon sem atualizar Dev-C++:
Às vezes, pode ser que uma nova versão do Sistema-ProEikon esteja disponível, sem que o
DEV-C++ tenha mudado de versão. Neste caso, não é necessário reinstalar DEV-C++. Basta
somente descompactar a nova versão de ProEikon???.ZIP no diretório C:\ProEikon mantendo
a estrutura de subdiretórios.
4.3 Utilização do ProEikon num compilador C++ diferente para Windows ou em Linux
8
5. Teste de instalação e uso dos programas
5.1 Bibliotecas incluídas:
9
6. Help
6.1 Para quem não conhece bem a linguagem C/C++, recomendo os seguinte livros e sites:
“B. W. Kernighan, D. M. Ritchie, The C Programming Language, 2nd ed., 1988” para
aprender C.
“B. Stroustrup, The C++ Programming Language, 3rd ed., 1997” para aprender C++.
O site http://www.sgi.com/tech/stl/ que contém "Standard Template Library Programmer's
Guide"
“Help” do antigo compilador Turbo C ++ traz praticamente todas as definições das fun-
ções de C e uma parte das de C++. Esse compilador pode ser obtido gratuitamente de
http://bdn.borland.com/
“Help” do Visual C++ Express (compilador de C++ da Microsoft). Esse compilador pode
ser obtido gratuitamente.
Site http://www.cplusplus.com/doc/tutorial/
Site http://www.cprogramming.com/tutorial.html
6.2 Exemplos de uso do Proeikon podem ser encontrados junto com as transparências dos
meus cursos de processamento de imagens. Em especial, na página:
http://www.lps.usp.br/~hae/apostila
6.3 A biblioteca OpenCV têm help bom que vem junto com o programa de instalação. Se você
instalou OpenCV em c:\opencv, esse help fica localizado em:
file:///C:/OpenCV/docs/index.htm
6.4 A biblioteca FFMPEG tem algum help no site deles, mas não é muito didática.
10
II. Programas-ProEikon1
1. Categorias
O Sistema-ProEikon está dividido em duas partes: Biblioteca-ProEikon e Programas-
ProEikon. A Biblioteca-ProEikon consiste de rotinas para PAIV. Utilizando a Biblioteca-
ProEikon, já foram escritos quase 300 programas para PAIV. Estes programas constituem
Programas-ProEikon. Eles foram classificados em seguintes categorias (nota: novas categorias
foram acrescentadas e este manual está desatualizada).
2. Recipientes
Foram criados “recipientes” que contém vários programas dentro dele. O maior recipiente é
IMG.EXE, que contém todos os programas das categorias de 1 a 13. As categorias 14 a 17
constituem recipientes independentes. Assim os recipientes são:
1
Nota: Este manual é introdutório. O Sistema-ProEikon contém muitas funções e programas não documentadas
neste manual. As notas dos cursos de graduação PSI-2315 e PSI-2316 (Processamento, Análise e Síntese de Ima-
gens I e II) e do curso de pós-graduação PSI-5796 contém muitas outras informações sobre o Sistema-ProEikon e
exemplos de uso.
11
3. Recipiente-IMG
Para chamar Recipiente-IMG, escreva no prompt do DOS:
C:\>img
O Recipiente-IMG responde:
< Recipiente IMG.EXE. Programas para Processamento de Imagens. Hae Yong Kim >
_______________________________________________________________________________
IMG nome - todos os programas de IMG em ordem de nome
IMG categ - todos os programas de IMG em ordem de categoria
IMG BIN - categoria BIN - programas para imagens binarias
IMG GRY - categoria GRY - programas para imagens grayscale
IMG COR - categoria COR - programas para imagens coloridas
IMG BGC - categoria BGC - programas para imagens bin, gray e cor
IMG HLF - categoria HLF - programas halftoning (meio-tom)
IMG SSP - categoria SSP - programas scale-space e region-growing
IMG TMG - categoria TMG - programas para tomografia
IMG WMK - categoria WMK - programas para watermarking
IMG HOU - categoria HOU - programas para transformada de Hough
IMG WSH - categoria WSH - programas para watershed grayscale
IMG GRF - categoria GRF - graficos de funcoes e processamento 1D
IMG SHP - categoria SHP - processamento de shapes (poligonos) fechados
IMG DFT - categoria DFT - FFT, DCT, CONV, XCORR, ACORR, e assemelhados
Nota: Se nao couber na tela, use 'IMG ARGUMENTOS | MORE'
C:\>img categ
C:\>img nome
C:\>img nome_da_categoria
C:\>img nome_do_programa
Por exemplo, considere o programa zoomg (que muda a resolução de uma imagem grayscale).
O comando abaixo amplia a imagem arqent.tga por um fator 2.5 e grava o resultado na ima-
gem arqsai.tga:
12
O arquivo de entrada não precisa ser TGA (pode ser JPG ou TXT). O Sistema-ProEikon des-
cobre automaticamente o tipo de arquivo pelo cabeçalho, sem olhar o sufixo. A imagem de
saída será do tipo TGA, pois foi o sufixo especificado. Se quiser gravar a saída no formato
JPG:
A saída será JPG, qualidade 90 (default). Se quiser especificar uma outra qualidade, por e-
xemplo 75:
A saída será ARQSAI.JPG, qualidade 75. Se quiser gravar a saída num arquivo TXT que pode
ser editada em qualquer editor de textos:
6. Subdiretórios
O diretório C:\ProEikon está subdividido em:
13
3. CGR: Fontes de diversos programas de computação gráfica.
4. COD: Fontes de diversos programas de codificação.
5. DOC: Documentação.
6. EE: Definição das janelas, máscaras e elementos estruturantes.
7. FFMPEG: Arquivos include da biblioteca FFMPEG.
8. FONTS: Alguns fontes de caracteres que podem ser usados no Proeikon.
9. IMG: Fontes de diversos programas escritos utilizando biblioteca IMG.
10.LIB: Programas fontes da Biblioteca-ProEikon. Também contém a biblioteca libimg.a e os
arquivos de include.
11.MLE: Fontes de diversos programas de aprendizagem de máquina.
12.MRI: Fontes de diversos programas para processamento de imagens de ressonância magné-
tica.
13.Opencv: Arquivos include da biblioteca opencv.
14.Paletes: Alguns arquivos de paletes (lista de cores).
15.Prog: Fontes de alguns programas longos.
16.Pvlib: Biblioteca de interface entre Proeikon e Opencv
17.Pvprog: Fontes de programas que usam Proeikon e Opencv.
18.Samples: Contém programas amostras simples.
19.VID: Fontes de programas que usam Proeikon e FFMPEG.
14
III. Biblioteca-ProEikon3
1. Exemplos de uso
Vamos começar a explicação sobre o uso da Biblioteca-ProEikon com alguns exemplos.
Programa1 abaixo cria uma imagem binária 240320, preenche-a com listras verticais, e im-
prime a imagem resultante em “imgbin.bmp”. A declaração IMGBIN a(240,320) cria i-
magem binária 240320. As funções membros a.nl() e a.nc() informam número de li-
nhas e de colunas da imagem a. Valor 0 ou false indica preto. Valor 1 ou true indica
branco.
A imagem binária pode ser impressa em formato BMP (não-compactado 1 bit por pixel) ou
TXT ou PBM (PBM=binário e PBM1=texto). O formato de saída é especificado pelo sufixo
do nome do arquivo. Os formatos TXT e PBM-texto podem ser lidos e editados em qualquer
editor de textos.
// programa1
#include <proeikon>
int main()
{ IMGBIN a(240,320);
for (int l=0; l<a.nl(); l++)
for (int c=0; c<a.nc(); c++)
if (c%5==0) a(l,c)=preto;
else a(l,c)=branco;
imp(a,"imgbin.bmp");
}
3
Este manual é introdutório. O Sistema-ProEikon contém muitas funções e programas não documentadas neste
manual. As notas dos cursos de graduação PSI-2315 e PSI-2316 e do curso de pós-graduação PSI-5796
(http://www.lps.usp.br/~hae/apostila) contém muitas outras informações sobre o Sistema-ProEikon e exemplos
de uso.
15
1.2 Exemplo de IMGGRY
Programa2 abaixo lê a imagem imgbin.bmp criado pelo programa1 e converte-a numa ima-
gem grayscale (esta conversão é automática - basta ler uma imagem binária na classe IMG-
GRY). A Biblioteca-ProEikon detecta automaticamente o formato de imagem de leitura pela
informação de cabeçalho da imagem (não leva em conta o sufixo do arquivo). Os formatos de
imagens “naturalmente” grayscale que podem ser lidos para IMGGRY são: TXT, TGA (não-
compactado 1 byte por pixel com ou sem palette), JPG e PGM (binário ou texto). Outros tipos
de imagens podem ser lidos para IMGGRY com conversão automática (como BMP binária do
exemplo).
16
1.3 Exemplo de IMGCOR
Programa3 abaixo lê a imagem imggry.tga gerada pelo programa2, converte-a numa imagem
colorida, cria dégradé colorido, e grava a imagem resultante em imgcor.jpg qualidade 80.
Os planos de cor R,G e B são acessadas através das funções-membros r(), g() e b().
Uma classe IMGCOR pode ser impressa como TXT, TGA não-compactado 3 bytes por pixel,
JPG e PPM (PPM=binário, PPM1=texto). O formato é especificado pelo sufixo do nome do
arquivo. No caso de JPG, a imagem pode ser gravada com qualidade de 1 (muita compressão,
pouca qualidade) até 99 (pouca compressão, boa qualidade). A qualidade deve ser especifica-
da após o sufixo. Se a qualidade não for especificada, a imagem será gravada com qualidade
90 por default.
//programa3
#include <proeikon>
int main()
{ IMGCOR a;
le(a,"imggry.tga");
for (int l=0; l<a.nl(); ++l)
for (int c=0; c<a.nc(); ++c) {
a(l,c).r()=(5*c)%256;
a(l,c).g()=(10*c)%256;
}
imp(a,"imgcor.jpg80");
}
17
2. Tipos de imagens internas
Estão disponíveis atualmente as seguintes classes de imagens 2D estáticas:
BYTE é um número inteiro de 0 a 255. Ocupa 1 byte. É usado como pixel de IMG-
GRY e constitui cada um dos 3 planos de cores de IMGCOR.
typedef unsigned char BYTE;
SHT é um número inteiro entre -32768 a +32767. Ocupa 2 bytes. É pixel de IMGSHT.
É usado, por exemplo, para definir elemento estruturante de erosão/dilatação para
IMGGRY. O valor -32768 (ou minsht) é usado para indicar ponto que não pertence ao
elemento estruturante.
typedef short SHT;
18
para ym BYTE.
typedef float FLT;
CPX é um número complexo de 8 bytes (4 para parte real e 4 para parte imaginária). É
usado como pixel de IMGCPX. É usado principalmente quando se trabalha com trans-
formada de Fourier.
typedef complex<FLT> CPX;
COR é uma classe composto por 3 BYTES. É usado como pixel de IMGCOR. Pode-se
armazenar cor no sistema RGB ou HSI. Os 3 campos são acessadas como r, g, b ou
como h, s, i. Existem as funções RGB2HSI e HSI2RGB que convertem um sistema de
cor no outro.
class COR { BYTE rv,gv,bv; (...)
Exemplos de uso da COR:
COR a, b(128, 128, 128);
a.r()=23; a.g()=130; a.b()=140;
a.h()=23; a.s()=130; a.i()=140;
a=COR(255,0,0);
19
4. Formatos externos para armazenar imagens
4.1 Funções le e imp
IMGBIN a;
le(a,"imggry.tga"); // thresholding automatica
A função imp identifica o formato de imagem de saída desejada analisando a classe de ima-
gem e o sufixo do nome do arquivo especificado. Por exemplo, pedindo para armazenar uma
IMGGRY num arquivo com sufixo TGA, a imagem será armazenada no formato TGA, 1 byte
por pixel, não-compactada e sem palette:
IMGGRY a;
imp(a,"imggry.tga"); // formato TGA 1 byte/pixel
Por outro lado, pedindo para imprimir uma IMGCOR num arquivo com sufixo TGA, a ima-
gem será armazenada no formato TGA, 3 bytes por pixel, não-compactada e sem palette:
IMGCOR a;
imp(a,"imgcor.tga"); // formato TGA 3 bytes/pixel
IMGCOR a;
imp(a,"imgcor.jpg75"); // imgcor.jpg com qualidade 75
IMGGRY a;
imp(a,"imggry.jpg"); // imggry.jpg com qualidade 90
20
Tipo 2: TGA não-compactado 1 byte/pixel colorido ou grayscale com palette (IMG-
COR e IMGGRY)
Tipo 3: TGA não-compactado colorido 3 bytes/pixel sem palette (IMGCOR)
Tipo 4: BMP não-compactado binário 1 bit/pixel (IMGBIN)
Tipo 21: JPEG/JFIF compactado (IMGGRY e IMGCOR)
PBM (imagem binária), PGM (níveis de cinza) e PPM (colorido), todos binários ou
texto.
O programa PSP consegue ler e escrever todos os formatos acima. Se ProEikon não conseguir
ler uma imagem escrita por PSP é provavelmente porque foi especificado (por você ou por
“default”) um sub-formato não aceito pela Biblioteca-ProEikon (por exemplo, um formato
compactado).
Para facilitar “debug” de programas, e para facilitar edição de imagens pequenas, ProEikon
consegue ler e escrever imagens em formato texto:
Exemplos de imagem binária no formato TXT (os comentários podem estar presentes no ar-
quivo):
3 3 // Tamanho da imagem
1 0 1 /* Valores dos pixels */
0 0 0
1 0 1
1 1 // Linha central, coluna central - opcional
O mesmo arquivo pode ser especificado com “T” e “F”, ou “X” e “.” (no lugar de 1 e 0):
3 3 // Tamanho da imagem
x . x /* Valores dos pixels */
. . .
x . x
1 1 // Linha central, coluna central - opcional
21
min -100 .
1 1 // Opcional
4.4 Formato-IMG
Para formato de imagens não disponíveis comercialmente (em ponto flutuante, complexo, se-
qüência de imagens em ponto flutuante, etc.) a Biblioteca-IMG prevê um formato binário pró-
prio denominado de Formato-IMG, cuja extensão padrão é .IMG. O subtipo de uma imagem
IMG pode ser obtida dando comando type do DOS:
type imagem.img
Tipo 11: IMGSHT para armazenar imagem 2 bytes/pixel inteiro (short int). Cada pixel pode
assumir valores de –32768 a +32767.
Tipo 13: IMGFLT para armazenar imagem 4 bytes/pixel ponto flutuante (float).
Tipo 14: I3DFLT para armazenar imagem 3-D, 4 bytes/pixel ponto flutuante (float).
Tipo 15: IMGCPX para armazenar imagem complexa 8 bytes/ pixel (4 bytes real e 4 bytes i-
maginária).
Tipo 16: I3DSHT para armazenar imagem 3-D, 2 bytes/pixel inteiro.
Os arquivos que podem ser lidos pelo IMG podem ser convertidos em arquivos binários
(BMP tipo 4), níveis-de-cinzas (TGA tipo 1 ou JPG), ou colorido (TGA tipo 3 ou JPG) atra-
vés do comando:
Também aceita os seguinte formatos “analyze” utilizados para processar fMRI 4-D (ressonân-
cia magnética funcional de dimensão 4). Cada imagem analyze é formado por dois arquivos
com extensão HDR (header) e IMG (dado). Observe que o sufixo IMG usado pelo formato
analyze não tem nada a ver com Sistema-IMG. Há muitos programas de processamento de
imagens médicas que conseguem ler este tipo de arquivo, por exemplo, SPM e MRICRO.
Muitos outros formatos de imagens podem ser lidos/escritos usando as rotinas de OpenCV. As
funções de Proeikon que usam rotinas de OpenCV são identificadas por prefixo pv. Assim, as
funções:
void pvLe(IMGGRY& ent, string nome);
void pvImp(IMGGRY& sai, string nome);
void pvLe(IMGCOR& ent, string nome);
void pvImp(IMGCOR& sai, string nome);
22
conseguem ler e escrever (além dos formatos aceitos por Proeikon):
5. Headers da Biblioteca-ProEikon
As funções e classes da biblioteca ProEikon estão divididas de acordo com as suas funções.
Para simplificar a vida do usuário, o cabeçalho <proeikon> inclui todos os arquivos de cabe-
çalho:
#include <proeikon>
#include <imgvideo>
#include <imgpv>
23