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 |