[OpenCV] 도형 그리기 – rectangle, circle, ellipse, polylines

이번 글에서는 OpenCV에서 제공하는 도형 그리기에 대해 알아보겠습니다.

대표적으로 사각형, 원, 타원, 다각형을 그리는 방법을 알아보겠습니다.

사각형

사각형을 그리기 위해서는 rectangle 함수를 사용해야합니다.

/** 
@param img 영상.
@param pt1 사각형 꼭지점 좌표
@param pt2 pt1과 대각선 방향에 있는 꼭지점 좌표
@param rec 사각형 위치
@param color 사각형 색상
@param thickness 사각형 외곽선 두께
@param lineType 사각형 외곽선 타입
@param shift 그리기 좌표값 축소 비율
 */
void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
void rectangle(InputOutputArray img, Rect rec, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);

원을 그리기 위해서는 circle 함수를 사용하면 됩니다.

/**
@param img 영상
@param center 원 중심 좌표
@param radius 원 반지름
@param color 원 색상
@param thickness 원 외곽선 두께
@param lineType 원 외곽선 타입
@param shift 그리기 좌표값 축소비율
 */
void circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
타원

타원을 그리기 위해서 ellipse 함수를 사용하면 됩니다.

/** @
@param img 영상.
@param center 타원 중심
@param axes 타원 반지름
@param angle 타원 회전 각도(x축 기준으로 시계방향)
@param startAngle 타원 시작 각도(x축 기준으로 시계방향)
@param endAngle 타원의 끝 각도(x축 기준으로 시계방향)
@param color 타원 색상
@param thickness 타원 외곽선 두께
@param lineType 타원 외곽선 타입
@param shift 그리기 좌표값 축소 비율
 */
void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
다각형

다각형은 polylines 함수를 사용하면 됩니다.

/**
@param img 영상.
@param pts 다각형 좌표 배열
@param isClosed 다각형이 닫혀있는지에 대한 플래그. true: 첫번째, 마지막 점을 잇는다
@param color 다각형 색상
@param thickness 다각형 외곽선 두께
@param lineType 다각형 외곽선 타입
@param shift 그리기 좌표값 축소 비율
 */
void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0 );

위 모든 함수에 대하여 인자 thickness에 -1을 입력하면 내부를 채웁니다.

샘플 코드

샘플 코드는 아래와 같습니다.

#include "opencv2/opencv.hpp"
#include <iostream>

#ifdef _DEBUG
#pragma comment(lib, "opencv_world440d.lib")
#else
#pragma comment(lib, "opencv_world440.lib")
#endif

using namespace std;
using namespace cv;

int main()
{
	Mat img(512, 512, CV_8UC3, Scalar(255,255,255));
	if (img.empty())
	{
		cerr << "image is empty" << endl;
		return -1;
	}

	// 사각형
	rectangle(img, Point(10, 10), Point(50, 50), Scalar(255, 0, 0), 3);
	rectangle(img, Rect(10, 80, 50, 50), Scalar(0, 255, 0), 5);
	
	// 원
	circle(img, Point(150, 50), 30, Scalar(0, 0, 255), 3);

	// 타원
	ellipse(img, Point(150, 200), Size(40, 40), 30, 90, 270, Scalar(255, 0, 255), -1);

	// 다각형
	vector<Point> pts;
	pts.push_back(Point(250, 250));
	pts.push_back(Point(300, 250));
	pts.push_back(Point(300, 350));
	pts.push_back(Point(350, 350));
	pts.push_back(Point(250, 400));
	polylines(img, pts, true, Scalar(0, 0, 0), 3);

	imshow("img", img);

	waitKey();
	destroyAllWindows();

	system("pause");
	return 0;
}

출력 결과는 아래와 같습니다.