DevelopmentTool/OpenCV

[OpenCV] 문자열 출력

유제필 2022. 11. 18. 09:15

openCV에서 영상에 직접 영상 처리 결과 또는 추가적인 정보를 문자열 형태로 나타낼 수 있는 함수를 제공한다.

putText();

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 : 폰트 종류로 cv::HersheyFonts에서 선택 가능
fontScale : 폰트 크기 확대/축소 비율
color : 문자열 색상
thickness : 문자열을 그릴 때 사용할 선 두께
lineType : 선 타입으로 LINE_4, LINE_8, LINE_AA 중 하나를 지정할 수 있다.
bottomLeftOrigin : 이 값이 true이면 영상의 좌측 하단을 원점으로 간주하고, false이면 좌측 상단이 원점이 된다.

putText() 함수는 img 영상의 org 위치에 text로 지정된 문자열을 출력할 수 있다.

사용할 폰트 종류는 fontFace 인자로 설정하고, fontScale 인자로 폰트 크기를 조정할 수 있다.

fontFace 인자에는 HersheyFonts 열거형 상수 값을 지정할 수 있다.

HersheyFonts 열거형 상수
설명
FONT_HERSHEY_SIMPLEX
일반 크기의 산세리프 폰트
FOR_HERSHEY_PLAIN
작은 크기의 산세리프 폰트
FOR_HERSHEY_DUPLEX
일반 크기의 산세리프 폰트 (FONT_HERSHEY_SIMPLEX 보다 복잡한 형태)
FOR_HERSHEY_TRIPLEX
일반 크기의 산세리프 폰트 (FONT_HERSHEY_COMPLEX 보다 복잡한 형태)
FONT_HERSHEY_COMPLEX_SMALL
FONT_HERSHEY_COMPLEX 보다 작은 폰트
FONT_HERSHEY_SCRIPT_SIMPLEX
필기체 스타일의 폰트
FONT_HERSHEY_SCRIPT_COMPLEX
필기체 스타일의 폰트(FONT_HERSHEY_SCRIPT_SIMPLEX 보다 복잡한 형태)
FONT_ITALIC
이탤릭체를 위한 플래그

putText() 함수 예제 코드

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

using namespace cv;
using namespace std;

int main()
{
	Mat img(500, 820, CV_8UC3, Scalar(255, 255, 255));

	putText(img, "FONT_HERSHEY_SIMPLEX", Point(20, 50), 
			FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255));

	putText(img, "FONT_HERSHEY_PLAIN", Point(20, 100), 
			FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 255));

	putText(img, "FONT_HERSHEY_DULEX", Point(20, 150), 
			FONT_HERSHEY_DUPLEX, 1, Scalar(0, 0, 255));

	putText(img, "FONT_HERSHEY_COMPLEX", Point(20, 200), 
			FONT_HERSHEY_COMPLEX, 1, Scalar(20, 200));

	putText(img, "FONT_HERSHEY_TRIPLEX", Point(20, 250), 
			FONT_HERSHEY_TRIPLEX, 1, Scalar(255, 0, 0));

	putText(img, "FONT_HERSHEY_COMPLEX_SMALL", Point(20, 300), 
			FONT_HERSHEY_COMPLEX_SMALL, 1, Scalar(255, 0, 255));

	putText(img, "FONT_HERSHEY_SCRIPT_SIMPLEX", Point(20, 350), 
			FONT_HERSHEY_SCRIPT_SIMPLEX, 1, Scalar(0, 255, 255));

	putText(img, "FONT_HERSHEY_SCRIPT_COMPLEX", Point(20, 400), 
			FONT_HERSHEY_SCRIPT_COMPLEX, 1, Scalar(0, 255, 0));

	putText(img, "FONT_HERSHEY_COMPLEX | FONT_ITALIC", Point(20, 450),
			FONT_HERSHEY_COMPLEX | FONT_ITALIC, 1, Scalar(0, 0, 0));

	imshow("img", img);

	waitKey(0);
}
 

마지막 출력 이탤릭체는 FONT_ITALIC폰트는 논리 연산자(|) 를 이용하여 다른 폰트와 함께 사용한다.

getTextSize();

Size getTextSize(const String& text, int fontface, double fontScale, int thickness, int* baseLine);

text : 출력할 문자열
fontFace : 폰트 종류
fontScale : 폰트 크기 확대/축소 비율
thickness : 문자열을 그릴 때 사용할 선 두께
baseLine : (출력) 가장 하단의 텍스트 위치를 기준으로 하는 기준선(baseline)의 y 좌표, 필요 없으면 0 지정
반환값 : 지정할 문자열 출력 시 차지하는 사각형 크기

getTextSize() 함수는 지정한 문자열, 폰트 종류, 폰트 크기 등을 이용하여 문자열을 출력할 때 차지할

사각형 영역 크기 정보를 반환한다.

putText() 함수를 이용하여 특정 위치 좌표에 문자열을 출력하는 경우, 보통 문자열 길이와 크기에 따라

문자열이 차지하는 영역 크기가 달라지기 때문에 문자열이 한쪽으로 치우쳐서 나타날 수 있다.

그때 getTextSize() 함수가 반환하는 문자열 영역 크기 정보를 이용하면 문자열 출력 위치를 적절하게 조절할 수 있다.

getTextSize() 함수 예제 코드

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

using namespace cv;
using namespace std;

int main()
{
	Mat img(200, 640, CV_8UC3, Scalar(255, 255, 255));

	const String text = "Hello, OpenCV";
	int fontFace = FONT_HERSHEY_TRIPLEX;
	double fontScale = 2.0;
	int thickness = 1;

	Size sizeText = getTextSize(text, fontFace, fontScale, thickness, 0);
	Size sizeImg = img.size();

	Point org((sizeImg.width - sizeText.width) / 2, (sizeImg.height + sizeText.height) / 2);
	
	putText(img, text, org, fontFace, fontScale, Scalar(255, 0, 0), thickness);
	rectangle(img, org, org + Point(sizeText.width, -sizeText.height), Scalar(255, 0, 0), 1);

	imshow("img", img);

	waitKey(0);

	destroyAllWindows();
}

 

img.size() 코드를 이용하여 img 영상 크기를 받아 와서 sizeImg 변수에 저장한다.

그러므로 영상의 가로 크기는 sizeImg.width, 세로 크기는 sizeImg.height 형태로 참조할 수 있다.

출력할 문자열이 차지할 영역의 크기는 getTextSize() 함수를 이용하여 sizeText 변수에 저장한다.

영상의 크기와 실제 문자열이 출력된 사각형의 크기를 알기 때문에, 좌표를 계산할 수 있다.

org.x = (sizeImg.width - sizeText.width) / 2

org.y = (sizeImg.height + sizeText.height) / 2

 

'DevelopmentTool > OpenCV' 카테고리의 다른 글

[OpenCV] FileStorage, FileNode 클래스  (0) 2022.11.18
[OpenCV] 이벤트 처리 인터페이스  (0) 2022.11.18
[OpenCV] 도형 그리기  (0) 2022.11.17
[OpenCV] 직선 그리기  (0) 2022.11.17
[OpenCV] VideoWriter 클래스  (0) 2022.11.17