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で利用される.