描画関数は,任意のビット深度を持つ行列または画像に対して動作します. 描画される形状の境界は,アンチエイリアス処理されます(今のところ,8ビット画像に対してのみ実装されています). すべての関数の引数は,カラー画像の場合には RGB 値で表現された色(これは CV_RGB マクロや Scalar() コンストラクタによって作られます),グレースケール画像の場合には輝度値,となります.カラー画像のチャンネルの順序は通常 Blue, Green, Red となります.つまり,これが imshow() , imread() や imwrite() などが期待する順序です. したがって, Scalar() コンストラクタを用いて色を構成する場合は,次のようになります:
ユーザ独自の画像レンダリング関数や入出力関数を利用する場合は,好きなチャンネル順序を用いることができます.描画関数は各チャンネルを個別に処理し,チャンネル順序はもちろん,利用される色空間にも依存しません.また cvtColor() を用いて,画像全体を BGR から RGB や別の色空間に変換することができます.
描画する図形が,画像の外側に部分的にあるいは完全にはみ出す場合,描画関数はそれを切り詰めます.多くの描画関数は,サブピクセル精度で指定された座標を扱うことが可能です.つまり,座標値は固定小数点数として渡されたり,整数にエンコードされたりする可能性があります.小数部分のビット数は,引数 shift によって指定されるので,実数の点座標は として計算されます.これにより,図形をアンチエイリアス処理された形状として表現することができます.
また,これらの関数は,アルファ透過をサポートしません.目的画像が4チャンネルである場合でも color[3] には,単なるピクセル値がコピーされるだけです.したがって,もし半透明な形状を描画したい場合は,それを別のバッファに描画してから画像とブレンドするとよいでしょう.
円を描きます.
パラメタ: |
|
---|
関数 circle は,指定された中心座標と半径を持つ円,あるいは塗りつぶされた円を描きます.
線分が画像矩形内に収まるように切り詰めます.
パラメタ: |
|
---|
関数 clipLine は,与えられた2点を結ぶ線分のうち,画像矩形内に収まる一部分を求めます.線分が完全に画像矩形の外側にある場合には false を,そうでなければ true を返します.
楕円,楕円弧,塗りつぶされた楕円,塗りつぶされた扇形を描画します.
パラメタ: |
|
---|
関数 ellipse は,より少ないパラメータで,楕円,塗りつぶされた楕円,楕円弧,塗りつぶされた扇形を描きます. 楕円弧の境界線を近似するために,多くの線分で構成された曲線が用いられます.曲線の表現をさらに制御する必要がある場合, ellipse2Poly() で曲線を求めてから polylines() でそれを描くか, fillPoly() でそれを塗りつぶすことができます.この関数の1番目の形式を利用して,楕円弧ではない完全な楕円を描くには, startAngle=0 と endAngle=360 を渡してください.パラメータの意味を以下の図で説明します.
楕円弧のパラメータ
楕円弧を折れ線で近似します.
パラメタ: |
|
---|
関数 ellipse2Poly は,指定された円弧を近似する折れ線の頂点を求めます.これは, ellipse() で利用されます.
塗りつぶされた凸ポリゴンを描きます.
パラメタ: |
|
---|
関数 fillConvexPoly は,塗りつぶされた凸ポリゴンを描きます.この関数は,関数 fillPoly よりも高速に動作します.また,凸ポリゴンだけでなく,その輪郭が水平なスキャンラインと2回以下しか交差しない(しかし,上下の境界線は水平でも良い)ようようなモノトーンポリゴンはすべて塗りつぶすことができます.
1つ,または複数のポリゴンで区切られた領域を塗りつぶします.
パラメタ: |
|
---|
関数 fillPoly は,いくつかのポリゴンによって区切られた領域を塗りつぶします.この関数では複雑な領域,例えば領域内に穴を持つものや,(部分的に)自己交差したものなども塗りつぶすことができます.
文字列の幅と高さを求めます.
パラメタ: |
|
---|
関数 getTextSize は,指定されたテキストを囲む矩形のサイズを求め,それを返します. つまり以下のコードは,テキストとそれをぴったり囲む枠線,ベースラインを描画します:
// ベースラインを表示するために "y" を利用します.
string text = "Funny text inside the box";
int fontFace = FONT_HERSHEY_SCRIPT_SIMPLEX;
double fontScale = 2;
int thickness = 3;
Mat img(600, 800, CV_8UC3, Scalar::all(0));
int baseline=0;
Size textSize = getTextSize(text, fontFace,
fontScale, thickness, &baseline);
baseline += thickness;
// テキストをセンタリングします.
Point textOrg((img.cols - textSize.width)/2,
(img.rows + textSize.height)/2);
// 矩形を描画します.
rectangle(img, textOrg + Point(0, baseline),
textOrg + Point(textSize.width, -textSize.height),
Scalar(0,0,255));
// ... 次に,まずベースラインを描画します.
line(img, textOrg + Point(0, thickness),
textOrg + Point(textSize.width, thickness),
Scalar(0, 0, 255));
// 続いてテキスト自体を描画します.
putText(img, text, textOrg, fontFace, fontScale,
Scalar::all(255), thickness, 8);
2点を結ぶ線分を描きます.
パラメタ: |
|
---|
関数 line は,画像上に pt1 と pt2 の2点を結ぶ線分を描きます.この線分は,画像矩形によって切り取られます.整数座標を持ちアンチエイリアス処理されない線分に対しては,8連結または4連結のブレゼンハムアルゴリズムが使われます.また,太い線分の端は丸く描画されます.アンチエイリアス処理される線分は,ガウシアンフィルタを利用して描画されます.線分の色を指定するには, CV_RGB( r, g, b ) を利用してください.
ラスタ線上のピクセルを反復するためのクラス.
class LineIterator
{
public:
// pt1 と pt2 を結ぶ線分に対するイテレータを作成します.
// この線分は,画像矩形によって切り取られます.
// また,線分は 8 連結または 4 連結です.
// leftToRight=true ならば,
// パラメター pt1 と pt2 の順序に関係なく,
// 常に左端から右端に向かって反復されます.
LineIterator(const Mat& img, Point pt1, Point pt2,
int connectivity=8, bool leftToRight=false);
// 現在のピクセルへのポインタを返します.
uchar* operator *();
// イテレータを次のピクセルに移動させます.
LineIterator& operator ++();
LineIterator operator ++(int);
// イテレータの内部状態
uchar* ptr;
int err, count;
int minusDelta, plusDelta;
int minusStep, plusStep;
};
LineIterator クラスは,ラスタ線を構成する各ピクセルを取得する為に利用されます.これはブレゼンハムアルゴリズムの汎用的な実装とみなすことができ,各ピクセル上で停止して追加の処理を行うことが可能です.例えば,線分に沿ってピクセルの値を取得したり,何らかのエフェクト(例えば,XOR 処理)を施した線分を描いたり,といったことが可能になります.
線分上のピクセル数は, LineIterator::count に格納されます.
// 8 ビット, 3 チャンネル画像上のピクセルを
// 線分 (pt1, pt2) に沿って取得しバッファに格納します.
LineIterator it(img, pt1, pt2, 8);
vector<Vec3b> buf(it.count);
for(int i = 0; i < it.count; i++, ++it)
buf[i] = *(const Vec3b)*it;
単純な矩形,太線の矩形,塗りつぶされた矩形を描画します.
パラメタ: |
|
---|
関数 rectangle は,線だけの矩形,あるいは塗りつぶされた矩形を描きます. pt1 と pt2 は,その矩形の対角線上にある頂点を表します.
複数の折れ線を描きます.
パラメタ: |
|
---|
関数 polylines は,1つあるいは複数の折れ線を描きます.
文字列を描画します.
パラメタ: |
|
---|
関数 putText は,画像中に指定された文字列を描画します.指定されたフォントを用いて描画できないシンボルは,はてなマークで置き換えられます.テキストを描画するサンプルコードに関しては, getTextSize() を参照してください.