반응형
이번에 해보고자 하는 것은 빈 스케치 위에 색깔을 선택해서 그 색깔에 맞는 사각형을 스케치 위에 그리는 기능을 구현해볼까 합니다. 먼저, 아래 코드를 이용하기 위해 사용한 이미지입니다.
해당 이미지는 색깔 찍기 위해 사용됩니다.
아래는 openCV 를 활용해서 C++로 구현한 코드
#include <stdio.h>
#include "opencv2/opencv.hpp"
IplImage *img, *img2, *paimg;
CvPoint prepos;
CvScalar color = cvScalar(0,0,0);
CvPoint startPos, endPos;
bool isButton = false;
void onMouseDrawing(int event, int x, int y, int flags, void *param) {
if (event == CV_EVENT_LBUTTONDOWN) {
startPos = cvPoint(x, y);
isButton = true;
cvCopy(img, img2);
}
else if (event == CV_EVENT_LBUTTONUP) {
isButton = false;
endPos = cvPoint(x, y);
cvCopy(img2, img);
cvRectangle(img, startPos, endPos, color, 2);
cvShowImage("My Window", img);
}
if (event == CV_EVENT_MOUSEMOVE && flags == CV_EVENT_FLAG_LBUTTON) {
endPos = cvPoint(x, y);
cvCopy(img2, img);
//cvLine(img, startPos, endPos, color, 3);
cvRectangle(img, startPos, endPos, color, 2);
cvShowImage("My Window", img);
}
}
각 마우스 이벤트 설정해줍니다.
void onMouse(int event, int x, int y, int flags, void *param) {
if (event == CV_EVENT_LBUTTONDOWN) {
color = cvGet2D(paimg, y, x);
}
}
int main(void)
{
paimg = cvLoadImage("img\\palette.bmp");
img = cvCreateImage(cvSize(500,500), 8, 3);
img2 = cvCreateImage(cvSize(500, 500), 8, 3);
cvSet(img, CV_RGB(255, 255,255));
//auto bimg = merge(img, cpimg);
cvShowImage("My Window", img);
cvShowImage("paimg", paimg);
cvSetMouseCallback("paimg", onMouse);
cvSetMouseCallback("My Window", onMouseDrawing);
cvWaitKey();
cvDestroyAllWindows();
cvReleaseImage(&img);
cvReleaseImage(&paimg);
}
결과 영상 :
마우스가 안 보이게 녹화되어서 실제로는 마우스로 옆에 있는 색깔을 찍고 그 색에 맞는 사각형이 마우스의 누르고 끌어당김에 따라 생성되는 영상입니다.
반응형
댓글