描画関数

描画関数は,任意のビット深度を持つ行列または画像に対して機能するものです.

形状の境界には,アンチエイリアス処理が施されます(今のところ,8ビット画像に対してのみ実装されています).

すべての関数は,カラー画像に対して RGB 値で表現された色(これは CV_RGB マクロや Scalar() コンストラクタによって作られます)を,グレースケール画像に対して明るさを,それぞれ引数にとります.カラー画像のチャンネルの順序は通常 Blue, Green, Red となります.つまり,これが imshow() , imread()imwrite() などが期待する順序です.

したがって, CvScalar を用いて色を構成する場合は,次のようになります:

\texttt{cvScalar} (blue \_ component, green \_ component, red \_ component[, alpha \_ component])

独自の画像レンダリング関数や入出力関数を利用する場合は,好きなチャンネル順序を用いることができます.描画関数は各チャンネルを個別に処理し,チャンネル順序はもちろん,利用される色空間にも依存しません.また cvtColor() を用いて,画像全体を BGR から RGB や別の色空間に変換することができます.

描画する図形が,画像の外側に部分的にあるいは完全にはみ出す場合,描画関数はそれを切り詰めます.多くの描画関数は,サブピクセル精度で指定された座標を扱うことが可能です.つまり,座標値は固定小数点数として渡されたり,整数にエンコードされたりする可能性があります.小数部分のビット数は,引数 shift によって指定されるので,実数の点座標は \texttt{Point}(x,y)\rightarrow\texttt{Point2f}(x*2^{-shift},y*2^{-shift}) として計算されます.これにより,図形をアンチエイリアス処理された形状として表現することができます.

また,この関数は,アルファ透過をサポートしません.目的画像が4チャンネルである場合でも color[3] には,単に新たなピクセル値がコピーされるだけです.したがって,もし半透明な形状を描画したい場合は,それを別のバッファに描画してから画像とブレンドするとよいでしょう.

cv::Circle

void cvCircle(CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int lineType=8, int shift=0)

円を描きます.

パラメタ:
  • img – 円が描かれる画像
  • center – 円の中心座標
  • radius – 円の半径
  • color – 円の色
  • thickness – 円の枠線の太さ.負の値の場合,円内部が塗りつぶされます
  • lineType – 円を描く線の種類, Line の説明を参照してください
  • shift – 中心点の座標と半径の値において,小数点以下の桁を表すビット数

この関数は,与えられた中心と半径を持つ単純な円,または塗りつぶされた円を描きます.

cv::ClipLine

int cvClipLine(CvSize imgSize, CvPoint* pt1, CvPoint* pt2)

線分が画像矩形内に収まるようにクリッピングします.

パラメタ:
  • imgSize – 画像サイズ
  • pt1 – 線分の1番目の端点. この値は関数によって変更されます
  • pt2 – 線分の2番目の端点. この値は関数によって変更されます

この関数は,与えられた2点を結ぶ線分のうち,画像矩形内に収まる一部分を求めます. 線分が完全に画像の外側にある場合には 0,そうでなければ 1 を返します.

cv::DrawContours

void cvDrawContours(CvArr *img, CvSeq* contour, CvScalar external_color, CvScalar hole_color, int max_level, int thickness=1, int lineType=8)

画像内の外側輪郭線および内側輪郭線を描きます.

パラメタ:
  • img – 輪郭を描画する画像.他の描画関数と同様に,輪郭も ROI 内に収まるようにクリップされます
  • contour – 最初の輪郭へのポインタ
  • external_color – 外側輪郭線の色
  • hole_color – 内側輪郭線(穴)の色
  • max_level – 描画される輪郭の最大レベル.0 の場合, contour のみが描画されます.1 の場合,contourと,それと同レベルの全ての輪郭が描画されます.2 の場合,contourと,それと同レベルと1つ下のレベルの全ての輪郭が描画されます.そして負の値の場合, contour と同レベルの他の輪郭は描画されず,代わりに contour の子ノード輪郭が |\texttt{max\_level}|-1 レベルまで描画されます
  • thickness – 描かれる輪郭線の太さ.この値が負の場合(例えば,=CV _ FILLED),輪郭の内側が塗りつぶされます
  • lineType – 輪郭線の種類, Line の説明を参照してください

この関数は, \texttt{thickness} \ge 0 の場合は,画像内の輪郭線を描き, \texttt{thickness} <0 の場合は,輪郭線の内側を塗りつぶします.

