author | peter_k
<peter_k> 2005-06-28 21:18:59 UTC |
committer | peter_k
<peter_k> 2005-06-28 21:18:59 UTC |
parent | 077233dd6e5b9e9737ee6093b6b688e35e59c6f6 |
poprecog/poprecog.c | +219 | -61 |
diff --git a/poprecog/poprecog.c b/poprecog/poprecog.c index 66cf6f5..14cf33f 100644 --- a/poprecog/poprecog.c +++ b/poprecog/poprecog.c @@ -14,6 +14,7 @@ /* Header files */ #include <stdio.h> #include <stdlib.h> +#include <time.h> #include <strings.h> #include <dirent.h> //#include <qsort.h> @@ -50,6 +51,8 @@ int imagesNumber; BITMAP *screenShot, *transparentScreenShot, *DEBUGScreenShot; +int DEBUGY = 0; + struct sDirInfo { char dirName[16]; @@ -66,13 +69,17 @@ typedef struct sRecognized int imageID; int posX, posY; int goodPixels; + int layer; + int pixelsNumber; int upperLayers; int goodPixelsPercent; int ownedPixels; // for recognizeMap } tRecognized; tRecognized recognized[MAX_RECOGNIZED_ITEMS]; int recognizedNumber; +int totalNumberOfRecognizedImages; +int actualLayer; int recognizeMap[320][200]; // here are stored information which 'recognize result' have this pixel int layerOrder[MAX_RECOGNIZED_ITEMS]; // for bitmap recognizing @@ -113,7 +120,7 @@ int cmptImage(void *a, void *b) return 0; } -int cmptRecognized(void *a, void *b) +/*int cmptRecognized(void *a, void *b) { register int pxa = ((tRecognized*)(a))->goodPixelsPercent; register int pxb = ((tRecognized*)(b))->goodPixelsPercent; @@ -122,6 +129,35 @@ int cmptRecognized(void *a, void *b) if (pxa<pxb) return 1; return 0; +}*/ + +int cmptRecognized(void *a, void *b) +{ + register int laa = ((tRecognized*)(a))->layer; + register int lab = ((tRecognized*)(b))->layer; + register int pxa = ((tRecognized*)(a))->goodPixels; + register int pxb = ((tRecognized*)(b))->goodPixels; + register int ula = ((tRecognized*)(a))->upperLayers; + register int ulb = ((tRecognized*)(b))->upperLayers; + register int pna = ((tRecognized*)(a))->pixelsNumber; + register int pnb = ((tRecognized*)(b))->pixelsNumber; + /*if (laa>lab) + return -1; + if (laa<lab) + return 1;*/ + if (pxa>pxb) + return -1; + if (pxa<pxb) + return 1; + /*if (ula>ulb) + return 1; + if (ula<ulb) + return -1;*/ + if (pna>pnb) + return -1; + if (pna<pnb) + return 1; + return 0; } inline int findImageOnScreenShotInPosition(int imageID, int posX, int posY) @@ -132,7 +168,8 @@ inline int findImageOnScreenShotInPosition(int imageID, int posX, int posY) register int goodPixels; BITMAP *bitmap = image[imageID].bitmap; register int wPer2 = bitmap->w / 2; - register int hPer2 = bitmap->h / 2; + register int hPer2 = bitmap->h / 2; + int alreadyExist, newRecognized = 0; for (i = 0; i < recognizedNumber; i++) layerOrder[i] = 0; @@ -165,70 +202,95 @@ inline int findImageOnScreenShotInPosition(int imageID, int posX, int posY) return 0; } - recognized[recognizedNumber].upperLayers = 0; + newRecognized = recognizedNumber; + alreadyExist = 0; for (i = 0; i < recognizedNumber; i++) + { + if ((recognized[i].imageID == imageID) && + (recognized[i].posX == posX) && + (recognized[i].posY == posY)) + { + newRecognized = i; + alreadyExist = 1; + break; + } + } + + recognized[newRecognized].upperLayers = 0; + for (i = 0; i < newRecognized; i++) + //if ((layerOrder[i] > 0) && (image[recognized[i].imageID].pixelsNumber > image[imageID].pixelsNumber)) + //if ((layerOrder[i] > 0) && ((recognized[i].layer > actualLayer) || (layerOrder[i] == image[recognized[i].imageID].pixelsNumber))) if (layerOrder[i] > 0) goodPixels += layerOrder[i]; else if (layerOrder[i] < 0) - recognized[recognizedNumber].upperLayers++; - - ///printf("Maybe %s (%d,%d) -> goodPixels = %d (max %d)\n", image[imageID].filePath, posX, posY, goodPixels, image[imageID].pixelsNumber); -// rest(100); + recognized[newRecognized].upperLayers++; if (((goodPixels*100)/image[imageID].pixelsNumber) < dirInfo[image[imageID].dirID].optMinImagePercent) return 0; -// dir[image[imageID].dirID].recognizedNumber++; + + if ((!strcmp(image[imageID].filePath, "pop1swords\\image00714.bmp")) && (posY == 32)) + { + printf("%03d Maybe %s (%d,%d) -> goodPixels = %d (max %d)\n", goodPixels, image[imageID].filePath, posX, posY, goodPixels, image[imageID].pixelsNumber); + rest(200); + } +// dir[image[imageID].dirID].newRecognized++; ///printf("Added!\n"); //return goodPixels; - recognized[recognizedNumber].imageID = imageID; - recognized[recognizedNumber].posX = posX; - recognized[recognizedNumber].posY = posY; - recognized[recognizedNumber].goodPixels = goodPixels; - recognized[recognizedNumber].goodPixelsPercent = (recognized[recognizedNumber].goodPixels*100)/image[imageID].pixelsNumber; - recognized[recognizedNumber].ownedPixels = 0; + recognized[newRecognized].imageID = imageID; + recognized[newRecognized].posX = posX; + recognized[newRecognized].posY = posY; + recognized[newRecognized].goodPixels = goodPixels; + recognized[newRecognized].pixelsNumber = image[imageID].pixelsNumber; + recognized[newRecognized].goodPixelsPercent = (recognized[newRecognized].goodPixels*100)/image[imageID].pixelsNumber; + recognized[newRecognized].ownedPixels = 0; + if (!alreadyExist) recognized[newRecognized].layer = actualLayer; - for (x = 0; x < bitmap->w; x++) + /*for (x = 0; x < bitmap->w; x++) for (y = 0; y < bitmap->h; y++) { value = recognizeMap[posX+x][posY+y]; if ((((short *)bitmap->line[y])[x] != transparentPixel) && (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x])) { - if (value == -1) + if ((value == -1) || (value = newRecognized)) { - recognizeMap[posX+x][posY+y] = recognizedNumber; - recognized[recognizedNumber].ownedPixels++; + recognizeMap[posX+x][posY+y] = newRecognized; + recognized[newRecognized].ownedPixels++; } else if (layerOrder[value] >= 0) { - if (recognized[value].goodPixels < recognized[recognizedNumber].goodPixels) + if (recognized[value].goodPixels < recognized[newRecognized].goodPixels) { recognized[value].ownedPixels--; - recognizeMap[posX+x][posY+y] = recognizedNumber; - recognized[recognizedNumber].ownedPixels++; + recognizeMap[posX+x][posY+y] = newRecognized; + recognized[newRecognized].ownedPixels++; } else - if ((recognized[value].goodPixels == recognized[recognizedNumber].goodPixels) && (recognized[value].upperLayers > recognized[recognizedNumber].upperLayers)) + if ((recognized[value].goodPixels == recognized[newRecognized].goodPixels) && (recognized[value].upperLayers > recognized[newRecognized].upperLayers)) { recognized[value].ownedPixels--; - recognizeMap[posX+x][posY+y] = recognizedNumber; - recognized[recognizedNumber].ownedPixels++; + recognizeMap[posX+x][posY+y] = newRecognized; + recognized[newRecognized].ownedPixels++; } } } } - ///printf("Recognize map result-> %d\n", recognized[recognizedID].ownedPixels); + ///printf("Recognize map result-> %d\n", recognized[recognizedID].ownedPixels); + if (recognized[recognizedNumber].ownedPixels > 0) - { - recognizedNumber++; - dirInfo[image[imageID].dirID].recognizedNumber++; - return recognized[recognizedNumber].ownedPixels; - } + {*/ + if (!alreadyExist) + { + recognizedNumber++; + dirInfo[image[imageID].dirID].recognizedNumber++; + } + return recognized[newRecognized].ownedPixels; + /*} else - return 0; + return 0;*/ } inline int putImageOnRecognizeMap(BITMAP *bitmap, int posX, int posY, int recognizedID) @@ -297,18 +359,52 @@ inline int putImageOnRecognizeMap(BITMAP *bitmap, int posX, int posY, int recogn return recognized[recognizedID].ownedPixels; } -int removeImageFromRecognizeMap(BITMAP *bitmap, int posX, int posY) +inline int putAndCheck(int recognizedID, int posX, int posY) { register int x, y, value; register short transparentPixel = makecol16(0, 0, 0); register short screenShotTransparentPixel = makecol16(255, 0, 255); + BITMAP *bitmap = image[recognized[recognizedID].imageID].bitmap; + int newPixels = 0; + + for (x = 0; x < bitmap->w; x++) + for (y = 0; y < bitmap->h; y++) + { + value = recognizeMap[posX+x][posY+y]; + if ((((short *)bitmap->line[y])[x] != transparentPixel) && + (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x])) + { + if (recognized[value].layer == recognized[recognizedID].layer) return 0; + if ((value == -1) || (value == recognizedID)) + { + recognizeMap[posX+x][posY+y] = recognizedID; + recognized[recognizedID].ownedPixels++; + newPixels++; + } + } + } + + ///printf("Recognize map result-> %d\n", recognized[recognizedID].ownedPixels); + if (newPixels > 0) + return 1; + else + return 0; + //return recognized[recognizedID].ownedPixels; +} + +int removeImageFromRecognizeMap(int recognizedID, int posX, int posY) +{ + register int x, y, value; + register short transparentPixel = makecol16(0, 0, 0); + register short screenShotTransparentPixel = makecol16(255, 0, 255); + BITMAP *bitmap = image[recognized[recognizedID].imageID].bitmap; for (x = 0; x < bitmap->w; x++) for (y = 0; y < bitmap->h; y++) { if ((((short *)bitmap->line[y])[x] != transparentPixel) && (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x])) - recognizeMap[posX+x][posY+y] = -1; + recognizeMap[posX+x][posY+y] = recognizedID; } } @@ -352,7 +448,7 @@ int cutImageFromScreenShot(BITMAP *bitmap, int posX, int posY) int cutImageFromDEBUGScreenShot(BITMAP *bitmap, int posX, int posY) { - register int x, y, c; + register int x, y, c, i; register int transparentPixel = makecol16(0, 0, 0); register int randomColour = makecol16(rand()%256, rand()%256, rand()%256); char buf[100]; @@ -362,8 +458,13 @@ int cutImageFromDEBUGScreenShot(BITMAP *bitmap, int posX, int posY) { if ((((short *)bitmap->line[y])[x] != transparentPixel) && (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x])) - ((short *)DEBUGScreenShot->line[posY+y])[posX+x] = randomColour; + { + ((short *)DEBUGScreenShot->line[posY+y])[posX+x] = randomColour; + } + if ((((short *)bitmap->line[y])[x] != transparentPixel) && (DEBUGY < 1000)) + ((short *)DEBUGScreenShot->line[400+DEBUGY+y+posY])[x+posX] = makecol(255, 0, 255); } + DEBUGY += bitmap->h + 10; //sprintf(buf, "ss_%05d.bmp", rand()%9999); //save_bitmap(buf, actualScreenShot, 0); //rest(500); @@ -542,11 +643,11 @@ void recognizeScreenShot(int screenShotID) char buf[100]; int x, y; int i, j, k, l, tmp; - int layerNumber = 0; - int totalNumberOfRecognizedImages = 0; short transparentPixel = makecol(0, 0, 0); register short screenShotTransparentPixel = makecol(255, 0, 255); int maxPixelsPercent, maxPixelsID; + int TMP = 0; + int recognizedNow, recognizedBefore; //int maxImages, tmp, nrOfRecognizedImages, nrOfRecognizedImagesThisSession; printf("Recognizing %s\n", screenShotList[screenShotID].fileName); @@ -554,8 +655,12 @@ void recognizeScreenShot(int screenShotID) sprintf(buf, "%s\\%s", screenShotsDir, screenShotList[screenShotID].fileName); screenShot = load_bmp(buf, 0); transparentScreenShot = load_bmp(buf, 0); - DEBUGScreenShot = load_bmp(buf, 0); + DEBUGScreenShot = create_bitmap(320, 2000); + clear_to_color(DEBUGScreenShot, makecol(50, 50, 50)); + blit(screenShot, DEBUGScreenShot, 0, 0, 0, 200, 320, 200); + totalNumberOfRecognizedImages = 0; recognizedNumber = 0; + actualLayer = 0; for (i = 0; i < 320; i++) for (j = 0; j < 200; j++) { @@ -564,54 +669,105 @@ void recognizeScreenShot(int screenShotID) for (i = 0; i < dirsNumber; i++) dirInfo[i].recognizedNumber = 0; + recognizedNow = 0; do { - if ((optMaxLayers != 0) && (layerNumber+1 > optMaxLayers)) break; - printf("# Checking layer %d\n", layerNumber); -// i = 0; -// for (y = 0; y < recognizedNumber; y++) -// if (recognized[y].ownedPixels != 0) i++; - i = recognizedNumber; + recognizedBefore = recognizedNow; + recognizedNow = 0; + /* TODO (#1#): delete TMP variable */ + TMP++; + if (TMP > 3) break; + //if ((optMaxLayers != 0) && (layerNumber+1 > optMaxLayers)) break; + + i = recognizedNumber; + printf("# Checking layer %d\n", actualLayer); + //i = 0; + //for (y = 0; y < recognizedNumber; y++) + //if (recognized[y].ownedPixels != 0) i++; + for (x = 0; x < imagesNumber; x++) { - if (dirInfo[image[x].dirID].recognizedNumber < dirInfo[image[x].dirID].optMaxRecognizedNumber) - findImageOnScreenShot(x); + /* TODO (#1#): delete // below */ + //if (dirInfo[image[x].dirID].recognizedNumber < dirInfo[image[x].dirID].optMaxRecognizedNumber) + findImageOnScreenShot(x); } - for (x = 0; x < recognizedNumber; x++) - cutImageFromTransparentScreenShot(image[recognized[x].imageID].bitmap, recognized[x].posX, recognized[x].posY); -// j = 0; -// for (y = 0; y < recognizedNumber; y++) -// if (recognized[y].ownedPixels != 0) j++; + + qsort(recognized, recognizedNumber, sizeof(tRecognized), cmptRecognized); + + /*for (i = 0; i < 320; i++) + for (j = 0; j < 200; j++) + { + recognizeMap[i][j] = -1; + } + recognizedNumber = 0;*/ + for (i = 0; i < 320; i++) + for (j = 0; j < 200; j++) + { + recognizeMap[i][j] = -1; + } + totalNumberOfRecognizedImages = 0; + for (i = 0; i < recognizedNumber; i++) + recognized[i].ownedPixels = 0; + for (i = 0; i < recognizedNumber; i++) + { + //recognized[i].ownedPixels = 0; + if (putAndCheck(i, recognized[i].posX, recognized[i].posY)) + { + totalNumberOfRecognizedImages++; + cutImageFromTransparentScreenShot(image[recognized[i].imageID].bitmap, recognized[i].posX, recognized[i].posY); + removeImageFromRecognizeMap(i, recognized[i].posX, recognized[i].posY); + printf("Hmm %s d%c l%d x%d y%d (OW:%d / GO:%d / TO:%d / UL:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].layer, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, image[recognized[i].imageID].pixelsNumber, recognized[i].upperLayers); + + /*blit(transparentScreenShot, DEBUGScreenShot, 0, 0, 0, 0, 320, 200); + blit(image[recognized[i].imageID].bitmap, DEBUGScreenShot, 0, 0, recognized[i].posX, recognized[i].posY, image[recognized[i].imageID].bitmap->w, image[recognized[i].imageID].bitmap->h); + sprintf(buf, "ss_new_%02d_%03d.bmp", screenShotID, totalNumberOfRecognizedImages); + save_bitmap(buf, DEBUGScreenShot, 0);*/ + } + } + + //j = 0; + //for (y = 0; y < recognizedNumber; y++) + //if (recognized[y].ownedPixels != 0) j++; j = recognizedNumber; - sprintf(buf, "ss_db_%02d_s_%d.bmp", screenShotID, layerNumber); - save_bitmap(buf, transparentScreenShot, 0); +// sprintf(buf, "ss_db_%02d_s_%d.bmp", screenShotID, actualLayer); +// save_bitmap(buf, transparentScreenShot, 0); - layerNumber++; + actualLayer++; + + /* TODO (#1#): delete this two lines below */ + j=1; + i=0; } while (j - i != 0); + //return 13+13; + // for (i = 0; i < 320; i++) // for (j = 0; j < 200; j++) // { // recognizeMap[i][j] = -1; // } - qsort(recognized, recognizedNumber, sizeof(tRecognized), cmptRecognized); totalNumberOfRecognizedImages = 0; for (i = 0; i < recognizedNumber; i++) { if (recognized[i].ownedPixels) { totalNumberOfRecognizedImages++; - printf("Found %s %c %d %d (OW:%d / GO:%d / PR: %d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, recognized[i].goodPixelsPercent, image[recognized[i].imageID].pixelsNumber); - fprintf(outputFile, "Found %s %c %d %d (OW:%d / GO:%d / PR: %d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, recognized[i].goodPixelsPercent, image[recognized[i].imageID].pixelsNumber); + printf("Found %s d%c l%d x%d y%d (OW:%d / GO:%d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].layer, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, image[recognized[i].imageID].pixelsNumber); + fprintf(outputFile, "Found %s d%c l%d x%d y%d (OW:%d / GO:%d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].layer, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, image[recognized[i].imageID].pixelsNumber); - blit(transparentScreenShot, DEBUGScreenShot, 0, 0, 0, 0, 320, 200); + /*blit(transparentScreenShot, DEBUGScreenShot, 0, 0, 0, 0, 320, 200); blit(image[recognized[i].imageID].bitmap, DEBUGScreenShot, 0, 0, recognized[i].posX, recognized[i].posY, image[recognized[i].imageID].bitmap->w, image[recognized[i].imageID].bitmap->h); sprintf(buf, "ss_ds_%02d_%03d.bmp", screenShotID, totalNumberOfRecognizedImages); - save_bitmap(buf, DEBUGScreenShot, 0); - } - } + save_bitmap(buf, DEBUGScreenShot, 0);*/ + + cutImageFromDEBUGScreenShot(image[recognized[i].imageID].bitmap, recognized[i].posX, recognized[i].posY); + } + } + sprintf(buf, "ss_debug_%s.bmp", screenShotList[screenShotID]); + save_bitmap(buf, DEBUGScreenShot, 0); + return 13; for(;;) @@ -932,6 +1088,8 @@ int main(int argc, char *argv[]) int i; long timeBefore, timeAfter; + srand((unsigned int)time((time_t *)NULL)); + allegro_init(); set_color_depth(16); set_color_conversion(COLORCONV_TOTAL);