反射望遠鏡の自作状況のブログ

望遠鏡のネタを中心に自作などの状況をご紹介します。

opencvのフレームに漢字を表示する

Raspberry Pi版のRFTの開発作業の続きです。
前回までの段階で、RFTを構築するために必要な基礎技術(パッケージ)の
導入が完了していますが、日本語表示について調べてみました。

opencvでは日本語表示が使えないため別の手段で作成した日本語フレームを重ねて表示する方法、つまりアニメのセル画みたいに構成する方法です。
そこで、別の方法をググって調べたところImageMagickを使って日本語表示を行うことができるとのことで、試した所、実用レベルでの速度が得られました。

その方法を備忘録として残しておきます。

1.ImageMagickの導入
$ sudo apt-get install imagemagick
$ sudo apt-get install libmagick++-6.q16-dev

2.パッケージ導入が完了したらmakefike用のlibパスを調べる
$pkg-config --libs Magick++
-lMagick++-6.Q16 -lMagickWand-6.Q16 -lMagickCore-6.Q16

3.同様にmakefile用のincludeパスを調べる
$pkg-config --cflags Magick++
-fopenmp -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -fopenmp -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -fopenmp -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/include/arm-linux-gnueabihf//ImageMagick-6 -I/usr/include/ImageMagick-6 -I/usr/include/arm-linux-gnueabihf//ImageMagick-6 -I/usr/include/ImageMagick-6 -I/usr/include/arm-linux-gnueabihf//ImageMagick-6 -I/usr/include/ImageMagick-6

4.RFTのmakefileにパスを追加しておく

5.RFTのプログラムでImageMagickが使えるようにする
#include <Magick++.h>
using namespace Magick;

◎以上でImageMagickを使用する準備ができましたので、日本語が表示できるか
試してみます、その前にopencvによるフレーム表示のポイントも書いておきます。

6.opencvでUSBカメラの画像をキャプチャする
Mat frame; //GUIで使うフレーム
namedWindow("RFTPi",1);//ウインドウの名前
moveWindow("RFTPi",0,0);//ウインドウを表示する場所(画面左上)
cap >> frame;//USBカメラより画像をキャプチャしてframeに書き込む

この段階で、imshow("RFTPi",frame);を実行し表示させると以下のイメージ
となります。
【イメージ1・・・frame】
イメージ 1
単に、USBカメラのキャプチャ画像がGUI表示されます。

7.このframeのピクセル情報を読みだして、必要な処理、表示をopencvで行います。frameに上書きしたものがこのイメージです。
【イメージ2・・・frame】
イメージ 2
ターゲット中心の水平ライン上のピクセル輝度をグラフ表示し、着目する部分の輝度を白丸で示します。

      y=zone_cy;
      ptr=frame.ptr<cv::Vec3b>(y);
      for(x=0;x<frame.cols;x++)
      {
          cv::Vec3b bgr=ptr[x];
          lum[x]=bgr[1]*2;
      }

lum[]がピクセル輝度を保存するバッファとなります。

8.この画面にRFTを操作するためのボタンを設けるので、ボタン表示を行う部分を黒塗りします、黒塗りは予め作成したjpeg画像とフレーム間の論理演算でANDします。
予め作成したjpeg画像がこれです、ボタン部分以外は白で作成します。
【イメージ3・・・img_menu2】
イメージ 3

9.そして、イメージ2と3をANDします。
bitwise_and(frame,img_menu2,frame);
【イメージ4・・・frame】
イメージ 4

10.ボタンがアクティブの時には赤色で照光するようにするため、アクティブなボタン部分をopencvで赤で四角く塗りつぶします。
rectangle(frame,Point(575,440),Point(629,465),Scalar(0,0,255),-1,8,0);
ちなみに、opencvはRGB順ではなくBGR順と逆なので赤は(0,0,255)です。
【イメージ5・・・flame】
イメージ 5

11.この画像にボタンの画像を重ねます。ボタン上の黒部分が透けて赤色となり照光風に見えます。
予め用意したボタンのjpeg画像が以下です。これを今度はOR演算します。
【イメージ6・・・img_menu1】
イメージ 6

12.イメージ5と6をOR演算します。
bitwise_or(frame,img_menu1,frame);
【イメージ7・・・flame】
イメージ 7

◎ここまでは、前回ご紹介した画面です、ここから先がImageMagickによる日本語表示追加部分となります。

13.ImageMagickのフレームに日本語テキストを作成します、ダイレクトにopencvのフレームに作成することができないので、まずはImageMagickのフレームで作成し、それをopencvのフレームに変換してから重ねる段取りです。
初期化部分に以下コード
//ImageMagickのフレーム
      Image img("640x480","black");//黒色のフレームを作成
      img.font("IPA-Pゴシック"); //フォントの設定(もちろん日本語フォント)
      size_t font_size=20;
      img.fontPointsize(font_size);

ループ部分に以下コード
//ImageMagickのフレームに日本語表示する
      img.backgroundColor(Color("black"));//背景色を黒色
      img.erase();//フレームを背景色で塗りつぶす(rectangleより速い)
      img.fillColor(Color("white"));//テキストの色を白色に
      sprintf(msg,"%6d漢字",count++);
      img.draw(Magick::DrawableText(100, 100,  msg));
      img.draw(Magick::DrawableText(100, 200,  "ImageMagickで漢字を表示します"));
   
//ImageMagickからOpenCVへフォーマット変換する 
      img.write(0,0,640,480,"BGR",CharPixel,img_nihongo.data);
作成した日本語のフレームが以下です。
【イメージ8・・・img_nihongo】  
イメージ 8

14.あとはイメージ7と8をOR演算して重ねます。
 //最前面にオーバーレイする
      bitwise_or(frame,img_nihongo,frame);
【イメージ9・・・flame】
イメージ 9

15.最後に画面に表示します。
imshow("RFTPi",frame);
イメージ 10

おしまい