Example: Connected component detection via contour functions

#include "cv.h"
#include "highgui.h"

int main( int argc, char** argv )
{
    IplImage* src;
    // コマンドラインの第 1 引数では,
    // 2 値(白黒)画像のファイル名を指定します.
    if( argc == 2 && (src=cvLoadImage(argv[1], 0))!= 0)
    {
        IplImage* dst = cvCreateImage( cvGetSize(src), 8, 3 );
        CvMemStorage* storage = cvCreateMemStorage(0);
        CvSeq* contour = 0;

        cvThreshold( src, src, 1, 255, CV_THRESH_BINARY );
        cvNamedWindow( "Source", 1 );
        cvShowImage( "Source", src );

        cvFindContours( src, storage, &contour, sizeof(CvContour),
                        CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
        cvZero( dst );

        for( ; contour != 0; contour = contour->h_next )
        {
            CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
            /* 輪郭線を見るには, CV_FILLED を 1 に置き換えてください */
            cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8 );
        }

        cvNamedWindow( "Components", 1 );
        cvShowImage( "Components", dst );
        cvWaitKey(0);
    }
}

cv::Ellipse

void cvEllipse(CvArr* img, CvPoint center, CvSize axes, double angle, double start_angle, double end_angle, CvScalar color, int thickness=1, int lineType=8, int shift=0)

楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.

パラメタ:
  • img – 画像
  • center – 楕円の中心座標
  • axes – 楕円の長径と短径
  • angle – 回転角度
  • start_angle – 円弧の開始角度
  • end_angle – 円弧の終了角度
  • color – 楕円の色
  • thickness – 楕円を描く線の太さ.負の値の場合,扇形内部が塗りつぶされます
  • lineType – 楕円の線の種類, Line の説明を参照してください
  • shift – 中心点の座標と軸長の値において,小数点以下の桁を表すビット数

この関数は,楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.これらは,ROI 内に収まるようにクリッピングされます.アンチエイリアスされた弧や線に太さを持つ弧に対しては,piecewise線形近似が用いられます.すべての角度は「度」単位で与えます.これらのパラメータの意味を以下の図で説明します.

楕円弧のパラメータ

_images/ellipse.png

cv::EllipseBox

void cvEllipseBox(CvArr* img, CvBox2D box, CvScalar color, int thickness=1, int lineType=8, int shift=0)

楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.

パラメタ:
  • img – 画像
  • box – 描画される楕円に外接するボックス領域
  • thickness – 楕円の線の太さ
  • lineType – 楕円の線の種類, Line の説明を参照してください
  • shift – 矩形の頂点座標において,小数点以下の桁を表すビット数

この関数は,楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.これは,別の形状を近似するための楕円,つまり関数 CamShift や関数 FitEllipse などの結果を描く際に便利です.これらは,ROI 内に収まるようにクリッピングされます.また,アンチエイリアスされた弧や線に太さを持つ弧に対しては,piecewise線形近似が用いられます.

cv::FillConvexPoly

void cvFillConvexPoly(CvArr* img, CvPoint* pts, int npts, CvScalar color, int lineType=8, int shift=0)

塗りつぶされた凸ポリゴンを描きます.

パラメタ:
  • img – 画像
  • pts – 1つのポリゴンへのポインタ
  • npts – ポリゴンの頂点数
  • color – ポリゴンの色
  • lineType – ポリゴンを描く線の種類, Line の説明を参照してください
  • shift – ポリゴンの頂点座標において,小数点以下の桁を表すビット数

この関数は,凸ポリゴン内部を塗りつぶします.これは,関数 cvFillPoly よりも高速に動作します.また,凸ポリゴンだけでなく,その輪郭が水平なスキャンラインと2回以下しか交差しないようような単純なポリゴン(モノトーンポリゴン)は全て塗りつぶすことができます.

cv::FillPoly

void cvFillPoly(CvArr* img, CvPoint** pts, int* npts, int contours, CvScalar color, int lineType=8, int shift=0)

塗りつぶされたポリゴンを描きます.

パラメタ:
  • img – 画像
  • pts – 各ポリゴンへのポインタ配列
  • npts – 各ポリゴンの頂点数の配列
  • contours – 塗りつぶし領域を実際に区切る輪郭の個数
  • color – ポリゴンの色
  • lineType – ポリゴンを描く線の種類, Line の説明を参照してください
  • shift – ポリゴンの頂点座標において,小数点以下の桁を表すビット数

