이번 글에서는 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;
}
출력 결과는 아래와 같습니다.