描写関数で線、四角形、円などを描く

gui.png

OpenCVでは描写関数があります。 描写関数を使うことで、

  • 四角形
  • 文字

などを描くことができます。 ここでは、これらの描写方法を説明します。 以降の説明は、MacのXCodeです。OpenCVの部分はWindowsでも同じなので参考になると思います。

GUIの設定

とりあえずプロジェクトを立ちあげて、OpenCVが使えるようにします。 プロジェクト立ち上げから、OpenCVの設定は以下の記事を参照してください。 >>プロジェクト立ち上げからOpenCVの設定まで 次に、GUIを設定していきます。 まず、画面にボタンを5つ設置して、名前を以下のようにつけましょう。

GUI

そしたら、2画面にしてGUIとコードを右クリックでつなげていきます。

GUIとコードをつなげる

ConnectionはAction、TypeはNSButtonとします。そしてNameは

線:LineBtn

四角:BoxBtn

円:CircleBtn

文字:TextBtn

クリア:ClearBtn

とします。するとヘッダーファイルが以下のようになるはずです。

ImageIpl *img_frame;

を追加しておいてください。

ヘッダーファイル

#import <Cocoa/Cocoa.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"

@interface AppDelegate : NSObject {
    IplImage *img_frame;
}

@property (assign) IBOutlet NSWindow *window;
- (IBAction)LineBtn:(NSButton *)sender;
- (IBAction)BoxBtn:(NSButton *)sender;
- (IBAction)CircleBtn:(NSButton *)sender;
- (IBAction)TextBtn:(NSButton *)sender;
- (IBAction)ClearBtn:(NSButton *)sender;

@end

コードをかく

では、コーディングしていきます。AppDelegate.mに以下のようにコードを記入します。

プログラム

#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    cvNamedWindow("window",1); //ウインドウを表示
    img_frame=cvCreateImage(cvSize(400,300),IPL_DEPTH_8U,3);//400x300で深さ8Uのカラー
    cvSet(img_frame,CV_RGB(255,255,255),0); //背景を白で塗る
    cvShowImage("window",img_frame); //img_frameをウインドウに表示
}
-(NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)app{
    cvReleaseImage(&img_frame);//メモリの解放
    cvDestroyWindow("window");  //ウインドウの除去
    return NSTerminateNow;
}

- (IBAction)LineBtn:(NSButton *)sender {
    cvLine(img_frame,cvPoint(10,10),cvPoint(100,200),CV_RGB(0,0,0),1,CV_AA,0);
    cvShowImage("window",img_frame);
}

- (IBAction)BoxBtn:(NSButton *)sender {
    cvRectangle(img_frame,cvPoint(200,180),cvPoint(230,200),CV_RGB(0,0,255),-1,CV_AA,0);
    cvShowImage("window",img_frame);
}

- (IBAction)CircleBtn:(NSButton *)sender {
    cvCircle(img_frame,cvPoint(100,100),20,CV_RGB(255,0,0),3,CV_AA,0);
    cvShowImage("window",img_frame);
}

- (IBAction)TextBtn:(NSButton *)sender {
    CvFont font;
    cvInitFont(&font,CV_FONT_HERSHEY_COMPLEX,1.0f,1.0f,0,1,CV_AA);
    cvPutText(img_frame,"Hello, world!",cvPoint(50,40),&font,CV_RGB(0,255,255));
    cvShowImage("window",img_frame);
}

- (IBAction)ClearBtn:(NSButton *)sender {
    cvSet(img_frame,CV_RGB(255,255,255),0);
    cvShowImage("window",img_frame);
}
@end

解説

実行すると以下のように、ボタンを押すと、線、四角、円、文字が描写され、クリアをおすと消去されます。

線や円などの描写

ボタンを押した際に実行する部分を見てもらえば、プログラムの意味はわかると思います。 以下に使用した命令をまとめておくので参考にしてください。

線の描写

line_typeでは線の描写方法を指定します。以下に指定する値をまとめます。

void cvLine(
CvArr* img,     //描写対象の画像
CvPoint point1, //始点
CvPoint point2, //終点
CvScalar color, //色
int thickness,  //線の太さ
int line_type,  //線の描写法
int shift       //座標の小数点以下のビット数
};

四角の描写

thicknessを負にすると塗りつぶされます。

void cvRectangle(
CvArr* img,      //描写対象の画像
CvPoint point1,  //頂点1
CvPoint point2,  //頂点2
CvScalar color,  //色
int thickness,   //線の太さ
int line_type,   //線の描写法
int shift        //座標の小数点以下のビット数
);

円の描写

void cvCircle(
CvArr* img,       //描写対象の画像
CvPoint center,   //円の中心座標
int radius,       //円の半径
CvScalar color,   //色
int thickness,    //線の太さ
int line_type,    //線の描写法
int shift         //座標の小数点以下のビット数
);

文字の描写

以下の命令でフォントを初期化します。

void cvInitFont(
CvFont* font,      //フォント構造体
int font_face,     //フォントの種類
double hscale,     //水平方向の拡大率
double vscale,     //垂直方向の拡大率
double shear,      //文字の傾き
int thickness,     //文字の太さ
int line_type      //文字の描写法
);

以下の命令でフォントを描写します。

void cvPutText(
CvArr* img,        //描写対象の画像
const char* text,  //出力する文字列
CvPoint org,       //文字の出力位置
constCvFont* font, //フォント構造体
CvScalar color     //色
);

文字の出力位置を左下として出力されます。

一色で塗る

以下の命令で画面を塗りつぶします。

void cvSet(
CvArr* arr,        //値を代入する配列
CvScalar value,    //各要素に代入する値
const CvArr* mask  //マスク
);

著者:安井 真人(やすい まさと)