この関数は,複数の輪郭で区切られた領域を塗りつぶします.この関数では複雑な領域,例えば領域内に穴を持つものや,自己交差したものなども塗りつぶします.

cv::GetTextSize

void cvGetTextSize(const char* textString, const CvFont* font, CvSize* textSize, int* baseline)

文字列の幅と高さを取得します.

パラメタ:
  • font – フォント構造タイへのポインタ
  • textString – 入力文字列
  • textSize – 取得される文字列のサイズ.ベースラインより下は,文字列の高さには含まれません
  • baseline – 文字列の最下点から見たベースラインのy座標

この関数は,指定されたフォントで描かれた文字列を内包する矩形のサイズを計算します.

cv::InitFont

void cvInitFont(CvFont* font, int fontFace, double hscale, double vscale, double shear=0, int thickness=1, int lineType=8)

フォント構造体を初期化します.

パラメタ:
  • font – この関数によって初期化されるフォント構造タイへのポインタ
  • fontFace

    フォント名の識別子.現在は,Hershey fonts( http://sources.isc.org/utils/misc/hershey-font.txt )の一部のみがサポートされています:

    • CV_FONT_HERSHEY_SIMPLEX 普通サイズの sans-serif フォント
    • CV_FONT_HERSHEY_PLAIN 小さいサイズの sans-serif フォント
    • CV_FONT_HERSHEY_DUPLEX 普通サイズの sans-serif フォント( CV_FONT_HERSHEY_SIMPLEX よりも複雑)
    • CV_FONT_HERSHEY_COMPLEX 普通サイズの serif フォント
    • CV_FONT_HERSHEY_TRIPLEX 普通サイズの serif フォント( CV_FONT_HERSHEY_COMPLEX よりも複雑)
    • CV_FONT_HERSHEY_COMPLEX_SMALL CV_FONT_HERSHEY_COMPLEX の小さいサイズ版
    • CV_FONT_HERSHEY_SCRIPT_SIMPLEX 手書きスタイルのフォント
    • CV_FONT_HERSHEY_SCRIPT_COMPLEX CV_FONT_HERSHEY_SCRIPT_SIMPLEX の複雑版

    このパラメータは,上記の値と,イタリック(斜字)を意味するオプションフラグ CV_FONT_ITALIC の組み合わせをとることができます

  • hscale – 水平方向スケール.これが 1.0f ならば,文字はフォント毎のデフォルトの幅になり, 0.5f ならば,オリジナルの半分の幅になります
  • vscale – 垂直方向スケール.これが 1.0f ならば,文字はフォント毎のデフォルトの高さになり, 0.5f ならば,オリジナルの半分の高さになります
  • shear – 垂直線に対する文字の傾き(相対角度)を近似するタンジェント値.これが 0 ならば,非イタリックフォントであり, 1.0f ならば,文字が45度傾いていることを意味します
  • thickness – 文字の線の太さ
  • lineType – 文字の線の種類, Line の説明を参照してください

この関数は,文字列描画関数に渡されるフォント構造体を初期化します.

cv::InitLineIterator

int cvInitLineIterator(const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity=8, int left_to_right=0)

ラインイテレータを初期化します.

パラメタ:
  • image – 線をサンプルする対象となる画像
  • pt1 – 線分の1番目の端点
  • pt2 – 線分の2番目の端点
  • line_iterator – ラインイテレータ状態構造体へのポインタ
  • connectivity – 走査される線分の接続連結,4 連結あるいは 8 連結
  • left_to_right – ( \texttt{left\_to\_right} = 0 ) ならば,指定方向,つまり pt1 から pt2 に向かって走査されます.また ( \texttt{left\_to\_right} \ne 0 ) ならば,左端から右端に向かって走査されます

この関数は,ラインイテレータを初期化し,与えられた2点間のピクセル数を返します.また,この2点は両方とも画像内になければいけません.イテレータが初期化された後に, CV_NEXT_LINE_POINT を逐次呼び出すことで,2点を結ぶラスター走査線上の全ての点を取得できます.

この線分上の点は,4-連結,あるいは8-連結ブレゼンハムアルゴリズムを用いて1つずつ計算されます.

例:ラインイテレータを利用し,色付きの線分に沿ったピクセル値の合計を計算します.

CvScalar sum_line_pixels( IplImage* image, CvPoint pt1, CvPoint pt2 )
{
    CvLineIterator iterator;
    int blue_sum = 0, green_sum = 0, red_sum = 0;
    int count = cvInitLineIterator( image, pt1, pt2, &iterator, 8, 0 );

    for( int i = 0; i < count; i++ ){
        blue_sum += iterator.ptr[0];
        green_sum += iterator.ptr[1];
        red_sum += iterator.ptr[2];
        CV_NEXT_LINE_POINT(iterator);

        /* ピクセル座標を表示します:座標計算のデモ */
        {
        int offset, x, y;
        /* ROIが設定されていないと仮定しています.
           ROIがセットされているならばそれを考慮する必要があります */
        offset = iterator.ptr - (uchar*)(image->imageData);
        y = offset/image->widthStep;
        x = (offset - y*image->widthStep)/(3*sizeof(uchar)
                                          /* ピクセルのサイズ */);
        printf("(
        }
    }
    return cvScalar( blue_sum, green_sum, red_sum );
}

cv::Line

void cvLine(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int lineType=8, int shift=0)

2点を結ぶ線分を描きます.

パラメタ:
  • img – 画像
  • pt1 – 線分の1番目の端点
  • pt2 – 線分の2番目の端点
  • color – 線分の色
  • thickness – 線分の太さ
  • lineType

    線分の種類:

    • 8 (あるいは,省略時)8連結
    • 4 4連結
    • CV_AA アンチエイリアス
  • shift – 点の座標において,小数点以下の桁を表すビット数

この関数は,画像上に pt1pt2 の2点を結ぶ線分を描きます.この線は,画像あるいは ROI 内に収まるようにクリッピングされます.整数座標を持ちアンチエイリアスされない線分に対しては,8連結あるいは4連結のブレゼンハムアルゴリズムが用いられます.また,太い線分の端は丸く描画されます.アンチエイリアスされる線分は,ガウシアンフィルタを使って描画されます.線分の色を指定するには, CV_RGB( r, g, b ) を利用すれば良いでしょう.

cv::PolyLine

void cvPolyLine(CvArr* img, CvPoint** pts, int* npts, int contours, int is_closed, CvScalar color, int thickness=1, int lineType=8, int shift=0)

折れ線,または塗りつぶされていないポリゴンを描きます.

パラメタ:
  • pts – 各ポリゴンへのポインタ配列
  • npts – 各ポリゴンの頂点数の配列
  • contours – 塗りつぶし領域を実際に区切る輪郭の個数
  • img – 画像
  • is_closed – ポリゴンが閉じているかどうかを指定します.閉じている場合,各輪郭の最後の頂点と最初の頂点を結ぶ線分が描画されます
  • color – 線の色
  • thickness – 線の辺の太さ
  • lineType – 線の種類, Line の説明を参照してください
  • shift – ポリゴンの頂点座標において,小数点以下の桁を表すビット数

この関数は,1つまたは複数の折れ線,ポリゴンを描きます.

cv::PutText

void cvPutText(CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color)

文字列を描画します.

パラメタ:
  • img – 入力画像
  • text – 描画される文字列
  • org – 先頭の文字の左下の座標
  • font – フォント構造体へのポインタ
  • color – 文字列の色

この関数は,指定されたフォントと色を用いて画像中に文字列を描きます.描画された文字列は ROI 内に収まるようにクリッピングされます.指定されたフォントに含まれないシンボルは,四角形で置き換えられます.

cv::Rectangle

void cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int lineType=8, int shift=0)

矩形,あるいは塗りつぶされた矩形を描画します.

パラメタ:
  • img – 画像
  • pt1 – 矩形の1つの頂点
  • pt2 – 矩形の反対側の頂点
  • color – 線の色(RGB),あるいは輝度値(グレースケール)
  • thickness – 矩形の線の太さ.負の値(例えば,CV _ FILLED)の場合,矩形が塗りつぶされます
  • lineType – 線の種類, Line の説明を参照してください
  • shift – 頂点の座標において,小数点以下の桁を表すビット数

この関数は,対角に位置する2つの頂点 pt1pt2 を持つ矩形を描きます.

cv::CV_RGB

#define CV_RGB(r, g, b ) cvScalar( (b), (g), (r))

カラー値を作成します.

パラメタ:
  • red – 赤の成分
  • grn – 緑の成分
  • blu – 青の成分