Manipulação de imagens em OpenGL
O objetivo desta aula é exibir e manipular imagens em OpenGL.
Baixe da página do professor o arquivo com exemplos e descompacte em um diretório. Abra o projeto
Imagens-DEV4.9.8.0.dev.
Se tiver dúvidas de como criar um projeto no DEVCPP, consulte o material da primeira aula de OpenGL.
Caso você esteja usando uma outra versão do DEVCPP, crie um novo projeto como uma aplicação do tipo
Console, em C++ e inclua as diretivas de OpenGL ( -lopengl32 -lglut32 -lglu32 -lglaux ). Note que estas
diretivas não são exatamente as mesmas daquelas usadas em outras aulas. Neste caso, foi adicionada a
biblioteca glaux que permite carregar iamgens BMP.
Antes de executar o programa, é necessário definir onde está a imagem a ser carregada pelo mesmo.
para tanto, abra o fonte ImageTest2.cpp e procure a função void init(void). Dentro desta função há uma
linha onde um método Load é chamado:
r = Image->Load("C:... \\EAGLE.BMP");
Altere esta linha de forma a definir o local onde você colocou sue projeto ao descompactá-lo.
Após a execução do programa, o resultado deve ser semelhante
a este apresentado na figura abaixo.
A Classe ImageClass
Para realizar a carga de uma imagem, o programa acima usar a classe
ImageClass que encapsula as funções de OpenGL para acesso a imagens,
para usar esta classe você deve criar uma instância da classe e carregar uma
imagem da seguinte forma:
// Cria um objeto imagem
Image = new ImageClass();
r = Image->Load("C:\\ .. \\EAGLE.BMP");
if (!r)
{
printf("Imagem não encontrada. Verifique o nome do Arquivo.\n");
printf("Pressione ENTRE para encerrar.");
getchar();
exit(1);
}
else printf ("Imagem carregada!\n");
Você pode ainda, criar uma imagem vazia da seguinte forma:
// Instacia o objeto que irá exibir uma nova imagem
// Caso precise alterar o tamanho da nova imagem, mude os parâmetros
// da construtura, na chamada abaixo. No exemplo a nova imagem é criada
// usando o tamanho da imagem recém carregada de disco
NovaImagem = new ImageClass(Image->SizeX(), Image->SizeY());
// Posiciona a imagem nova ao lado da antiga
NovaImagem->SetPos(Image->SizeX()+10, 0);
• Para acessar os pontos da imagem você pode usar os métodos ReadPixel e
DrawPixel.
Para obter a cor RGB de um pixel x,y na imagem use :
Image->ReadPixel(GLint x, GLint y, unsigned char &r, unsigned char
&g, unsigned char &b)
•
Para alterar a cor RGB de um pixel x,y na imagem use :
Image->DrawPixel(GLint x, GLint y, unsigned char r, unsigned char g,
unsigned char b)
•
Para obter o a Internsidade(Luminosidade) de um ponto use:
i = Image->GetPointIntensity(x,y);
•
•
Exercício 1
Abra o programa-fonte ImageTeste2.cpp e procure entender como funcionam as rotinas init e
ConvertBlackAndWhite.
Pressionando a tecla 2 na execução do programa você consegue observar o resultado da
aplicação da rotina ConvertBlackAndWhite. Veja também a seção 4.1 da página sobre
Imagens.
1 . Crie uma rotina capaz de exibir a imagem de entrada em tons de cinza, conforme a
imagem abaixo. Lembre-se que você pode fazer uma imagem R, G, B em tons de cinza
simplesmente igualando os valores R, G e B iguais a média dos três valores originais.
5.1 Filtros Passa-alta
Trata a curva mantendo trechos de alfa freqüência e eliminando trechos de baixa freqüência
Usado para detectar bordas em imagens
• Algoritmos
• 1)Detectar bordas não horizontais
Para cada ponto (x,y) de uma linha
Se (Cor(x-1,y) - Cor(x,y)) > limiar
Então Gera um ponto na imagem de saída na posição (x,y)
• 2)Detectar bordas não verticais
Para cada ponto (x,y) de uma coluna
Se (Cor(x,y-1) - Cor(x,y)) > limiar
Então Gera um ponto na imagem de saída na posição (x,y)
Exercício 2
Complete a rotina void DetectImageBorders() a fim de detectar as bordas de
uma imagem, como na figura abaixo.
Download

Estrutura de um Programa OpenGL/GLUT