// OpticalFlow.cpp: implementation of the COpticalFlow class. // ////////////////////////////////////////////////////////////////////// #include "OpticalFlow.h" #include "Vector.h" #include "PMImage.h" #include #include #include ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// COpticalFlow::COpticalFlow() { OF = new CVector *[1]; OF[0] = new CVector[1](); SizeX = 1; SizeY = 1; printf("COpticalFlow class (new opticalflow): succesfull...\n"); } COpticalFlow::~COpticalFlow() { } COpticalFlow::COpticalFlow(int sx, int sy) { OF = new CVector *[sx]; for (int i = 0; i < sx; i ++) OF[i] = new CVector[sy](); SizeX = sx; SizeY = sy; //joke //for (i = 0; i < sx;i++){ // for (int j = 0; j< sy;j++){ // OF[i][j].SetX((i * j) %5); // OF[i][j].SetY((i * j) %6); // } //} //joke printf("COpticalFlow class (new opticalflow %d x %d): succesfull...\n", sx, sy); } int COpticalFlow::GetSizeX() { return SizeX; } int COpticalFlow::GetSizeY() { return SizeY; } CVector COpticalFlow::GetXY(int x, int y) { if (x>=0 && y>= 0 && x < SizeX && y < SizeY) { return OF[x][y]; }else{ return CVector(); } } COpticalFlow::SetXY(int x, int y, int sx, int sy) { if (x>=0 && y>= 0 && x < SizeX && y < SizeY) { OF[x][y].SetX(sx); OF[x][y].SetY(sy); } } int COpticalFlow::SaveToFile(char *FileName, int Rate, int Min) { CPMImage *img; img = new CPMImage(SizeX, SizeY); int x1, x2, y1, y2; double dx, tmp1; int i; for(int xir=0; xir=(Min*Min)){ //A vektor végére egy pötty img->SetPixel(x2+1,y2, 0xFFFFFF); img->SetPixel(x2-1,y2, 0xFFFFFF); img->SetPixel(x2,y2+1, 0xFFFFFF); img->SetPixel(x2,y2-1, 0xFFFFFF); if (x2csökkenő(lejtő) if (y1>y2){ //2 kib** eset 45foknál meredekebb-e? if ((x2-x1)<(y1-y2)){//1.eset if ((y1-y2)!=0){ dx= double(x2-x1)/double(y1-y2); }else{ dx= 0.0; } //dx megvan tmp1=double(x2); for (i=y2; i<=y1;i++){ img->SetPixel(int(tmp1), i, 0xFFFFFF); tmp1-= dx; } }else{//2. eset if ((x1-x2)!=0){ dx= double(y2-y1)/double(x1-x2); }else{ dx= 0.0; } //dx megvan tmp1=double(y2); for (i=x2; i>=x1;i--){ img->SetPixel(i,int(tmp1), 0xFFFFFF); tmp1+= dx; } } }else{ //emelkedő if ((x2-x1)<(y2-y1)){// if ((y1-y2)!=0){ dx= double(x2-x1)/double(y2-y1); }else{ dx= 0.0; } //dx megvan tmp1=double(x1); for (i=y1; i<=y2;i++){ img->SetPixel(int(tmp1), i, 0xFFFFFF); tmp1+= dx; } }else{//4.eset if ((x1-x2)!=0){ dx= double(y2-y1)/double(x2-x1); }else{ dx= 0.0; } //dx megvan tmp1=double(y1); for (i=x1; i<=x2;i++){ img->SetPixel(i,int(tmp1), 0xFFFFFF); tmp1+= dx; } } } } } } char Kind; Kind = FileName[strlen(FileName)-2]; switch (Kind){ case 'g':{ img->SaveToPGMFile(FileName); } break; case 'p':{ img->SaveToPPMFile(FileName); } break; default: break; } return 1; } int COpticalFlow::GetXY_X(int x, int y) { if (x>=0 && y>= 0 && x < SizeX && y < SizeY) { return OF[x][y].GetX(); }else{ return 0; } } int COpticalFlow::GetXY_Y(int x, int y) { if (x>=0 && y>= 0 && x < SizeX && y < SizeY) { return OF[x][y].GetY(); }else{ return 0; } } int COpticalFlow::SaveToColorFile(char *FileName, int KindOf) { int color; CPMImage *img; img = new CPMImage(SizeX, SizeY); if (KindOf == 1){ for(int xir=0; xirSetPixel(xir, yir, color); } } }else if(KindOf == 2){ //count the average int avg=0; int max = -SizeX-SizeY; for(int xir=0; xir max){ max = color; } avg += color; } } avg /= (2*SizeX*SizeY); int treshold = max/2; for( xir=0; xir= treshold){ img->SetPixel(xir, yir, 0xFFFFFF); }else{ img->SetPixel(xir, yir, 0); } } } img->Opening(6); img->Closing(6); } char Kind; Kind = FileName[strlen(FileName)-2]; switch (Kind){ case 'g':{ img->SaveToPGMFile(FileName); } break; case 'p':{ img->SaveToPPMFile(FileName); } break; default: break; } return 1; } int COpticalFlow::SaveToOFFile(char* FileName) { FILE *out; if ((out = fopen(FileName, "w"))==NULL) { printf("CPMImage class (PGM file create error): fail...\n"); return 0; }else{ fprintf(out, "%d %d\n", unsigned int(SizeX),unsigned int (SizeY)); for (int i=0; i