描画関数 ============ .. highlight:: c 描画関数は,任意のビット深度を持つ行列または画像に対して動作します. 描画される形状の境界は,アンチエイリアス処理されます(今のところ,8ビット画像に対してのみ実装されています). すべての関数の引数は,カラー画像の場合には RGB 値で表現された色(これは ``CV_RGB`` マクロや :func:`Scalar` コンストラクタによって作られます),グレースケール画像の場合には輝度値,となります.カラー画像のチャンネルの順序は通常 *Blue, Green, Red* となります.つまり,これが :func:`imshow` , :func:`imread` や :func:`imwrite` などが期待する順序です. また, :ref:`cvScalar` を用いて色を構成する場合は,次のようになります: .. math:: \texttt{cvScalar} (blue \_ component, green \_ component, red \_ component[, alpha \_ component]) ユーザ独自の画像レンダリング関数や入出力関数を利用する場合は,好きなチャンネル順序を用いることができます.描画関数は各チャンネルを個別に処理し,チャンネル順序はもちろん,利用される色空間にも依存しません.また :func:`cvtColor` を用いて,画像全体を BGR から RGB や別の色空間に変換することができます. 描画する図形が,画像の外側に部分的にあるいは完全にはみ出す場合,描画関数はそれを切り詰めます.多くの描画関数は,サブピクセル精度で指定された座標を扱うことが可能です.つまり,座標値は固定小数点数として渡されたり,整数にエンコードされたりする可能性があります.小数部分のビット数は,引数 ``shift`` によって指定されるので,実数の点座標は :math:`\texttt{Point}(x,y)\rightarrow\texttt{Point2f}(x*2^{-shift},y*2^{-shift})` として計算されます.これにより,図形をアンチエイリアス処理された形状として表現することができます. また,これらの関数は,アルファ透過をサポートしません.目的画像が4チャンネルである場合でも ``color[3]`` には,単なるピクセル値がコピーされるだけです.したがって,もし半透明な形状を描画したい場合は,それを別のバッファに描画してから画像とブレンドするとよいでしょう. .. index:: Circle .. _Circle: Circle ------ `id=0.384385654644 Comments from the Wiki `__ .. cfunction:: void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int lineType=8, int shift=0 ) 円を描きます. :param img: 円が描かれる画像. :param center: 円の中心座標. :param radius: 円の半径. :param color: 円の色. :param thickness: 円の枠線の太さ.負の値の場合,円内部が塗りつぶされます. :param lineType: 円を描く線の種類, :ref:`Line` の説明を参照してください. :param shift: 中心点の座標と半径の値において,小数点以下の桁を表すビット数. この関数は,与えられた中心と半径を持つ単純な円,または塗りつぶされた円を描きます. .. index:: ClipLine .. _ClipLine: ClipLine -------- `id=0.761072845481 Comments from the Wiki `__ .. cfunction:: int cvClipLine( CvSize imgSize, CvPoint* pt1, CvPoint* pt2 ) 線分が画像矩形内に収まるようにクリッピングします. :param imgSize: 画像サイズ. :param pt1: 線分の1番目の端点. この値は関数によって変更されます. :param pt2: 線分の2番目の端点. この値は関数によって変更されます. この関数は,与えられた2点を結ぶ線分のうち,画像矩形内に収まる一部分を求めます. 線分が完全に画像の外側にある場合には 0,そうでなければ 1 を返します. .. index:: DrawContours .. _DrawContours: DrawContours ------------ `id=0.600283246827 Comments from the Wiki `__ .. cfunction:: void cvDrawContours( CvArr *img, CvSeq* contour, CvScalar external_color, CvScalar hole_color, int max_level, int thickness=1, int lineType=8 ) 画像内の外側輪郭線および内側輪郭線を描きます. :param img: 輪郭を描画する画像.他の描画関数と同様に,輪郭も ROI 内に収まるようにクリップされます. :param contour: 最初の輪郭へのポインタ. :param external_color: 外側輪郭線の色. :param hole_color: 内側輪郭線(穴)の色. :param max_level: 描画される輪郭の最大レベル.0 の場合, ``contour`` のみが描画されます.1 の場合,contourと,それと同レベルの全ての輪郭が描画されます.2 の場合,contourと,それと同レベルと1つ下のレベルの全ての輪郭が描画されます.そして負の値の場合, ``contour`` と同レベルの他の輪郭は描画されず,代わりに ``contour`` の子ノード輪郭が :math:`|\texttt{max\_level}|-1` レベルまで描画されます. :param thickness: 描かれる輪郭線の太さ.この値が負の場合(例えば,=CV _ FILLED),輪郭の内側が塗りつぶされます. :param lineType: 輪郭線の種類, :ref:`Line` の説明を参照してください. この関数は, :math:`\texttt{thickness} \ge 0` の場合は,画像内の輪郭線を描き, :math:`\texttt{thickness} <0` の場合は,輪郭線の内側を塗りつぶします. 例:輪郭関数を用いた連結成分の検出 .. code-block:: c #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); } } .. .. index:: Ellipse .. _Ellipse: Ellipse ------- `id=0.797746748348 Comments from the Wiki `__ .. cfunction:: 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 ) 楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します. :param img: 画像. :param center: 楕円の中心座標. :param axes: 楕円の長径と短径. :param angle: 回転角度. :param start_angle: 円弧の開始角度. :param end_angle: 円弧の終了角度. :param color: 楕円の色. :param thickness: 楕円を描く線の太さ.負の値の場合,扇形内部が塗りつぶされます. :param lineType: 楕円の線の種類, :ref:`Line` の説明を参照してください. :param shift: 中心点の座標と軸長の値において,小数点以下の桁を表すビット数. この関数は,楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.これらは,ROI 内に収まるようにクリッピングされます.アンチエイリアスされた弧や線に太さを持つ弧に対しては,piecewise線形近似が用いられます.すべての角度は「度」単位で与えます.これらのパラメータの意味を以下の図で説明します. 楕円弧のパラメータ .. image:: ../../pics/ellipse.png .. index:: EllipseBox .. _EllipseBox: EllipseBox ---------- `id=0.311811511729 Comments from the Wiki `__ .. cfunction:: void cvEllipseBox( CvArr* img, CvBox2D box, CvScalar color, int thickness=1, int lineType=8, int shift=0 ) 楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します. :param img: 画像. :param box: 描画される楕円に外接するボックス領域. :param thickness: 楕円の線の太さ. :param lineType: 楕円の線の種類, :ref:`Line` の説明を参照してください. :param shift: 矩形の頂点座標において,小数点以下の桁を表すビット数. この関数は,楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.これは,別の形状を近似するための楕円,つまり関数 :ref:`CamShift` や関数 :ref:`FitEllipse` などの結果を描く際に便利です.これらは,ROI 内に収まるようにクリッピングされます.また,アンチエイリアスされた弧や線に太さを持つ弧に対しては,piecewise線形近似が用いられます. .. index:: FillConvexPoly .. _FillConvexPoly: FillConvexPoly -------------- `id=0.730574625323 Comments from the Wiki `__ .. cfunction:: void cvFillConvexPoly( CvArr* img, CvPoint* pts, int npts, CvScalar color, int lineType=8, int shift=0 ) 塗りつぶされた凸ポリゴンを描きます. :param img: 画像. :param pts: 1つのポリゴンへのポインタ. :param npts: ポリゴンの頂点数. :param color: ポリゴンの色. :param lineType: ポリゴンを描く線の種類, :ref:`Line` の説明を参照してください. :param shift: ポリゴンの頂点座標において,小数点以下の桁を表すビット数. この関数は,凸ポリゴン内部を塗りつぶします.これは,関数 ``cvFillPoly`` よりも高速に動作します.また,凸ポリゴンだけでなく,その輪郭が水平なスキャンラインと2回以下しか交差しないようような単純なポリゴン(モノトーンポリゴン)は全て塗りつぶすことができます. .. index:: FillPoly .. _FillPoly: FillPoly -------- `id=0.40049107944 Comments from the Wiki `__ .. cfunction:: void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours, CvScalar color, int lineType=8, int shift=0 ) 塗りつぶされたポリゴンを描きます. :param img: 画像. :param pts: 各ポリゴンへのポインタ配列. :param npts: 各ポリゴンの頂点数の配列. :param contours: 塗りつぶし領域を実際に区切る輪郭の個数. :param color: ポリゴンの色. :param lineType: ポリゴンを描く線の種類, :ref:`Line` の説明を参照してください. :param shift: ポリゴンの頂点座標において,小数点以下の桁を表すビット数. この関数は,複数の輪郭で区切られた領域を塗りつぶします.この関数では複雑な領域,例えば領域内に穴を持つものや,自己交差したものなども塗りつぶします. .. index:: GetTextSize .. _GetTextSize: GetTextSize ----------- `id=0.637996965504 Comments from the Wiki `__ .. cfunction:: void cvGetTextSize( const char* textString, const CvFont* font, CvSize* textSize, int* baseline ) 文字列の幅と高さを取得します. :param font: フォント構造タイへのポインタ. :param textString: 入力文字列. :param textSize: 取得される文字列のサイズ.ベースラインより下は,文字列の高さには含まれません. :param baseline: 文字列の最下点から見たベースラインのy座標. この関数は,指定されたフォントで描かれた文字列を内包する矩形のサイズを計算します. .. index:: InitFont .. _InitFont: InitFont -------- `id=0.33627470901 Comments from the Wiki `__ .. cfunction:: void cvInitFont( CvFont* font, int fontFace, double hscale, double vscale, double shear=0, int thickness=1, int lineType=8 ) フォント構造体を初期化します. :param font: この関数によって初期化されるフォント構造タイへのポインタ. :param 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`` の組み合わせをとることができます. :param hscale: 水平方向スケール.これが ``1.0f`` ならば,文字はフォント毎のデフォルトの幅になり, ``0.5f`` ならば,オリジナルの半分の幅になります. :param vscale: 垂直方向スケール.これが ``1.0f`` ならば,文字はフォント毎のデフォルトの高さになり, ``0.5f`` ならば,オリジナルの半分の高さになります. :param shear: 垂直線に対する文字の傾き(相対角度)を近似するタンジェント値.これが 0 ならば,非イタリックフォントであり, ``1.0f`` ならば,文字が45度傾いていることを意味します. :param thickness: 文字の線の太さ. :param lineType: 文字の線の種類, :ref:`Line` の説明を参照してください. この関数は,文字列描画関数に渡されるフォント構造体を初期化します. .. index:: InitLineIterator .. _InitLineIterator: InitLineIterator ---------------- `id=0.0854349248614 Comments from the Wiki `__ .. cfunction:: int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity=8, int left_to_right=0 ) ラインイテレータを初期化します. :param image: 線をサンプルする対象となる画像. :param pt1: 線分の 1 番目の端点. :param pt2: 線分の 2 番目の端点. :param line_iterator: ラインイテレータ状態構造体へのポインタ. :param connectivity: 走査される線分の接続連結,4 連結あるいは 8 連結. :param left_to_right: ( :math:`\texttt{left\_to\_right} = 0` ) ならば,指定方向,つまり ``pt1`` から ``pt2`` に向かって走査されます.また ( :math:`\texttt{left\_to\_right} \ne 0` ) ならば,左端から右端に向かって走査されます. この関数は,ラインイテレータを初期化し,与えられた2点間のピクセル数を返します.また,この2点は両方とも画像内になければいけません.イテレータが初期化された後に, ``CV_NEXT_LINE_POINT`` を逐次呼び出すことで,2点を結ぶラスター走査線上のすべての点を取得できます. この線分上の点は,4-連結,あるいは8-連結ブレゼンハムアルゴリズムを用いて1つずつ計算されます. 例:ラインイテレータを利用し,色付きの線分に沿ったピクセル値の合計を計算します. .. code-block:: c 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 ); } .. .. index:: Line .. _Line: Line ---- `id=0.660768471763 Comments from the Wiki `__ .. cfunction:: void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int lineType=8, int shift=0 ) 2点を結ぶ線分を描きます. :param img: 画像. :param pt1: 線分の1番目の端点. :param pt2: 線分の2番目の端点. :param color: 線分の色. :param thickness: 線分の太さ. :param lineType: 線分の種類: * **8** (あるいは,省略時)8連結. * **4** 4連結. * **CV_AA** アンチエイリアス. :param shift: 点の座標において,小数点以下の桁を表すビット数. この関数は,画像上に ``pt1`` と ``pt2`` の2点を結ぶ線分を描きます.この線は,画像あるいは ROI 内に収まるようにクリッピングされます.整数座標を持ちアンチエイリアスされない線分に対しては,8連結あるいは4連結のブレゼンハムアルゴリズムが用いられます.また,太い線分の端は丸く描画されます.アンチエイリアスされる線分は,ガウシアンフィルタを使って描画されます.線分の色を指定するには, ``CV_RGB( r, g, b )`` を利用すれば良いでしょう. .. index:: PolyLine .. _PolyLine: PolyLine -------- `id=0.499422902868 Comments from the Wiki `__ .. cfunction:: void cvPolyLine( CvArr* img, CvPoint** pts, int* npts, int contours, int is_closed, CvScalar color, int thickness=1, int lineType=8, int shift=0 ) 折れ線,または塗りつぶされていないポリゴンを描きます. :param pts: 各ポリゴンへのポインタ配列. :param npts: 各ポリゴンの頂点数の配列. :param contours: 塗りつぶし領域を実際に区切る輪郭の個数. :param img: 画像. :param is_closed: ポリゴンが閉じているかどうかを指定します.閉じている場合,各輪郭の最後の頂点と最初の頂点を結ぶ線分が描画されます. :param color: 線の色. :param thickness: 線の辺の太さ. :param lineType: 線の種類, :ref:`Line` の説明を参照してください. :param shift: ポリゴンの頂点座標において,小数点以下の桁を表すビット数. この関数は,1つまたは複数の折れ線,ポリゴンを描きます. .. index:: PutText .. _PutText: PutText ------- `id=0.84264246214 Comments from the Wiki `__ .. cfunction:: void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color ) 文字列を描画します. :param img: 入力画像. :param text: 描画される文字列. :param org: 先頭の文字の左下の座標. :param font: フォント構造体へのポインタ. :param color: 文字列の色. この関数は,指定されたフォントと色を用いて画像中に文字列を描きます.描画された文字列は ROI 内に収まるようにクリッピングされます.指定されたフォントに含まれないシンボルは,四角形で置き換えられます. .. index:: Rectangle .. _Rectangle: Rectangle --------- `id=0.94072259013 Comments from the Wiki `__ .. cfunction:: void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int lineType=8, int shift=0 ) 矩形,あるいは塗りつぶされた矩形を描画します. :param img: 画像. :param pt1: 矩形の1つの頂点. :param pt2: 矩形の反対側の頂点. :param color: 線の色(RGB),あるいは輝度値(グレースケール). :param thickness: 矩形の線の太さ.負の値(例えば,CV _ FILLED)の場合,矩形が塗りつぶされます. :param lineType: 線の種類, :ref:`Line` の説明を参照してください. :param shift: 頂点の座標において,小数点以下の桁を表すビット数. この関数は,対角に位置する2つの頂点 ``pt1`` と ``pt2`` を持つ矩形を描きます. .. index:: CV_RGB .. _CV_RGB: CV_RGB ------ `id=0.504383234451 Comments from the Wiki `__ .. cfunction:: \#define CV_RGB( r, g, b ) cvScalar( (b), (g), (r) ) カラー値を作成します. :param red: 赤の成分. :param grn: 緑の成分. :param blu: 青の成分.