이번에 필요에 의해서 ttf 폰트를 외부에서 가져다 써야되는 상황이 발생하였다.
우선 Freetype을 사용하려면, 두가지 라이브러리가 설치되어있어야 한다.
그리고 난 다음 아래의 소스를 이용해여 테스트해보자.
1. 소스
소스에는 특별한 것이 없다. freetype 객체를 선언후 font를 등록하고 사용하기만 하면 된다.
/* Freetype2 Example -
AUTH : makeutil.tistory.com
MENT : requirement - freetype & hardbuzz
*/
#include
#include
#include
using namespace cv;
using namespace std;
using namespace cv::freetype;
//cv::Ptr ft2;
Ptr ft2ext0;
Ptr ft2ext1;
Ptr ft2ext2;
Ptr ft2ext3;
int main(int argc, char** argv)
{
int range_count = 0;
ft2ext0 = createFreeType2(); // Initialization for freetype
ft2ext1 = createFreeType2(); // Initialization for freetype
ft2ext2 = createFreeType2(); // Initialization for freetype
ft2ext3 = createFreeType2(); // Initialization for freetype
ft2ext0->loadFontData("/home/ubuntu/a.ttf",0);
ft2ext1->loadFontData("/home/ubuntu/b.ttf",0);
ft2ext2->loadFontData("/home/ubuntu/c.ttf",0);
ft2ext3->loadFontData("/home/ubuntu/d.ttf",0);
VideoCapture cap("/dev/video0"); // Input = Camera
Mat img_frame;
if (!cap.isOpened()) {
cerr << "ERROR! Unable to open camera\n";
return -1;
}
while(1)
{
cap.read(img_frame); // Capture from camera
if (img_frame.empty()) { // read OK?
cerr << "ERROR! blank frame grabbed\n";
break;
}
// 폰트를 등록
ft2ext0->putText(img_frame,"Font0",Point(100,100),40,Scalar(0,100,255),-1, LINE_AA, false);
ft2ext1->putText(img_frame,"Font1",Point(100,200),40,Scalar(0,100,255),-1, LINE_AA, false);
ft2ext2->putText(img_frame,"Font2",Point(100,300),40,Scalar(0,100,255),-1, LINE_AA, false);
ft2ext3->putText(img_frame,"Font3",Point(100,400),40,Scalar(0,100,255),-1, LINE_AA, false);
imshow("원본 영상", img_frame);
if (waitKey(5) >= 0)
break;
}
return 0;
}
2. 빌드하기
ubuntu@ubuntu:~$ g++ -o freetype freetype.cpp $(pkg-config opencv4 --libs --cflags)
3. 결과화면
예제를 실행하면 아래와 같이 외부 폰트를 이용하여 문자를 출력할 수 있다.
OpenCV에서 한글을 출력하려면 FreeType을 이용해야 되는 경우가 있으니, 익혀두면 도움이 될 것 같다.
* 참고로 OpenCV에서 Freetype사용하려면, libfreetype6-dev와 libhalfbuzz-dev를 설치한 상태에서 opencv를 빌드해야 하므로, apt를 이용해서 우선 관련 패키지를 설치하고 opencv에서 cmake를 통해 빌드 설정을 진행할때 FREETYPE=ON (또는 1)로 설정 후 빌드, 설치 순으로 진행해야 사용할 수 있다는점 기억해 두자.
최근댓글