본문 바로가기

프로그래밍 언어/c++

[C++][open CV] 드래그 하여 관심영역 반전시키기

안녕하세요 오랫만입니다. 그동안 블로그에 글 쓸 만큼 공부도 하지 않아서 뜸했는데 잘 지내 셨나요?

 

관심영역 반전

오늘 해볼것은 C++ opencv를 이용하여서 마우스 클릭을 통해 드래그를하여 그 영역만큼을 반전시키는 것을 해볼것입니다.

또 드래그 영역만큼 새 이미지를 띄우겠습니다.

 그러면 사용자가 얼마만큼 드래그 했는지 알기 편하겠죠??

 

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

string title = "main";
Mat image;
Point p1(0, 0);
Point p2(0, 0);

void showNewImg();


void onMouse(int event, int x, int y, int flags, void * param) {
	switch (event) {
	case EVENT_LBUTTONDOWN : 
		p1.x = x;
		p1.y = y;
		p2.x = x;
		p2.y = y;
		break;
	case EVENT_LBUTTONUP :
		p2.x = x;
		p2.y = y;
		showNewImg();
		
	default:
		break;
	}
	}


int main() {
	image = imread("../image/Lenna.png", IMREAD_COLOR);
	CV_Assert(image.data);

	imshow(title, image);

	setMouseCallback(title, onMouse, 0);
	waitKey();

	return 0;

}

void showNewImg() {//관심영역이 맞는 새로운 윈도우를 표시
	int wdth = p2.x - p1.x;
	int hgt = p2.y - p1.y;
	Rect roi(p1.x, p1.y, wdth, hgt);//관심영역 
	Mat draggedImage = image.clone();//호출 될 때 마다 드래그된 이미지의 깊은 복사
    //클릭시마다 호출이니 클릭마다 반전영역을 중첩시키지 않는다는 뜻입니다.
	Mat newimg = draggedImage(roi);//

	imshow("선택영역", newimg);

	Scalar white(255, 255, 255);
	newimg = white - newimg;
	imshow(title, draggedImage);
}

위 코드는 onMouse 함수에서 마우스를 땐 후에 show하는 함수를 호출시는 방식입니다. 

마우스를 땔 때마다 깊은 복사를 통해 기존 Mat image를 변경하지 않는것이 포인트 입니다.

 

showNewImg함수내에서 저 영역만큼 새로운 이미지에 대한 여러 연산도 가능하겠죠?

 

또 색상반전의 경우 색상의 밝기는0~255로 이루어져 있습니다. 이때 3차원 공간에서 가장 원점과 멀리떨어진 곳 (3차원으로 보면 모서리 부분)이 흰색입니다. 이때 CMY컬러공간은 RGB컬러공간과 보색 관계에 있기 때문에 두 공간사이 변환은 쉽습니다. 8비트 화소에서 흰색이 255이므로 색상 반전을 하려면 빼주면 됩니다.

 

다시 말해 색상반전은 CMY컬러공간으로 바꾸어 주는것으로 생각해주시면 될 것 같습니다.!

 

 

 

 

 

 

감사합니다. 도움이 되셨거나 부족한점이 있다면 댓글로 알려주세요!

'프로그래밍 언어 > c++' 카테고리의 다른 글

비주얼스튜디오 테마 변경하기  (0) 2019.07.16