描画関数は,任意のビット深度を持つ行列または画像に対して動作します. 描画される形状の境界は,アンチエイリアス処理されます(今のところ,8ビット画像に対してのみ実装されています). すべての関数の引数は,カラー画像の場合には RGB 値で表現された色(これは CV_RGB マクロや Scalar() コンストラクタによって作られます),グレースケール画像の場合には輝度値,となります.カラー画像のチャンネルの順序は通常 Blue, Green, Red となります.つまり,これが imshow() , imread() や imwrite() などが期待する順序です. また, CvScalar を用いて色を構成する場合は,次のようになります:
ユーザ独自の画像レンダリング関数や入出力関数を利用する場合は,好きなチャンネル順序を用いることができます.描画関数は各チャンネルを個別に処理し,チャンネル順序はもちろん,利用される色空間にも依存しません.また cvtColor() を用いて,画像全体を BGR から RGB や別の色空間に変換することができます.
描画する図形が,画像の外側に部分的にあるいは完全にはみ出す場合,描画関数はそれを切り詰めます.多くの描画関数は,サブピクセル精度で指定された座標を扱うことが可能です.つまり,座標値は固定小数点数として渡されたり,整数にエンコードされたりする可能性があります.小数部分のビット数は,引数 shift によって指定されるので,実数の点座標は として計算されます.これにより,図形をアンチエイリアス処理された形状として表現することができます.
また,これらの関数は,アルファ透過をサポートしません.目的画像が4チャンネルである場合でも color[3] には,単なるピクセル値がコピーされるだけです.したがって,もし半透明な形状を描画したい場合は,それを別のバッファに描画してから画像とブレンドするとよいでしょう.
円を描きます.
パラメタ: |
|
---|
この関数は,与えられた中心と半径を持つ単純な円,または塗りつぶされた円を描きます.
線分が画像矩形内に収まるようにクリッピングします.
パラメタ: |
|
---|
この関数は,与えられた2点を結ぶ線分のうち,画像矩形内に収まる一部分を求めます. 線分が完全に画像の外側にある場合には 0,そうでなければ 1 を返します.
画像内の外側輪郭線および内側輪郭線を描きます.
パラメタ: |
|
---|
この関数は, の場合は,画像内の輪郭線を描き, の場合は,輪郭線の内側を塗りつぶします.
例:輪郭関数を用いた連結成分の検出
#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);
}
}
楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.
パラメタ: |
|
---|
この関数は,楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.これらは,ROI 内に収まるようにクリッピングされます.アンチエイリアスされた弧や線に太さを持つ弧に対しては,piecewise線形近似が用いられます.すべての角度は「度」単位で与えます.これらのパラメータの意味を以下の図で説明します.
楕円弧のパラメータ
楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.
パラメタ: |
|
---|
この関数は,楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.これは,別の形状を近似するための楕円,つまり関数 CamShift や関数 FitEllipse などの結果を描く際に便利です.これらは,ROI 内に収まるようにクリッピングされます.また,アンチエイリアスされた弧や線に太さを持つ弧に対しては,piecewise線形近似が用いられます.
塗りつぶされた凸ポリゴンを描きます.
パラメタ: |
|
---|
この関数は,凸ポリゴン内部を塗りつぶします.これは,関数 cvFillPoly よりも高速に動作します.また,凸ポリゴンだけでなく,その輪郭が水平なスキャンラインと2回以下しか交差しないようような単純なポリゴン(モノトーンポリゴン)は全て塗りつぶすことができます.
塗りつぶされたポリゴンを描きます.
パラメタ: |
|
---|
この関数は,複数の輪郭で区切られた領域を塗りつぶします.この関数では複雑な領域,例えば領域内に穴を持つものや,自己交差したものなども塗りつぶします.
文字列の幅と高さを取得します.
パラメタ: |
|
---|
この関数は,指定されたフォントで描かれた文字列を内包する矩形のサイズを計算します.
フォント構造体を初期化します.
パラメタ: |
|
---|
{フォント名の識別子.現在は,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 の組み合わせをとることができます.
パラメタ: |
|
---|
この関数は,文字列描画関数に渡されるフォント構造体を初期化します.
ラインイテレータを初期化します.
パラメタ: |
|
---|
この関数は,ラインイテレータを初期化し,与えられた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 );
}
2点を結ぶ線分を描きます.
パラメタ: |
|
---|
この関数は,画像上に pt1 と pt2 の2点を結ぶ線分を描きます.この線は,画像あるいは ROI 内に収まるようにクリッピングされます.整数座標を持ちアンチエイリアスされない線分に対しては,8連結あるいは4連結のブレゼンハムアルゴリズムが用いられます.また,太い線分の端は丸く描画されます.アンチエイリアスされる線分は,ガウシアンフィルタを使って描画されます.線分の色を指定するには, CV_RGB( r, g, b ) を利用すれば良いでしょう.
折れ線,または塗りつぶされていないポリゴンを描きます.
パラメタ: |
|
---|
この関数は,1つまたは複数の折れ線,ポリゴンを描きます.
文字列を描画します.
パラメタ: |
|
---|
この関数は,指定されたフォントと色を用いて画像中に文字列を描きます.描画された文字列は ROI 内に収まるようにクリッピングされます.指定されたフォントに含まれないシンボルは,四角形で置き換えられます.
矩形,あるいは塗りつぶされた矩形を描画します.
パラメタ: |
|
---|
この関数は,対角に位置する2つの頂点 pt1 と pt2 を持つ矩形を描きます.