OpenCV 그리기 함수

image

선 그리기

직선 그리기
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = Line_8, int shift =0);
  • img : 입출력 영상
  • pt1 : 시작점 좌표
  • pt2 : 끝점 좌표
  • color : 선 색상(또는 밝기)
  • thickness : 선 두께
  • lineType : 선 타입 / LINE_4, LINE_8, LINE_AA 중 하나를 지정

image

  • shift : 그리기 좌표 값의 축소 비율

도형 그리기

사각형 그리기
void rectangle(InputOutputArray img, Rect rec, const Scalar& color, int thickness = 1, int lineType = Line_8, int shift =0);
  • img : 입출력 영상
  • rec : 사각형 위치 정보
  • color : 선 색상
  • thickness : 선 두께. 음수(-1)를 지정하면 내부를 채움
  • lineType : 선 타입 / LINE_4, LINE_8, LINE_AA 중 하나를 지정
  • shift : 그리기 좌표 값의 축소 비율
원 그리기
void circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness = 1, int lineType = Line_8, int shift =0);
  • img : 입출력 영상
  • center : 원 중심 좌표
  • radius : 원 반지름
  • color : 선 색상
  • thickness : 선 두께. 음수(-1)를 지정하면 내부를 채움
  • lineType : 선 타입 / LINE_4, LINE_8, LINE_AA 중 하나를 지정
  • shift : 그리기 좌표 값의 축소 비율
다각형 그리기
void circle(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness = 1, int lineType = Line_8, int shift =0);
  • img : 입출력 영상
  • pts : 다각형 외곽선 점들의 집합 (vector )
  • isClosed : true이면 시작점과 끝점을 서로 이움(폐곡선)
  • color : 선 색상
  • thickness : 선 두께. 음수(-1)를 지정하면 내부를 채움
  • lineType : 선 타입 / LINE_4, LINE_8, LINE_AA 중 하나를 지정
  • shift : 그리기 좌표 값의 축소 비율

문자열 출력하기

void putText(InputOutputArray img, const String& text, Point org, int fontFace, double fontScale, Scalar color, int thickness = 1, int lineType = Line_8, bool bottomLeftOrigin = false);
  • img : 입출력 영상
  • text : 출력할 문자열
  • org : 문자열이 출력될 좌측 하단 시작 좌표
  • fontFace : 폰트 종류
  • fontScale : 폰트 크기 지정, 기본 폰트 크기의 배수를 지정
  • color : 문자열 색상
  • thickness : 폰트 두께
  • lineType : 선 타입 / LINE_4, LINE_8, LINE_AA 중 하나를 지정

동영상 출력 예제 프로그램에서 차선을 그리고 프레임 번호를 화면에 출력하는 예제

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

using namespace std;
using namespace cv;

int main()
{
	VideoCapture cap("../../data/test_video.mp4");

	if (!cap.isOpened()) {
		cerr << "Video open failed!" << endl;
		return -1;
	}

	Mat frame;
	while (true) {
		cap >> frame;

		if (frame.empty()) {
			cerr << "Empty frame!" << endl;
			break;
		}

		line(frame, Point(570, 280), Point(0, 560), Scalar(255, 0, 0), 2);
		line(frame, Point(570, 280), Point(1024, 720), Scalar(255, 0, 0), 2); // 파랑색 선 2개 그리기

		int pos = cvRound(cap.get(CAP_PROP_POS_FRAMES)); // 프레임을 받아오고
		String text = format("frame number: %d", pos); // text 변수에 프레임값을 format에 맞게 넣어주고
		putText(frame, text, Point(20, 50), FONT_HERSHEY_SIMPLEX, 
			0.7, Scalar(0, 0, 255), 1, LINE_AA); // text 변수 문자열을 영상에 출력함 Point(20,50) 좌측상단으로부터 오른쪽으로 20 아래로 50 점에서 오른쪽 상단으로 문자열이 출력 됨

		imshow("frame", frame);

		if (waitKey(10) == 27)
			break;
	}

	cap.release();
	destroyAllWindows();
}