opencv 를 이용하여 이미지에 글씨를 써서 디스플레이를 하는 경우가 종종 있었다.
이 와중에 또 출력은 한글과 영어를 둘 다 써야해서 이전에 정리한 방법으로 꾸역꾸역 쓰고 있었다.
이전 방법 : [Function] IplImage 에 한글text 삽입하기 (https://jangjy.tistory.com/60 [살다보니..])
한글을 사용하려면 위 방법을 사용하는 것 말고는 방법을 찾지 못했다.
하지만 이 방식의 경우 구버전의 IplImage를 사용하면서 opencv 버전이 올라가면 점점 사용이 불가능해져
opencv 버전을 강제로 3.4.0 버전을 사용하게 만든 주범이었다.
반대로 putText를 사용하면 폰트 변경은 가능하나 한글 출력이 불가능했고..
DC에 draw 하는 방식 또한 맘에 들지 않았다..
그러다 freetype 이라는 녀석을 이용하여 출력이 가능함을 알고 이와 관련한 내용을 정리.
대부분의 내용은 황선규님의 블로그에 정리된 내용을 참고하였다. (kkokkal.tistory.com/1325)
주요 내용을 정리하자면
- opencv3.2 부터 freetype 모듈을 contrib 프로젝트를 통해 지원했다는것
- 이를 위해서는 freetype과 harfbuzz 라이브러리를 미리 컴파일 한 후 opencv에서 포함하여 재빌드 해야한다는 것.
이 두가지가 주요 골자였다. 추후 재사용을 위해 주요 내용을 메모..
1. freetype 라이브러리 빌드.
freetype 은 폰트 렌더링 라이브러리 라고 한다. 이런 라이브러리도 오늘 처음 알았다..
https://download.savannah.gnu.org/releases/freetype/
여기서 다운로드 받은 후 빌드.
다만 이때 WITH_ZLIB, WITH_BZip2, WITH_PNG 옵션을 Off로 설정하지 않으면 opencv 빌드 단계에서 에러가 발생한다고 한다.
CMake-GUI 로 열었더니 해당 항목이 안보여서 원글에서 사용한대로 명령어를 사용하여 generate 했다.
cmake -DWITH_ZLIB=OFF -DWITH_BZip2=OFF -DWITH_PNG=OFF -G "Visual Studio 14 2015 Win64" [source root path]
INSTALL 빌드 시 C:\Program Files\freetype 에 파일이 복사되므로 generate 된 솔루션은 관리자 권환으로 실행 후 ALL_BUILD와 INSTALL 을 모두 빌드 해준다.
이후 환경변수에 이름은 FREETYPE_DIR, 값은 C:\Program Files\freetype 로 추가
2. Harfbuzz 라이브러리 빌드
이녀석은 오픈타입 텍스트 쉐이핑 엔진이라 한다.. 마찬가지로 다운로드 후 빌드..
https://www.freedesktop.org/software/harfbuzz/release/
이녀석은 CMake-GUI 를 통해 만들었고 HB_HAVE_FREETYPE 옵션만 체크하고 나머지는 기본값으로.
마찬가지로 관리자 권한으로 실행 후 ALL_BUILD와 INSTALL 을 모두 빌드.
INSTALL 결과는 C:\Program Files(x86)\harfbuzz 에 복사되었다.
이후 환경변수 이름은 HARFBUZZ_DIR, 값은 C:\Program Files(x86)\harfbuzz 로 추가
3. opencv 빌드.
opencv / opencv-contrib 를 모두 다운로드 받고 압축 해제
generate 하기 전에 contrib의 모듈 중 freetype 모듈의 CMakeList.txt 파일을 수정.
수정 방법은 https://gist.github.com/UnaNancyOwen/14c72a3f10a46d41c359ab6ea307a1d2 를 참고하여 수정 했다고 했는데 다운로드 받은 opencv 버전에 따라 코드가 조금 다를 수는 있을 것 같다.
나같은 경우도 코드 구조가 약간 달라 맞춰서 수정할까 하다가 황선규님께서 수정하신 내용을 그대로 사
용했다.
EXTRA MODULE PATH 에 contrib\module 경로 추가 해주고.. BUILD_opencv_freetype 체크하고,
BUILD_opencv_world 체크.
generate 후 솔루션은 마찬가지로 ALL_BUILD와 INSTALL 을 모두 빌드
이후 기존의 opencv 와 마찬가지로 include lib 경로 잡고 사용하면 된다.
4. freetype 사용법
#include "opencv2/opencv.hpp"
// freetype 헤더를 추가로 include
#include "opencv2/freetype.hpp"
using namespace cv;
// namespace도 추가해주기
using namespace cv::freetype;
using namespace std;
// FreeType2 객체 선언
Ptr<Freetype2> ft2;
// FreeType2 객체 초기화
ft2 = createFreeType2();
// ft2객체 폰트 불러오기
// 참고 코드에서는 바탕체를 사용했는데 이상하게 정상 동작하지 않았음.
// 원하는 폰트 동작여부 확인하고 사용하자
ft2->loadFontData("c:\\windows\\fonts\\HMFMMUEX.TTC", 0);
// 문자 출력 방법.
// 한글을 사용할때는 u8을 앞에 써서 utf-8 인코딩을 명시해줘야한다.
// 변수에 담긴 한글은 어떻게 처리하는지 조금 더 찾아보고 수정 예정.
ft2->putText(tImg, "한글변환테스트", Point(1300, 400), 20, Scalar(0, 100, 255), -1, LINE_AA, false);
ft2->putText(tImg, u8"u8 한글테스트", Point(1300, 500), 20, Scalar(0, 100, 255), -1, LINE_AA, false);
string st = "English test";
ft2->putText(tImg, st, Point(1300, 600), 20, Scalar(0, 100, 255), -1, LINE_AA, false);
> 출력결과
인코딩 명시하지 않으면 한글은 출력이 제대로 되지 않았다.
또한 변수에 담긴 한글은 어떻게 처리하는지 아직 확인하지 못함..
(원문 댓글에 값을 바로 넣는것은 확인 되나 포맷팅을 사용할 경우 어떻게 쓰는지 테스트 필요. 이는 확인 후 수정 예정.)
21.05.06. 수정. link : jangjy.tistory.com/400
CW2A 기능을 이용하여 간단하게 사용 가능.
한글도 잘 출력 되는것을 확인.
'Programming > OpenCV' 카테고리의 다른 글
OpenCV FileStorage를 이용하여 xml을 읽고 쓰자 (0) | 2020.10.07 |
---|---|
jpeg 파일 디코딩하기. (0) | 2015.11.11 |
unsigned char* 형 버퍼를 IplImage 또는 Mat 으로 변환하기. (0) | 2014.08.18 |
[Function] HoG Destriptor in OpenCV (0) | 2014.01.27 |
[Function] 영상을 회전 시키기 (0) | 2014.01.23 |