본문 바로가기
IT

[openCV / C++] 색깔 가져와서 사각형 그리기

by 배애앰이 좋아 2021. 1. 4.
반응형

 

이번에 해보고자 하는 것은 빈 스케치 위에 색깔을 선택해서 그 색깔에 맞는 사각형을 스케치 위에 그리는 기능을 구현해볼까 합니다. 먼저, 아래 코드를 이용하기 위해 사용한 이미지입니다.

 

 

해당 이미지는 색깔 찍기 위해 사용됩니다.

아래는 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);
}

 

결과 영상 :

 

 

마우스가 안 보이게 녹화되어서 실제로는 마우스로 옆에 있는 색깔을 찍고 그 색에 맞는 사각형이 마우스의 누르고 끌어당김에 따라 생성되는 영상입니다. 

 

반응형

댓글