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.