どうしたら使いやすいかなーと考えて、opencv_contribに新規モジュール追加という形でまとめてみた。
https://github.com/Kumataro/opencv_contrib/tree/freetype2
https://github.com/Kumataro/opencv_contrib/tree/freetype2/modules/freetype
ここからチェックアウトして、contribのコンパイル手順に従ってopencv+contribでコンパイルすれば使えるはず。
最新版とマージしたい場合は、freetypeのフォルダをもっていけばできるはず。
cmakeを実行する際にcontribを指定するオプションはお忘れなく。
# include <opencv2/opencv.hpp>
# include <opencv2/freetype.hpp>
int main(){
cv::freetype::FreeType2 ft2;
ft2.loadFontData("./mplus-1c-thin.ttf", 0);
cv::Mat src = cv::Mat::zeros( 480, 640, CV_8UC3 );
ft2.putText(src, "ABCDEFGHIJKLNMNOPQRSTUVWXYZ", cv::Point( 0, 80), 30, cv::Scalar(0,0,255), -1, CV_AA, true );
}
こんな感じで使えるはず。
性能検証は行っていないが、
小サイズのBITMAP < 小サイズのパス < 大サイズのパス < 大サイズのBITMAP
になるはず。
Thicknessの値がマイナスならばBITMAPになるし、プラスならばその線幅のOutlineになるから、両方ともで使えるようになっている。
前回からの差分
Iに隙間が・・・
なんか"I"の右側空きすぎ問題は、こちらのposに相当する部分のパラメータが違ってましたね…
gPos.xで計算するべきだったのに、org(起点)で計算してたのでダメでした。
if ( ( (cl >> bit) & 0x01 ) == 1 ) {
int pos = gPos.x + col * 8 + (7 - bit);
ptr[ pos ][0] = mColor[0];
ptr[ pos ][1] = mColor[1];
ptr[ pos ][2] = mColor[2];
}
Outlineが変な場所に飛ぶことが…
パラメータdeltaを初期化してなかったのでダメでしたね…
mFn.shift = 0;
mFn.delta = 0;
mFn.move_to = FreeType2::mvFn;
CMakeListsの書き方(FreeType2 依存関係)
https://github.com/Kumataro/opencv_contrib/blob/freetype2/modules/freetype/CMakeLists.txt
このファイルの書き方がいろいろ悩んだ…。
結果、こうなりました。
set(the_description "FreeType module. It enables to draw strings with outlines and bitmaps.")
pkg_search_module(FREETYPE freetype2)
if(NOT FREETYPE_FOUND)
message(STATUS "freetype2: NO")
else()
message(STATUS "freetype2: YES")
include_directories(${FREETYPE_INCLUDE_DIRS})
ocv_define_module(freetype opencv_core opencv_imgproc WRAP python)
target_link_libraries(opencv_freetype ${freetype2_LIBRARIES} )
endif(NOT FREETYPE_FOUND)
pkg-config freetype2 --cflags 相当にするのに、いろいろ試行錯誤しまくりました結果が、こんな感じです。
ポイントは、以下3点。
- pkg-config対応しているならば、pkg_search_module()で対応可否判断できる
- include_directoriesを指定する事で、--cflagsオプション相当に必要なインクルードパス追加になる
- target_link_librariesに指定する事で、--libsオプション相当に必要なライブラリ追加になる
contrib開発における興味あるモジュールだけコンパイル。
単純にmake -j 8
だけだと、他のモジュールのコンパイルも待たされてしまいます。コンパイルが通るか、通らないかの検証とかだけでも待たされるのは非常に嫌ですね・・・
make opencv_freetype -j 8
ならば、今開発しているfreetypeだけを再コンパイルするので超早かったです。
(もしかして、これを某アドベンドカレンダーにしてしまえばよかったのでは・・・)
以上でございます。