안녕하세요 오랫만입니다. 그동안 블로그에 글 쓸 만큼 공부도 하지 않아서 뜸했는데 잘 지내 셨나요?
오늘 해볼것은 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 |
---|