Escolar Documentos
Profissional Documentos
Cultura Documentos
3
Escrito por: Lucas Grassano Lattari (llattari@ic.uff.br)
IplImage* img:
Estrutura de dados do tipo imagem utilizada pelo OpenCV. um
struct (registro) da linguagem C que consta de uma srie de
informaes.
typedef struct _IplImage
{
int nSize;
int ID;
int nChannels;
int alphaChannel;
int depth;
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width;
int height;
struct _IplROI *roi;
struct _IplImage *maskROI;
void *imageId;
struct _IplTileInfo *tileInfo;
int imageSize;
char *imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char *imageDataOrigin;
}
IplImage;
//largura da imagem
//altura da imagem
um
um
um
um
um
um
um
//profundidade
if(im->depth == IPL_DEPTH_8U)
printf("Alem disso, possui 8 bits por canal, representados por
inteiro sem sinal (unsigned).\n");
else if(im->depth == IPL_DEPTH_8S)
printf("Alem disso, possui 8 bits por canal, representados por
inteiro com sinal (signed).\n");
else if(im->depth == IPL_DEPTH_16U)
printf("Alem disso, possui 16 bits por canal, representados por
inteiro sem sinal (unsigned).\n");
else if(im->depth == IPL_DEPTH_16S)
printf("Alem disso, possui 16 bits por canal, representados por
inteiro com sinal (signed).\n");
else if(im->depth == IPL_DEPTH_32S)
printf("Alem disso, possui 32 bits por canal, representados por
inteiro com sinal (signed).\n");
else if(im->depth == IPL_DEPTH_32F)
printf("Alem disso, possui 32 bits por canal, representados por
nmero de ponto flutuante (float).\n");
else if(im->depth == IPL_DEPTH_64F)
printf("Alem disso, possui 64 bits por canal, representados por
nmero de ponto flutuante (float).\n");
//desaloca a imagem
cvReleaseImage(&im);
//para o aplicativo no encerrar enquanto uma tecla no for pressionada
cvWaitKey(0);
return 0;
//nome da imagem
string filename = "lena.bmp";
//carrega imagem dentro da estrutura de dados imagem
IplImage* im = cvLoadImage(filename.c_str());
//ponteiro para as cores da imagem
unsigned char* colorData = (unsigned char*)im->imageData;
//para cada pixel da imagem carregada
for(int i = 0 ; i < im->width * im->height * 3 ; i += 3)
{
//para cada coordenada RGB, se um determinado canal estiver com
tom acima de 100
if(colorData[i] > 100 || colorData[i + 1] > 100 || colorData[i +
2] > 100)
{
//transformar pixel em branco
colorData[i]
= 255;
colorData[i + 1]
= 255;
colorData[i + 2]
= 255;
}else
{
//transformar pixel em preto
colorData[i]
= 0;
colorData[i + 1]
= 0;
colorData[i + 2]
= 0;
}
}
//cria uma janela
cvNamedWindow("Principal", CV_WINDOW_AUTOSIZE);
//mostra imagem na tela
cvShowImage("Principal", im);
//para o aplicativo no encerrar enquanto uma tecla no for pressionada
cvWaitKey(0);
//libera os recursos usados pela imagem
cvReleaseImage(&im);
return 0;
}
Exemplo. Programa que realiza alguns clculos estatsticos, tais como: mdia,
varincia, histograma de uma imagem colorida.
//necessrios para executar o openCV
#include <opencv.hpp>
using namespace cv;
int main ( int argc, char **argv )
{
//nome da imagem
string filename = "lena.bmp";
//carrega imagem dentro da estrutura de dados imagem
IplImage* im = cvLoadImage(filename.c_str());
*
*
*
histogramaRed[colorData[i + 2]]++;
}
//computa a moda pra cada canal (cor que aparece com mais frequncia)
int modaRed, modaGreen, modaBlue, maiorRed, maiorGreen, maiorBlue;
modaRed = modaGreen = modaBlue = 0;
maiorRed
= histogramaRed[0];
maiorGreen
= histogramaGreen[0];
maiorBlue
= histogramaBlue[0];
for(int i = 1 ; i < 256 ; i++)
{
if(maiorRed < histogramaRed[i])
{
maiorRed
= histogramaRed[i];
modaRed
= i;
}
if(maiorGreen < histogramaGreen[i])
{
maiorGreen
= histogramaGreen[i];
modaGreen
= i;
}
if(maiorBlue < histogramaBlue[i])
{
maiorBlue
= histogramaBlue[i];
modaBlue
= i;
}
}
printf("Moda para cada canal: \n");
printf("Vermelho = %d\n", modaRed);
printf("Verde = %d\n", modaGreen);
printf("Azul = %d\n", modaBlue);
printf("\n");
//cria um arquivo de texto e escreve o histograma
FILE* f = fopen("histograma.txt", "w+");
fprintf(f, "Canal vermelho: \n");
for(int i = 0 ; i < 256 ; i++)
fprintf(f, "%d ", histogramaRed[i]);
fprintf(f, "\n");
fprintf(f, "Canal verde: \n");
for(int i = 0 ; i < 256 ; i++)
fprintf(f, "%d ", histogramaGreen[i]);
fprintf(f, "\n");
fprintf(f, "Canal azul: \n");
for(int i = 0 ; i < 256 ; i++)
fprintf(f, "%d ", histogramaBlue[i]);
fprintf(f, "\n");
//fecha arquivo
fclose(f);
//cria uma janela
cvNamedWindow("Principal", CV_WINDOW_AUTOSIZE);
//mostra imagem na tela
cvShowImage("Principal", im);
//para o aplicativo no encerrar enquanto uma tecla no for pressionada
cvWaitKey(0);