CXCORE リファレンス マニュアル
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- 曲線と形状(Curves and Shapes)
- テキスト(Text)
- 点集合と輪郭(Point Sets and Contours)
 
- データ永続性と実行時型情報(Data Persistence and RTTI)
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
描画関数(Drawing Functions)
描画関数は行列や画像,任意のカラーデプスで使われる. アンチエイリアス処理は8ビット画像にのみ実装されている. すべての関数はパラメータcolor(CV_RGBマクロか,cvScalar関数を用いて作成される)を持ち, これはカラー画像ではrgb値,グレースケール画像では輝度を意味する.
描く図の一部,もしくは全てが画像の領域外にある場合には,その部分は切り取られる. カラー画像の場合,チャンネルの順番は青,緑,赤...である. 順番を変更したい場合は,cvScalarを用いて順番を指定するか,cvCvtColor あるいは cvTransformを用いて,描画前,もしくは描画後に画像を変換すればよい.
点集合と輪郭(Point Sets and Contours)
DrawContours
画像の外側輪郭線,または内側輪郭線を描画する
void cvDrawContours( CvArr *img, CvSeq* contour,
                     CvScalar external_color, CvScalar hole_color,
                     int max_level, int thickness=1,
                     int line_type=8, CvPoint offset=cvPoint(0,0) );
- img
- 輪郭を描画する元画像.輪郭はROIで切り取られる.
- contour
- 最初の輪郭へのポインタ.
- external_color
- 外側輪郭線の色.
- hole_color
- 内側輪郭線(穴)の色.
- max_level
- 描画される輪郭の最大レベル. 0にした場合,contourのみが描画される. 1にした場合,先頭の輪郭と,同レベルのすべての輪郭が描画される. 2にした場合,先頭の輪郭と同レベルのすべての輪郭と,先頭の輪郭の一つ下のレベルのすべての輪郭が描画される.以下同様. 負の値にした場合,この関数はcontourの後に続く同レベルの輪郭を描画しないが, contourの子の輪郭をabs(max_level)-1のレベルまで描画する.
- thickness
- 描画される輪郭線の太さ.負(例えば=CV_FILLED)にした場合には,内部を塗りつぶす.
- line_type
- 線の種類.詳細はcvLineを参照.
- offset
- 全ての座標を指定した値だけシフトする.これは,輪郭をROI内の画像から生成して,ROIのオフセットを考慮する必要がある場合に便利である.
関数cvDrawContoursは,thickness>=0の場合には外側輪郭線を画像上に描画し, thickness<0の場合には輪郭の内部を塗りつぶす.
(例)輪郭関数を用いた連結要素の検出
#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_FILLED を 1 に置き換える.
InitLineIterator
ラインイテレータを初期化する
int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2,
                        CvLineIterator* line_iterator, int connectivity=8,
                        int left_to_right=0 );
- image
- 対象画像.
- pt1
- 線分の一つ目の端点.
- pt2
- 線分のニつ目の端点.
- line_iterator
- ラインイテレータ状態構造体へのポインタ.
- connectivity
- 走査した線分の接続性.4または8.
- left_to_right
- pt1とpt2とは無関係に線分をいつも左から右に走査する(left_to_right≠0)か, pt1からpt2への決まった方向で走査するか(left_to_right=0)を指定するフラグ.
関数cvInitLineIteratorはラインイテレータを初期化し,2端点間のピクセル数を返す. 両方の点は共に画像内に存在しなければならない. ラインイテレータが初期化された後,2端点を結ぶラスター走査線のすべての点はCV_NEXT_LINE_POINTにより取得される. 線上の点は,4連結 または 8連結ブレゼンハム(Bresenham)アルゴリズムを用いて一つずつ計算される.
(例)ラインイテレータを用いた色のついた線上のピクセル値の総和の計算
    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は設定されていないと仮定している.もし設定されている場合には考慮する必要がある.*/
            offset = iterator.ptr - (uchar*)(image->imageData);
            y = offset/image->widthStep;
            x = (offset - y*image->widthStep)/(3*sizeof(uchar) /* ピクセルのサイズ */);
            printf("(%d,%d)¥n", x, y );
            }
        }
        return cvScalar( blue_sum, green_sum, red_sum );
    }
ClipLine
線分を画像領域で切り取る
int cvClipLine( CvSize img_size, CvPoint* pt1, CvPoint* pt2 );
- img_size
- 画像の大きさ.
- pt1
- 線分の1番目の端点.この値はこの関数によって変更される.
- pt2
- 線分の2番目の端点.この値はこの関数によって変更される.
関数cvClipLine は,画像領域内に存在する線分の領域を計算する. もし線分が完全に画像外ならば0を返し,そうでなければ1を返す.
Ellipse2Poly
楕円弧をポリラインで近似する
int cvEllipse2Poly( CvPoint center, CvSize axes,
                    int angle, int arc_start,
                    int arc_end, CvPoint* pts, int delta );
- center
- 弧の中心.
- axes
- 楕円の軸の長さ.cvEllipseを参照.
- angle
- 楕円の回転角度.cvEllipseを参照.
- start_angle
- 楕円弧の開始角度.
- end_angle
- 楕円弧の終了角度.
- pts
- この関数で塗りつぶされる点の配列.
- delta
- ポリラインの連続した頂点間の角度,近似精度.出力される点の総数は最大で ceil((end_angle - start_angle)/delta) + 1.
関数cvEllipse2Polyは,指定した楕円弧を近似するポリラインの頂点を計算する. これはcvEllipseで利用される.
