// PMImage.cpp: implementation of the CPMImage class. // ////////////////////////////////////////////////////////////////////// #include "PMImage.h" #include "BackGround.h" #include #include #include ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CPMImage::CPMImage() { FileName = ""; Resolution = 255; printf("CPMImage class (new pixelmap image,filename: %s): succesfull...\n", FileName); } CPMImage::~CPMImage() { } char* CPMImage::GetFileName() { return FileName; } CPMImage::CPMImage(char *LFileName) { //pgm vagy ppm char Kind; Kind = LFileName[strlen(LFileName)-2]; FileName = LFileName; switch (Kind){ case 'g':{ LoadFromPGMFile(LFileName); } break; case 'p':{ LoadFromPPMFile(LFileName); } break; default: break; } } CPMImage::CPMImage(int x, int y) { SizeX = x; SizeY = y; r = new CMatrix(x, y); g = new CMatrix(x, y); b = new CMatrix(x, y); FileName = ""; Resolution = 255; } int CPMImage::LoadFromPGMFile(char *LFileName) { FILE *in; char *P; unsigned char tmp; char buffer[2048]; int Xs, Ys, i; int res; long curpos; if ((in = fopen(LFileName, "r"))==NULL) { printf("CPMImage class (pixelmap image,filename: %s): fail...\n", LFileName); CPMImage(); return 0; } else { fscanf(in, "%s\n", &P); curpos = ftell(in); tmp = fgetc(in); if (tmp==35){ fgets(buffer,2047,in); }else{ fseek(in, curpos-1, 0); } fscanf(in, "%d %d %d", &Xs, &Ys, &res); Resolution = res; r = new CMatrix(Xs, Ys); g = new CMatrix(Xs, Ys); b = new CMatrix(Xs, Ys); SizeX = Xs; SizeY = Ys; for (i=0; i>8), unsigned char((GetPixel(i,j) & 0xFF0000)>>16) ); } } fclose(out); printf("CPMImage class (new PGM file, filename: %s, %d x %d): succesfull...\n", SFileName, SizeX, SizeY); return 1; } } int CPMImage::SaveToPGMFile(char *SFileName) { FILE *out; if ((out = fopen(SFileName, "w"))==NULL) { printf("CPMImage class (PGM file create error): fail...\n"); return 0; }else{ fprintf(out, "P2\n"); fprintf(out, "# Created by PEPE... Visual Motion Detector :)\n"); fprintf(out, "%d %d\n", SizeX, SizeY); fprintf(out, "%d\n", Resolution); for (int i=0; iGetSizeX(), this->GetSizeY()); int r, g, b; for (i=0; i GetSizeX(); i++){ for (j=0; j GetSizeY(); j++){ r=0; g=0; b=0; for (k=-2; k<=2;k++){ for (l=-2; l<=2;l++){ r += this->r->GetXY(i+k, j+l); g += this->g->GetXY(i+k, j+l); b += this->b->GetXY(i+k, j+l); } } r /= 25; g /= 25; b /= 25; tmp->r->SetXY(i, j, unsigned char (r)); tmp->g->SetXY(i, j, unsigned char (g)); tmp->b->SetXY(i, j, unsigned char (b)); } } for (i=0; i GetSizeX(); i++){ for (j=0; j GetSizeY(); j++){ this->r->SetXY(i, j, tmp->r->GetXY(i,j)); this->g->SetXY(i, j, tmp->r->GetXY(i,j)); this->b->SetXY(i, j, tmp->r->GetXY(i,j)); } } return 1; } int CPMImage::Closing(int Rate) { int isOK; CPMImage * tmp; tmp = new CPMImage(this->GetSizeX(), this->GetSizeY()); int i, j, k, l; //dilate for (i=0; i < SizeX; i++){ for (j=0; j < SizeY; j++){ if (this->GetPixel(i,j) == 0xFFFFFF){ for (k=-Rate/2; k <= Rate/2; k++){ for (l=-Rate/2; l <= Rate/2; l++){ tmp->SetPixel(i+k, j+l, 0xFFFFFF); } } } } } for (i=0; i < SizeX; i++){ for (j=0; j < SizeY; j++){ this->SetPixel(i,j,tmp->GetPixel(i,j)); tmp->SetPixel(i,j, 0); } } //erode for (i=0; i < SizeX; i++){ for (j=0; j < SizeY; j++){ isOK = 1; for (k=-Rate/2; k <= Rate/2; k++){ for (l=-Rate/2; l <= Rate/2; l++){ if (this->GetPixel(i+k,j+l) == 0) isOK = 0; } } if (isOK){ tmp->SetPixel(i, j, 0xFFFFFF); }else{ tmp->SetPixel(i, j, 0); } } } for (i=0; i < SizeX; i++){ for (j=0; j < SizeY; j++){ this->SetPixel(i,j,tmp->GetPixel(i,j)); tmp->SetPixel(i,j, 0); } } return 1; } int CPMImage::Opening(int Rate) { int isOK; CPMImage * tmp; tmp = new CPMImage(this->GetSizeX(), this->GetSizeY()); int i, j, k, l; //erode for (i=0; i < SizeX; i++){ for (j=0; j < SizeY; j++){ isOK = 1; for (k=-Rate/2; k <= Rate/2; k++){ for (l=-Rate/2; l <= Rate/2; l++){ if (this->GetPixel(i+k,j+l) == 0) isOK = 0; } } if (isOK){ tmp->SetPixel(i, j, 0xFFFFFF); }else{ tmp->SetPixel(i, j, 0); } } } for (i=0; i < SizeX; i++){ for (j=0; j < SizeY; j++){ this->SetPixel(i,j,tmp->GetPixel(i,j)); tmp->SetPixel(i,j, 0); } } //dilate for (i=0; i < SizeX; i++){ for (j=0; j < SizeY; j++){ if (this->GetPixel(i,j) == 0xFFFFFF){ for (k=-Rate/2; k <= Rate/2; k++){ for (l=-Rate/2; l <= Rate/2; l++){ tmp->SetPixel(i+k, j+l, 0xFFFFFF); } } } } } for (i=0; i < SizeX; i++){ for (j=0; j < SizeY; j++){ this->SetPixel(i,j,tmp->GetPixel(i,j)); tmp->SetPixel(i,j, 0); } } return 1; } int CPMImage::MakeDifference(char *FileName, int Rate, char *OutFileName) { int i, j; CPMImage *tmp; tmp = new CPMImage(FileName); for (i=0; i < this->GetSizeX(); i++){ for (j=0; j < this->GetSizeY(); j++){ if (abs((this->GetPixel(i, j) & 0xff) - (tmp->GetPixel(i, j) & 0xff)) > Rate){ this->SetPixel(i,j , 0xFFFFFF); }else{ this->SetPixel(i,j , 0); } } } this->Opening(3); this->Closing(3); this->SaveToPGMFile(OutFileName); return 1; }