void BFS2::init() { float min_dist = std::numeric_limits<float>::max(); RoadVertexDesc min_v1_desc; RoadVertexDesc min_v2_desc; // テンポラリで、手動でルートを指定 //min_v1_desc = 33; //min_v2_desc = 74; min_v1_desc = 15; min_v2_desc = 5; //findBestRoots(roads1, roads2, min_v1_desc, min_v2_desc); if (tree1 != NULL) delete tree1; if (tree2 != NULL) delete tree2; tree1 = new BFSTree(roads1, min_v1_desc); tree2 = new BFSTree(roads2, min_v2_desc); correspondence = findCorrespondence(roads1, tree1, roads2, tree2); // シーケンスを生成 clearSequence(); for (int i = 0; i <= 20; i++) { float t = 1.0f - (float)i * 0.05f; sequence.push_back(interpolate(t)); } selected = 0; }
int main(int argc, char* argv[]) { if (argc < 2) { printf("./match_image target_point.txt target.pgm [0.pgm ..]\n"); return 1; } SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetCaption("match_image",NULL); char buffer[128]; target_point = fopen(argv[1],"w"); FILE* ppm = fopen(argv[2],"r"); if (!ppm) { printf("%s not found\n",argv[2]); return 1; } fgets(buffer,128,ppm); //P5 or P6 do { fgets(buffer,128,ppm); } while (buffer[0]=='#'); //remove comments char *c = buffer; width = strtol(c,&c,10); height = strtol(c,&c,10); fgets(buffer,128,ppm); //255 screen = SDL_SetVideoMode(width*2,height,24,SDL_SWSURFACE); leftscreen = SDL_CreateRGBSurface(0,width,height,24,0xFF0000,0xFF00,0xFF,0); rightscreen = SDL_CreateRGBSurface(0,width,height,24,0xFF0000,0xFF00,0xFF,0); Image leftimage = {width,height,NULL}; Image rightimage = {width,height,NULL}; leftimage.data = malloc(width*height*3); rightimage.data = malloc(width*height*3); leftrect.x = 0; leftrect.y = 0; leftrect.w = width; leftrect.h = height; rightrect.x = width; rightrect.y = 0; rightrect.w = width; rightrect.h = height; cx = 0.5 * (width-1); cy = 0.5 * (height-1); fread(leftimage.data,1,width*height,ppm); //populate gray level for (int i=width*height;i>=0;i--) { leftimage.data[i*3+2] = leftimage.data[i*3+1] = leftimage.data[i*3] = leftimage.data[i]; } fclose(ppm); Color yellow = {255,255,0}; List matches = {0,8,NULL}; List rectList = {0,8,NULL}; matches.data = malloc(8*sizeof(Match)); rectList.data = calloc(8,sizeof(SDL_Rect)); SDL_Rect* currentRect = rectList.data; imgcpy(leftimage,leftscreen); SDL_BlitSurface(leftscreen,NULL,screen,&leftrect); showRightImage(targetIndex++,&matches,rightimage); SDL_BlitSurface(rightscreen,NULL,screen,&rightrect); SDL_Flip(screen); SDL_Event event; while (true) { while (SDL_PollEvent(&event)) { switch(event.type){ case SDL_KEYDOWN: switch( event.key.keysym.sym ){ case 'b': if (showRightImage(targetIndex--,&matches,rightimage)) { SDL_BlitSurface(rightscreen,NULL,screen,&rightrect); SDL_Flip(screen); } break; case 'n': if (showRightImage(targetIndex++,&matches,rightimage)) { SDL_BlitSurface(rightscreen,NULL,screen,&rightrect); SDL_Flip(screen); } break; case 'm': findCorrespondence(matches,rectList); SDL_BlitSurface(rightscreen,NULL,screen,&rightrect); SDL_Flip(screen); break; case 'v': findCorrespondence(matches,rectList); while (showRightImage(targetIndex++,&matches,rightimage)) { findCorrespondence(matches,rectList); SDL_BlitSurface(rightscreen,NULL,screen,&rightrect); SDL_Flip(screen); } break; default: break; } break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) { mouseDrag = true; previousX = event.button.x; previousY = event.button.y; rectList.size++; } break; case SDL_MOUSEMOTION: if (mouseDrag) { imgcpy(leftimage,leftscreen); *currentRect = getVarRect(previousX,previousY,event.motion.x,event.motion.y); for (int i=0;i<rectList.size;i++) drawRect(leftscreen,((SDL_Rect*)rectList.data)[i],yellow); SDL_BlitSurface(leftscreen,NULL,screen,&leftrect); SDL_Flip(screen); } break; case SDL_MOUSEBUTTONUP: imgcpy(rightimage,rightscreen); SDL_BlitSurface(rightscreen,NULL,screen,&rightrect); if (mouseDrag) { mouseDrag = false; SDL_BlitSurface(rightscreen,NULL,screen,&rightrect); currentRect++; } else { imgcpy(leftimage,leftscreen); SDL_BlitSurface(leftscreen,NULL,screen,&leftrect); currentRect->w = 0; currentRect->h = 0; } SDL_Flip(screen); break; case SDL_QUIT: exit(0); break; } } usleep(1000); } fclose(target_point); free(leftimage.data); free(rightimage.data); }