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】
単に、USBカメラのキャプチャ画像がGUI表示されます。
【イメージ2・・・frame】
ターゲット中心の水平ライン上のピクセル輝度をグラフ表示し、着目する部分の輝度を白丸で示します。
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;
}
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】
9.そして、イメージ2と3をANDします。
bitwise_and(frame,img_menu2,frame);
【イメージ4・・・frame】
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】
11.この画像にボタンの画像を重ねます。ボタン上の黒部分が透けて赤色となり照光風に見えます。
予め用意したボタンのjpeg画像が以下です。これを今度はOR演算します。
【イメージ6・・・img_menu1】
12.イメージ5と6をOR演算します。
bitwise_or(frame,img_menu1,frame);
【イメージ7・・・flame】
◎ここまでは、前回ご紹介した画面です、ここから先がImageMagickによる日本語表示追加部分となります。
13.ImageMagickのフレームに日本語テキストを作成します、ダイレクトにopencvのフレームに作成することができないので、まずはImageMagickのフレームで作成し、それをopencvのフレームに変換してから重ねる段取りです。
初期化部分に以下コード
//ImageMagickのフレーム
Image img("640x480","black");//黒色のフレームを作成
img.font("IPA-Pゴシック"); //フォントの設定(もちろん日本語フォント)
Image img("640x480","black");//黒色のフレームを作成
img.font("IPA-Pゴシック"); //フォントの設定(もちろん日本語フォント)
size_t font_size=20;
img.fontPointsize(font_size);
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で漢字を表示します"));
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】
14.あとはイメージ7と8をOR演算して重ねます。
//最前面にオーバーレイする
bitwise_or(frame,img_nihongo,frame);
bitwise_or(frame,img_nihongo,frame);
【イメージ9・・・flame】
15.最後に画面に表示します。
imshow("RFTPi",frame);
おしまい