[HCI] 06. 마우스 이벤트로 관심영역 지정

조혜정·2021년 10월 9일
1
post-thumbnail

✔ 마우스 이벤트로 관심영역 지정하기

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좌표) 중 작은 값을 갖도록 하였다.

✔ Test Image

lenna.jpg (400 x 400)

profile
ʜʏᴇᴘᴘʏ ᴅᴇᴠ

0개의 댓글