Manipulação
de imagens em
OpenGL
O objetivo desta aula é
exibir e manipular imagens em OpenGL.
Instalação
Copie o
arquivo com exemplos e
descompacte em um diretório.
Se você estiver
usando a versão do DEVCPP que está instalada na sala
122, do LAPRO, abra o projeto Imagens-Lapro122.dev.
Isto deve permitir a compilação correta do
projeto. 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:\\My
Documents\\Doc\\Cg\\Pagina\\Aulas\\OpenGL\\Imagens\\ExemploComImagens\\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âcia
da classe e carregar uma imagem da seguinte forma:
// Cria um objeto imagem
Image = new ImageClass();
r = Image->Load("C:\\My
Documents\\Doc\\Cg\\Pagina\\Aulas\\OpenGL\\Imagens\\ExemploComImagens\\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);
Veja na página sobre imagens (seção 3) o
significado da Intensisdade(ou Luminosidade) de um ponto.
http://www.inf.pucrs.br/~pinho/CG/Aulas/Img/IMG.htm
Exercícios
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 image de entrada em tons de
cinza, conforme a imagem abaixo. Veja na seção 3 da
página
sobre Imagens com isto pode ser feito.
2. Complete
a rotina void
DetectImageBorders()
a fim de detectar as bordas de uma imagem, como na figura abaixo.
Veja
na seção 5.1 da página
sobre Imagens como funciona este algoritmo.
FIM.