|
| 1 | +#include <opencv2/opencv.hpp> |
| 2 | +#include "gui.h" |
| 3 | + |
| 4 | +using namespace cv; |
| 5 | + |
| 6 | +void check_pointer(void* ptr) { |
| 7 | + if (ptr == NULL) { |
| 8 | + ERROR("Fatal error: %s\n", SDL_GetError()); |
| 9 | + exit(5); |
| 10 | + } |
| 11 | +} |
| 12 | + |
| 13 | +int gui_window::calibrate() { |
| 14 | + int board_width = 7; |
| 15 | + int board_height = 5; |
| 16 | + double mar = 0.5; |
| 17 | + namedWindow("Video Player");//Declaring the video to show the video// |
| 18 | + VideoCapture cap(0);//Declaring an object to capture stream of frames from default camera// |
| 19 | + if (!cap.isOpened()){ //This section prompt an error message if no video stream is found// |
| 20 | + cout << "No video stream detected" << endl; |
| 21 | + system("pause"); |
| 22 | + return-1; |
| 23 | + } |
| 24 | + cap.set(CAP_PROP_FRAME_WIDTH,1920); |
| 25 | + cap.set(CAP_PROP_FRAME_HEIGHT,1080); |
| 26 | + |
| 27 | + // SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255); |
| 28 | + SDL_SetRenderDrawColor(sdl_renderer, 128, 128, 128, 255); |
| 29 | + SDL_RenderClear(sdl_renderer); |
| 30 | + std::vector<double> check_x, check_y; |
| 31 | + for (int ix = 0; ix<=board_width+1; ix++) check_x.push_back((ix + mar) * window_width / (board_width+1+2*mar)); |
| 32 | + for (int iy = 0; iy<=board_height+1; iy++) check_y.push_back((iy + mar) * window_height / (board_height+1+2*mar)); |
| 33 | + for (int ix = 0; ix<=board_width; ix++) { |
| 34 | + for (int iy = 0; iy<=board_height; iy++) { |
| 35 | + if ((ix+iy) % 2 == 0) { |
| 36 | + SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255); |
| 37 | + } else { |
| 38 | + SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, 255); |
| 39 | + } |
| 40 | + SDL_Rect rect; |
| 41 | + rect.x = check_x[ix]; |
| 42 | + rect.y = check_y[iy]; |
| 43 | + rect.w = check_x[ix+1] - check_x[ix]; |
| 44 | + rect.h = check_y[iy+1] - check_y[iy]; |
| 45 | + SDL_RenderFillRect(sdl_renderer, &rect); |
| 46 | + } |
| 47 | + } |
| 48 | + SDL_RenderPresent( sdl_renderer ); |
| 49 | + |
| 50 | + Mat corners; |
| 51 | + int state = 0; |
| 52 | + while (true) { |
| 53 | + Mat myImage, gray; |
| 54 | + Mat corn; |
| 55 | + cap >> myImage; |
| 56 | + cvtColor(myImage, gray, COLOR_BGR2GRAY); |
| 57 | + bool ret = findChessboardCorners(gray, Size(board_width,board_height), corn); |
| 58 | + if (ret) { |
| 59 | + cornerSubPix(gray, corn, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 30, 0.1)); |
| 60 | + drawChessboardCorners(myImage, Size(board_width,board_height), corn, ret); |
| 61 | + corners = corn; |
| 62 | + state = 2; |
| 63 | + } |
| 64 | + { |
| 65 | + if (state == 1) { |
| 66 | + SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 0, 255); |
| 67 | + } else if (state == 2) { |
| 68 | + SDL_SetRenderDrawColor(sdl_renderer, 0, 255, 0, 255); |
| 69 | + state = 1; |
| 70 | + } else { |
| 71 | + SDL_SetRenderDrawColor(sdl_renderer, 255, 0, 0, 255); |
| 72 | + } |
| 73 | + SDL_Rect rect; |
| 74 | + rect.x = 10; |
| 75 | + rect.y = 10; |
| 76 | + rect.w = 20; |
| 77 | + rect.h = 20; |
| 78 | + SDL_RenderFillRect(sdl_renderer, &rect); |
| 79 | + SDL_RenderPresent( sdl_renderer ); |
| 80 | + } |
| 81 | + |
| 82 | + imshow("Video Player", myImage);//Showing the video// |
| 83 | + char c = (char)waitKey(1);//Allowing 25 milliseconds frame processing time and initiating break condition// |
| 84 | + if (c == 27){ //If 'Esc' is entered break the loop// |
| 85 | + break; |
| 86 | + } |
| 87 | + } |
| 88 | + printf("%d %d\n",(int) corners.size().width,(int) corners.size().height); |
| 89 | + |
| 90 | + |
| 91 | + Size target_size(window_width,window_height); |
| 92 | + std::vector<cv::Point3f> object_points; |
| 93 | + double square_size = target_size.width/(board_width+1); |
| 94 | + for (int i = 0; i < board_height; ++i) { |
| 95 | + for (int j = 0; j < board_width; ++j) { |
| 96 | + object_points.push_back(cv::Point3f(check_x[j+1], check_y[i+1], 0)); |
| 97 | + } |
| 98 | + } |
| 99 | + |
| 100 | + Mat H = findHomography(object_points, corners); |
| 101 | + while (true) { |
| 102 | + Mat myImage, warped_image; |
| 103 | + cap >> myImage; |
| 104 | + warpPerspective(myImage, warped_image, H, target_size,WARP_INVERSE_MAP); |
| 105 | + imshow("Video Player", warped_image);//Showing the video// |
| 106 | + char c = (char)waitKey(1);//Allowing 25 milliseconds frame processing time and initiating break condition// |
| 107 | + if (c == 27){ //If 'Esc' is entered break the loop// |
| 108 | + break; |
| 109 | + } |
| 110 | + } |
| 111 | + |
| 112 | +} |
| 113 | + |
| 114 | + |
| 115 | +gui_window::gui_window(int window_width_, int window_height_, Solver * solver_) : solver(solver_), window_width(window_width_), window_height(window_height_) { |
| 116 | + output("Initializing SDL window\n"); |
| 117 | + // sdl_window = SDL_CreateWindow("Graphical Window", SDL_WINDOWPOS_UNDEFINED_DISPLAY(1), SDL_WINDOWPOS_UNDEFINED_DISPLAY(1), sx, sy, SDL_WINDOW_FULLSCREEN); |
| 118 | + sdl_window = SDL_CreateWindow("Graphical Window", 0, 0, window_width, window_height, 0); |
| 119 | + check_pointer(sdl_window); |
| 120 | + sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); |
| 121 | + check_pointer(sdl_renderer); |
| 122 | + sdl_display = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, window_width, window_height); |
| 123 | + check_pointer(sdl_display); |
| 124 | + //SDL_SetRenderTarget(sdl_renderer, sdl_display); |
| 125 | + |
| 126 | + sdl_surface = SDL_CreateRGBSurface( 0, solver->region.nx, solver->region.ny, 32, |
| 127 | + 0xFF000000, |
| 128 | + 0x00FF0000, |
| 129 | + 0x0000FF00, |
| 130 | + 0x000000FF |
| 131 | + ); |
| 132 | + check_pointer(sdl_surface); |
| 133 | + sdl_texture = SDL_CreateTexture(sdl_renderer,SDL_PIXELFORMAT_ABGR8888, |
| 134 | + SDL_TEXTUREACCESS_STREAMING | SDL_TEXTUREACCESS_TARGET, |
| 135 | + solver->region.nx, solver->region.ny); |
| 136 | + check_pointer(sdl_texture); |
| 137 | + CudaMalloc( &outputBitmap, sizeof(uchar4)*solver->region.sizeL()); |
| 138 | + srcrect.w = solver->region.nx; |
| 139 | + srcrect.h = solver->region.ny; |
| 140 | + srcrect.x = 0; |
| 141 | + srcrect.y = 0; |
| 142 | + |
| 143 | + double sx = (double) window_width / solver->region.nx; |
| 144 | + double sy = (double) window_height / solver->region.ny; |
| 145 | + double s = sx; |
| 146 | + if (sy > s) s = sy; |
| 147 | + dstrect.w = s * solver->region.nx; |
| 148 | + dstrect.h = s * solver->region.ny; |
| 149 | + dstrect.x = 0; |
| 150 | + dstrect.x = (window_width - dstrect.w)/2; |
| 151 | + dstrect.y = (window_height - dstrect.h)/2; |
| 152 | + |
| 153 | + calibrate(); |
| 154 | + |
| 155 | +} |
| 156 | + |
| 157 | +int gui_window::eventloop() { |
| 158 | + SDL_Event event; |
| 159 | + int ret = 0; |
| 160 | + solver->lattice->Color(outputBitmap); // Updating graphics |
| 161 | + SDL_LockSurface(sdl_surface); |
| 162 | + CudaMemcpy(sdl_surface->pixels, outputBitmap, sizeof(uchar4)*solver->region.sizeL(), cudaMemcpyDeviceToHost); |
| 163 | + SDL_UnlockSurface(sdl_surface); |
| 164 | + |
| 165 | + SDL_UpdateTexture(sdl_texture, NULL, sdl_surface->pixels, sdl_surface->pitch); |
| 166 | + |
| 167 | + SDL_SetRenderDrawColor(sdl_renderer, 0, 0, 0, 255); |
| 168 | + SDL_RenderClear(sdl_renderer); |
| 169 | + SDL_RenderCopy(sdl_renderer, sdl_texture, &srcrect, &dstrect); |
| 170 | + SDL_SetRenderDrawColor(sdl_renderer, 255, 255, 255, 255); |
| 171 | + SDL_RenderDrawLine(sdl_renderer, 0, 0, 200, 200); |
| 172 | + SDL_RenderPresent( sdl_renderer ); |
| 173 | + |
| 174 | + while( SDL_PollEvent(&event) ) |
| 175 | + { |
| 176 | + if (event.type == SDL_QUIT) { |
| 177 | + exit(0); |
| 178 | + ret = 1; |
| 179 | + } |
| 180 | + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE) { |
| 181 | + exit(0); |
| 182 | + ret = 1; |
| 183 | + } |
| 184 | + } |
| 185 | + return 0; |
| 186 | +} |
| 187 | + |
| 188 | +gui_window::~gui_window() { |
| 189 | + CudaFree( outputBitmap ); |
| 190 | + output("Killing SDL window\n"); |
| 191 | +} |
| 192 | + |
0 commit comments