1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FreeTypeによるcv::Matへの文字描画機能をOpenCVのモジュールにまとめた(opencv_contrib)

Last updated at Posted at 2016-11-06

どうしたら使いやすいかなーと考えて、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を指定するオプションはお忘れなく。

test.cpp
# 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(起点)で計算してたのでダメでした。

//github.com/Kumataro/opencv_contrib/blob/freetype2/modules/freetype/src/freetype.cpp
                            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を初期化してなかったのでダメでしたね…

//github.com/Kumataro/opencv_contrib/blob/freetype2/modules/freetype/src/freetype.cpp
            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
このファイルの書き方がいろいろ悩んだ…。
結果、こうなりました。

//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点。

  1. pkg-config対応しているならば、pkg_search_module()で対応可否判断できる
  2. include_directoriesを指定する事で、--cflagsオプション相当に必要なインクルードパス追加になる
  3. target_link_librariesに指定する事で、--libsオプション相当に必要なライブラリ追加になる

contrib開発における興味あるモジュールだけコンパイル。

単純にmake -j 8だけだと、他のモジュールのコンパイルも待たされてしまいます。コンパイルが通るか、通らないかの検証とかだけでも待たされるのは非常に嫌ですね・・・ 

make opencv_freetype -j 8 ならば、今開発しているfreetypeだけを再コンパイルするので超早かったです。

(もしかして、これを某アドベンドカレンダーにしてしまえばよかったのでは・・・)

以上でございます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?