What's the question?
왼쪽 마우스를 클릭하고 드래깅하여 마우스를 up하는 순간 영역에 사각형 하나를 그린다. 지정한 사각형을 오른쪽 상단 기준 (10, 10) 떨어진 위치에 원래 크기로 하나 삽입하고, 그 아래에 50% 사이즈로 삽입하라.
Code
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; static bool cropping = false; // right Top에 한 번만 보여주기 위한 변수 static int mx1, my1, mx2, my2; const string WINDOW_TITLE = "Lenna Image"; void onMouse(int event, int x, int y, int flags, void* src) { Mat& img = *(Mat*)src; if (event == EVENT_LBUTTONDOWN) { // 왼쪽 마우스 누르면 처음 좌표 저장 mx1 = x; my1 = y; } else if (event == EVENT_LBUTTONUP) { // 왼쪽 마우스 떼면 끝 좌표 저장 // Exception of boundary exceeded mx2 = min(x, img.cols); my2 = min(y, img.rows); // ROI ractangle int width = mx2 - mx1; int height = my2 - my1; rectangle(img, Rect(mx1, my1, width, height), Scalar(0, 255, 0), 2); if (!cropping) { cropping = true; Mat cropImg(img, Rect(mx1, my1, width, height)); // 관심영역 이미지 Mat smallCropImage = cropImg.clone(); // 작은 관심영역을 위한 복제 // right top ROI origin int px = img.cols - (width) - 10; int py = 10; Mat originRoi = Mat(img, Rect(px, py, width, height)); cropImg.copyTo(originRoi); // right top ROI small width /= 2; px += width; py += height; height /= 2; resize(smallCropImage, smallCropImage, Size(width, height)); height = min(height, img.rows - py); // Exception of boundary exceeded smallCropImage.resize(height); Mat smallRoi = Mat(img, Rect(px, py, width, height)); smallCropImage.copyTo(smallRoi); } } imshow(WINDOW_TITLE, img); } int main() { Mat img = imread("Lenna.jpg", IMREAD_COLOR); if (img.empty()) { cout << "Image not found.\n"; return -1; } imshow(WINDOW_TITLE, img); setMouseCallback(WINDOW_TITLE, onMouse, &img); waitKey(0); return 0; }
실행화면
두 번째 사진처럼 관심 영역에 한 번만 이미지를 넣기 위해 cropping 이라는 변수를 두었다. 예외 처리 1) 마우스 up 좌표가 사진 범위를 벗어날 때, mx2 = min(x, img.cols); my2 = min(y, img.rows); 위의 코드를 통해 마우스 up할 때 좌표와 원래 이미지 width height 중 작은 값을 갖도록 하였다. 예외 처리 2) 관심 영역 크기가 커서 50% 사이즈의 이미지 위치가 원본 이미지 크기를 벗어날 때, height = min(height, img.rows - py); 위의 코드를 추가해 height는 (계산된 height)와 (원본 이미지 height - 50% 이미지 시작 Y좌표) 중 작은 값을 갖도록 하였다.
lenna.jpg (400 x 400)