CV リファレンスマニュアル


画像処理(Image Processing)


勾配,エッジ,コーナー(Gradients, Edges and Corners)


★★★
void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );

拡張Sobel演算子を用いて1次、2次、3次または混合次数の微分画像を計算する

src
入力画像。
dst
出力画像。
xorder
x-導関数の次数。
yorder
y-導関数の次数。
aperture_size
拡張Sobelカーネルのサイズは1, 3, 5または7 のいずれかである必要がある。aperture_size=1 の場合を除いて、aperture_size × aperture_size の、(二つのベクトルの積に)分離可能なカーネルが導関数の計算に用いられる。 aperture_size=1 の場合は、3x1 あるいは 1x3 のカーネルが用いられる(ガウシアン(Gaussian)による平滑化は行わない). 特別な値であるaperture_size=CV_SCHARR(=-1) もあり、3x3 Sobelよりも精度の良い結果が得られる3x3 のSharr のフィルタである。ここでScharrのアパーチャは以下の通り。
| -3 0  3|
|-10 0 10|
| -3 0  3|
これはx-導関数のためのカーネルであり、転置することによってy-導関数のためのカーネルとなる。

cvSobel 関数は以下のように、画像と適切なカーネルの畳み込みによって、微分画像を計算する。

dst(x,y) = dxorder+yodersrc/dxxorder•dyyorder |(x,y)
Sobel演算子はガウシアンによる平滑化と、微分の重ね合わせ処理であるので、その結果はノイズに対してある程度頑健である。 1次のx-微分画像 あるいは y-微分画像を計算するときには、ほとんどの場合、引数はそれぞれ(xorder=1, yorder=0, aperture_size=3)または (xorder=0, yorder=1, aperture_size=3) を用いる。前者の場合、Sobelカーネルは

  |-1  0  1|
  |-2  0  2|
  |-1  0  1|

であり、後者のSobelカーネルは

  |-1 -2 -1|
  | 0  0  0|
  | 1  2  1|
あるいは
  | 1  2  1|
  | 0  0  0|
  |-1 -2 -1|
となる。どちらになるかは画像原点(IplImage構造体のoriginフィールド)に依存する。 スケーリングは行われないので、出力画像の各ピクセル値は、ほとんどの場合入力画像のそれよりも大きな値になる。オーバーフローを避けるために、例えば入力画像が8ビットの場合、出力画像として16ビット画像を指定する必要がある。このような16ビット画像は、関数cvConvertScalecvConvertScaleAbsを用いて、8ビット画像に戻すことができる。一方でこの関数は、8ビット画像だけでなく、32ビット浮動小数点型画像の処理も可能である。入力画像、出力画像共に、同じサイズあるいは同じROIサイズのシングルチャンネル画像である必要がある。

使用例は、4.4 エッジ抽出を参照。


★★★
void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 );

画像のラプラシアン(Laplacian)を計算する

src
入力画像。
dst
出力画像。
aperture_size
アパーチャサイズ(cvSobelと同じ)。

cvLaplace 関数は、以下のようにSobel演算子を用いて計算されたxとyの2次微分を加算することで、入力画像のラプラシアン(Laplacian)を計算する。

dst(x,y) = d2src/dx2 + d2src/dy2

aperture_size=1 を指定した場合は、以下のカーネルを用いた入力画像との畳み込みと同じ処理を、高速に行う。

|0  1  0|
|1 -4  1|
|0  1  0|

関数 cvSobel と同様に、スケーリングは行わない。そしてこれらの関数がサポートする入力と出力のフォーマットの組み合わせも同じである。

使用例は、4.4 エッジ抽出を参照。


★★★
void cvCanny( const CvArr* image, CvArr* edges, double threshold1,
              double threshold2, int aperture_size=3 );

エッジ検出のためのCannyアルゴリズムを実装する

image
入力画像。
edges
この関数によって得られたエッジ画像。
threshold1
1番目の閾値。
threshold2
2番目の閾値。
aperture_size
Sobel演算子のアパーチャサイズ(cvSobel参照)。

関数cvCannyは、Cannyアルゴリズムを使用して、 入力画像 imageに含まれているエッジを検出し、 それを出力画像 edges に保存する。 threshold1threshold2 のうち小さいほうがエッジ同士を接続するために用いられ、大きいほうが強いエッジの初期検出に用いられる。

使用例は、4.5 ハフ変換を参照。


★★★
void cvPreCornerDetect( const CvArr* image, CvArr* corners, int aperture_size=3 );

コーナー検出のための特徴マップを計算する

image
入力画像。
corners
コーナーの候補を保存する画像。
aperture_size
Sobel演算子のアパーチャサイズ(cvSobel参照)。

cvPreCornerDetect 関数は、関数 Dx2Dyy+Dy2Dxx - 2DxDyDxy を計算する。 ここでD? は画像の1次微分を D??は画像の2次微分を表す。コーナーは、以下のようにこの関数の極大値を求めることで検出される。

// ここでは,画像が浮動小数点型であることを仮定する
IplImage* corners = cvCloneImage(image);
IplImage* dilated_corners = cvCloneImage(image);
IplImage* corner_mask = cvCreateImage( cvGetSize(image), 8, 1 );
cvPreCornerDetect( image, corners, 3 );
cvDilate( corners, dilated_corners, 0, 1 );
cvSub( corners, dilated_corners, corners );
cvCmpS( corners, 0, corner_mask, CV_CMP_GE );
cvReleaseImage( &corners );
cvReleaseImage( &dilated_corners );

★★
void cvCornerEigenValsAndVecs( const CvArr* image, CvArr* eigenvv,
                               int block_size, int aperture_size=3 );

コーナー検出のために画像ブロックの固有値と固有ベクトルを計算する

image
入力画像。
eigenvv
結果保存用の画像。入力画像の6倍のサイズが必要。
block_size
隣接ブロックのサイズ
aperture_size
Sobel演算子のアパーチャサイズ


★★
void cvCornerHarris( const CvArr* image, CvArr* harris_responce,
                     int block_size, int aperture_size=3, double k=0.04 );

Harris エッジ検出器

image
入力画像。
harris_responce
検出結果を保存する画像。入力画像 image と同じサイズでなくてはならない。
block_size
隣接ブロックのサイズ
aperture_size
Sobel演算子のアパーチャサイズ。入力画像が浮動小数点型である場合、このパラメータは差分を計算するために用いられる固定小数点型フィルタの数を表す。
k
Harris検出器のパラメータ。


★★★
void cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners,
                         int count, CvSize win, CvSize zero_zone,
                         CvTermCriteria criteria );

コーナー位置を高精度化する

image
入力画像。
corners
コーナーの初期座標が入力され、高精度化された座標が出力される。
count
コーナーの数。
win
検索ウィンドウの半分のサイズ。(例)win=(5,5) ならば 5*2+1 × 5*2+1 = 11 × 11 が探索ウィンドウして使われる。
zero_zone
以下に示す式において、総和を計算する際に含まれない、探索領域の中心に存在する総和対象外領域の半分のサイズ。 この値は、自己相関行列において発生しうる特異点を避けるために用いられる。 値が (-1,-1) の場合は、そのようなサイズはないということを意味する。
criteria
コーナー座標の高精度化のための繰り返し処理の終了条件。コーナー位置の高精度化の繰り返し処理は、規定回数に達するか、目標精度に達したときに終了する。criteria には繰り返しの最大回数と目標精度のどちらか一方、または両方を指定する。

cvFindCornerSubPix 関数は、サブピクセル精度のコーナー位置、あるいは鞍点を見つけるため繰り返し適用される。

サブピクセル精度のコーナー検索は、中心 q から q の隣接にある点 p への全てのベクトルが、 p の画像勾配(これは、画像と観測ノイズに影響される)に直交するという知見に基づいている。 これは、以下の式で表現できる。

εi=DIpiT•(q-pi)
ここでDIpiq の隣接に存在する点 pi における画像勾配を表す。qεi を最小にするような値として得られる。連立方程式は以下のように εi' を 0 にすることで得られる

sumi(DIpi•DIpiT)•q - sumi(DIpi•DIpiT•pi) = 0

ここで画像勾配は q の隣接(探索窓)で総和される。 1次勾配を G 、2次勾配を b と呼び、次のように表す。

q=G-1•b

このアルゴリズムは、隣接の中心を、この新しい中心 q にセットしなおし、その中心が与えられた閾値(目標精度)の内に収まるまで繰り返し計算する。

使用例は、4.11 カメラキャリブレーションを参照。


★★★
void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image,
                            CvPoint2D32f* corners, int* corner_count,
                            double quality_level, double min_distance,
                            const CvArr* mask=NULL, int block_size=3,
                            int use_harris=0, double k=0.04 );

画像内の鮮明なコーナーを検出する

image
8ビット、または32ビット浮動小数点型シングルチャンネルの入力画像。
eig_image
32ビット浮動小数点型のテンポラリ画像。サイズは image と同じである。
temp_image
別のテンポラリ画像。サイズ・フォーマットともに eig_image と同じである。
corners
出力パラメータ。検出されたコーナー。
corner_count
出力パラメータ。検出されたコーナーの数。
quality_level
最大・最小の固有値に乗ずる定数(検出される画像コーナの許容最低品質を指定する)。
min_distance
出力される画像コーナー間の許容最低距離(ユークリッド距離を用いる)。
mask
注目領域(ROI)。指定された領域またはmask が NULL の場合は画像全体から点を選ぶ。
block_size
平均化ブロックのサイズ。この関数で内部的に用いられる cvCornerMinEigenVal あるいは、 cvCornerHarris に、この引数が渡される。
use_harris
0でない場合は、デフォルトの cvCornerMinEigenVal の代わりに、Harris検出器(cvCornerHarris)を用いる。
k
Harris検出器のパラメータ(use_harris≠0 のときのみ使用)。

cvGoodFeaturesToTrack 関数は、画像中から大きな固有値を持つコーナーを検出する。この関数は最初に、すべての入力画像のピクセルに対して、 cvCornerMinEigenVal を用いて最小の固有値を計算し、結果を eig_image に保存する。 次に、non-maxima suppressionを実行する(3x3の隣接領域内の極大のみが残る)。 次のステップでは、 quality_level•max(eig_image(x,y)) より小さい最小固有値をもつコーナーを削除する。 最後に、この関数はコーナー点に着目し(最も強いコーナーが一番最初に対象となる)、新しく着目した特徴点とそれ以前に対象とした特徴点群との距離が min_distance よりも大きいことをチェックすることで、すべての検出されたコーナーそれぞれの距離が十分離れていることを保証する。 そのため、この関数は鮮明な特徴点との距離が近い特徴点を削除する。


サンプリング,補間,幾何変換(Sampling, Interpolation and Geometrical Transforms)


★★
int cvSampleLine( const CvArr* image, CvPoint pt1, CvPoint pt2,
                  void* buffer, int connectivity=8 );

ラスタ表現の線分を構成する点をサンプリングする

image
線分をサンプリングするための入力画像。
pt1
線分の始点。
pt2
線分の終点。
buffer
線分上の点を保存するためのバッファ(保存するための十分なサイズとして8近傍隣接による線分検出の場合、max( |pt2.x-pt1.x|+1, |pt2.y-pt1.y|+1 )が必要で 、また4近傍隣接による線分検出の場合、|pt2.x-pt1.x|+|pt2.y-pt1.y|+1が必要)。
connectivity
線分の接続性。4 または 8。


★★★
void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center );

矩形領域のピクセル値を画像からサブピクセル精度で取得する(画像の並進移動を行なう)

src
入力画像。
dst
抽出された矩形。
center
入力画像中にある抽出された矩形中心の浮動小数点型座標。中心は画像中になければならない。

cvGetRectSubPix 関数は、src から以下のようにしてピクセル値を取得する。

dst(x, y) = src(x + center.x - (width(dst)-1)*0.5, y + center.y - (height(dst)-1)*0.5)

ここで非整数値座標のピクセル値は、バイリニア補間により得られる。 マルチチャンネル画像の各チャンネルは独立して処理される。 矩形の中心は画像中に存在する必要があるが、矩形全体では、その一部が隠れている(画像領域の外にある)かもしれない。 このような場合は、画像境界の外側に存在するピクセルの値を得るために、複製境界モード (replication border mode) が使われる。


★★★
void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix );

四角形領域のピクセル値を画像からサブピクセル精度で取得する(画像の回転+並進移動を行なう)

src
入力画像。
dst
抽出された四角形。
map_matrix
2 × 3 の変換行列 [A|b] (以下の説明を参照)。

cvGetQuadrangleSubPix 関数は、以下のようにして src からサブピクセル精度でピクセル値を取得し、結果を dst に保存する。

dst(x, y)= src( A11x'+A12y'+b1, A21x'+A22y'+b2),

ここで Abmap_matrix より得られる。
             | A11 A12  b1 |
map_matrix = |            |
             | A21 A22  b2 |,

x'=x-(width(dst)-1)*0.5, y'=y-(height(dst)-1)*0.5

ここで、非整数値座標のピクセル値 A•(x,y)T+b は、バイリニア補間により得られる。 画像境界の外側に存在するピクセルの値を必要とする場合には、値を生成するために複製境界モード (replication border mode) を用いる。 マルチチャンネル画像の全てのチャンネルはそれぞれ独立して処理される。


★★★
void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );

画像のサイズ変更を行う

src
入力画像。
dst
出力画像。
interpolation
補間方法。
  • CV_INTER_NN - 最近隣接補間
  • CV_INTER_LINEAR - バイリニア補間 (デフォルト)
  • CV_INTER_AREA - ピクセル領域の関係を用いてリサンプリングする。画像縮小の際は、モアレの無い処理結果を得ることができる手法である。拡大の際は、CV_INTER_NN と同様
  • CV_INTER_CUBIC - バイキュービック補間

cvResize 関数は、 dst のサイズに合うように、画像 src のサイズを変更する。 ROI が設定されているならば、ROI も同様にサイズ変更する。

使用例は、3.3 幾何学変換を参照。


★★★
void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
                   int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
                   CvScalar fillval=cvScalarAll(0) );

画像のアフィン変換を行う

src
入力画像。
dst
出力画像。
map_matrix
2×3 変換行列。
flags
補間方法(CvResizeを参照)と、以下に示すオプションフラグの組み合わせ。
  • CV_WARP_FILL_OUTLIERS - 出力画像の全ピクセルの値を埋める。対応ピクセルが入力画像外であるようなピクセルである場合は、 fillvalがセットされる。
  • CV_WARP_INVERSE_MAP - このフラグは map_matrixが出力画像から入力画像への逆変換のための行列であることを意味するので、直接ピクセル補間に用いることができる。これがセットされていない場合、この関数は map_matrix を使って逆変換を計算する。
fillval
対応の取れない点に対して与える値。

cvWarpAffine関数は入力画像を与えられた行列を用いて以下のように変換する。

dst(x’,y’)<-src(x,y)
(x’,y’)T=map_matrix•(x,y,1)T+b (CV_WARP_INVERSE_MAP がセットされていない場合)
(x, y)T=map_matrix•(x’,y&apos,1)T+b (それ以外の場合)

この関数は cvGetQuadrangleSubPix に類似しているが、厳密には同じではない。 cvWarpAffine は入力画像と出力画像のデータ型が同じである必要があり、オーバーヘッドも大きい(そのためサイズの小さい画像には適していない)。そして出力画像の一部を変換せずに残すことができる。 一方、cvGetQuadrangleSubPix は8ビット画像から矩形を取り出し、浮動小数点型バッファに保存するためオーバーヘッドが少ない。そして常に出力画像全体が変換される。

疎な点集合を変換するときは、cxcore にある cvTransform を使用すべきである。

使用例は、3.3 幾何学変換を参照。


★★
CvMat* cvGetAffineTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst, 
                             CvMat* map_matrix );

3点とそれぞれに対応する点からアフィン変換を計算する

src
入力(変換前)画像内に存在する三角形の3つの頂点座標。
dst
出力(変換後)画像内に存在するsrcに対応した三角形の三つの頂点座標。
map_matrix
出力される 2×3の行列へのポインタ。

使用例は、3.3 幾何学変換を参照。


★★
CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle,
                           double scale, CvMat* map_matrix );

2次元回転のアフィン行列を計算する

center
入力画像内の回転中心
angle
度(degree)単位の回転角度。正の値は反時計方向の回転を意味する(座標原点は左上にあると仮定)。
scale
等方性スケーリング係数(x,y方向とも同じ係数 scale を使う)
map_matrix
出力される 2×3の行列へのポインタ。

使用例は、3.3 幾何学変換を参照。


★★★
void cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
                        int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
                        CvScalar fillval=cvScalarAll(0) );

画像の透視変換を行う

src
入力画像。
dst
出力画像。
map_matrix
3×3 の変換行列。
flags
補間方法(CvResizeを参照)と、以下に示すオプションフラグの組み合わせ。
  • CV_WARP_FILL_OUTLIERS - 出力画像の全ピクセルの値を埋める。対応ピクセルが入力画像外であるようなピクセルである場合は、 fillvalがセットされる。
  • CV_WARP_INVERSE_MAP - このフラグは map_matrixが出力画像から入力画像への逆変換のための行列であることを意味するので、直接ピクセル補間に用いることができる。これがセットされていない場合、この関数は map_matrix を使って逆変換を計算する。
fillval
対応の取れない点に対して与える値。

使用例は、3.3 幾何学変換を参照。


★★★
CvMat* cvGetPerspectiveTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst,
                                  CvMat* map_matrix );

#define cvWarpPerspectiveQMatrix cvGetPerspectiveTransform

4点とそれぞれに対応する点を用いて透視変換行列を求める

src
入力画像中の矩形の4頂点の座標。
dst
出力画像中の対応する矩形の4頂点の座標。
map_matrix
3×3 の出力行列へのポインタ。

cvGetPerspectiveTransform関数は以下のように透視変換行列を求める。

(ti•x'i,ti•y'i,ti)T=map_matrix•(xi,yi,1)T

ここで dst(i)=(x'i,y'i), src(i)=(xi,yi), i=0..3.

使用例は、3.3 幾何学変換を参照。


★★★
void cvRemap( const CvArr* src, CvArr* dst,
              const CvArr* mapx, const CvArr* mapy,
              int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
              CvScalar fillval=cvScalarAll(0) );

画像に対して幾何変換を行う

src
入力画像。
dst
出力画像。
mapx
x座標マップ (32fC1 フォーマットの画像)。
mapy
y座標マップ (32fC1 フォーマットの画像)。
flags
補間方法(CvResizeを参照)と、以下に示すオプションフラグの組み合わせ。
  • CV_WARP_FILL_OUTLIERS - 出力画像の全ピクセルの値を埋める。対応ピクセルが入力画像外であるようなピクセルである場合は、 fillvalがセットされる。
fillval
対応の取れない点に対して与える値。

cvRemap 関数は、指定されたマップを用いて入力画像を以下のように変換する。

dst(x,y)<-src(mapx(x,y),mapy(x,y))

他の幾何変換と同様、非整数座標値を持つピクセルを抽出するために、ユーザによって指定された補間方法が用いられる。


★★
void cvLogPolar( const CvArr* src, CvArr* dst,
                 CvPoint2D32f center, double M,
                 int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );

画像を対数極座標(Log-Polar)空間に再マッピングする

src
入力画像。
dst
出力画像。
center
出力精度が最大となるような変換の中心座標。
M
スケーリング係数の大きさ。以下を参照。
flags
補間方法(CvResizeを参照)と、以下に示すオプションフラグの組み合わせ。
  • CV_WARP_FILL_OUTLIERS - 出力画像の全ピクセルの値を埋める。対応ピクセルが入力画像外であるようなピクセルである場合は、 0がセットされる。
  • CV_WARP_INVERSE_MAP - このフラグは map_matrixが出力画像から入力画像への逆変換のための行列であることを意味するので、直接ピクセル補間に用いることができる。これがセットされていない場合、この関数は map_matrix を使って逆変換を計算する。


モルフォロジー演算(Morphological Operations)


★★
IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y,
                                             int shape, int* values=NULL );

構造要素を生成する

cols
構造要素の列数。
rows
構造要素の行数。
anchor_x
アンカーポイントの水平方向相対オフセット値。
anchor_y
アンカーポイントの垂直方向相対オフセット値。
shape
構造要素の形状。以下のような値を持つ。
  • CV_SHAPE_RECT, 矩形の構造要素
  • CV_SHAPE_CROSS, 十字の構造要素
  • CV_SHAPE_ELLIPSE, 楕円の構造要素
  • CV_SHAPE_CUSTOM, ユーザー定義形状の構造要素。この場合は、パラメータ values で考慮されるべき領域のマスク形状を指定する。
values
構造要素データへのポインタであり、データは構造要素行列の行ごとの走査によって表現される平面配列で与えられる。0以外の値の場合は構造要素を構成する点であることを示す。ポインタが NULL の場合は、全ての値が0でないことを示す、すなわち構造要素の形状は矩形となる。このパラメータは形状が CV_SHAPE_CUSTOM のときのみ有効である。

使用例は、4.7 膨張と収縮を参照。


★★
void cvReleaseStructuringElement( IplConvKernel** element );

構造要素を削除する

element
削除する構造要素へのポインタ。


★★★
void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

任意の構造要素を用いて画像の収縮を行う

src
入力画像。
dst
出力画像。
element
収縮に用いる構造要素。NULL の場合は, 3×3 の矩形形状の構造要素を用いる。
iterations
収縮の回数。

cvErode 関数は、隣接ピクセルの形状を決定する指定された構造要素を用いて、入力画像を収縮する。以下のように各ピクセルについてその隣接の最小値をピクセル値とする。

dst=erode(src,element):  dst(x,y)=min((x',y') in element))src(x+x',y+y')

この関数はインプレースモード(src=dstである入力)をサポートする。収縮は複数回 (iterations) 繰り返すことができる。 カラー画像の場合は、それぞれのチャンネルが独立に処理される。

使用例は、4.7 膨張と収縮を参照。


★★★
void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );

任意の構造要素を用いて画像の膨張を行う

src
入力画像。
dst
出力画像。
element
膨張に用いる構造要素。NULL の場合は, 3×3 の矩形形状の構造要素を用いる。
iterations
収縮の回数。

cvDilate 関数は、ピクセル隣接の形状を決定する指定された構造要素を用いて、入力画像を膨張する。以下のように各ピクセルについてその隣接の最大値をピクセル値とする。

dst=dilate(src,element):  dst(x,y)=max((x',y') in element))src(x+x',y+y')

この関数はインプレースモード(src=dstである入力)をサポートする。収縮は複数回 (iterations) 繰り返すことができる。 カラー画像の場合は、それぞれのチャンネルが独立に処理される。

使用例は、4.7 膨張と収縮を参照。


★★★
void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp,
                     IplConvKernel* element, int operation, int iterations=1 );

高度なモルフォロジー変換を実行する

src
入力画像。
dst
出力画像。
temp
テンポラリ画像(いくつかの処理で必要とされる)。
element
構造要素。
operation
モルフォロジー演算の種類(以下のうちのいずれか)
CV_MOP_OPEN - オープニング
CV_MOP_CLOSE - クロージング
CV_MOP_GRADIENT - モルフォロジー勾配(エッジ検出)
CV_MOP_TOPHAT - トップハット変換(top hat)
CV_MOP_BLACKHAT - ブラックハット変換(black hat)
iterations
収縮と膨張の繰り返し回数。

cvMorphologyEx 関数は、基本の演算として収縮と膨張を(組み合わせて)用いる高度なモルフォロジー変換を行うことができる。

オープニング:
dst=open(src,element)=dilate(erode(src,element),element)

クロージング:
dst=close(src,element)=erode(dilate(src,element),element)

モルフォロジー勾配:
dst=morph_grad(src,element)=dilate(src,element)-erode(src,element)

トップハット変換:
dst=tophat(src,element)=src-open(src,element)

ブラックハット変換:
dst=blackhat(src,element)=close(src,element)-src

テンポラリ画像 temp は、モルフォロジー勾配の時と、インプレースモードでのトップハット変換 と ブラックハット変換で必要となる。


フィルタと色変換(Filters and Color Conversion)


★★★
void cvSmooth( const CvArr* src, CvArr* dst,
               int smoothtype=CV_GAUSSIAN,
               int param1=3, int param2=0, double param3=0, double param4=0 );

指定された方法で画像の平滑化を行う

src
入力画像。
dst
出力画像。
smoothtype
平滑化の方法
  • CV_BLUR_NO_SCALE (スケーリング無しの単純平滑化) - ピクセル の param1×param2 隣接の総和。 隣接サイズが変化する可能性のある場合、 cvIntegral 関数を用いて、インテグラルイメージをあらかじめ計算しておくという方法がある。
  • CV_BLUR (単純平滑化[simple blur]) - ピクセルの param1×param2 隣接の総和を計算した後、1/(param1param2)によってスケーリングする。
  • CV_GAUSSIAN (ガウシアン平滑化[Gaussian blur]) - 画像とサイズ param1×param2 のガウシアンカーネルの畳み込み。
  • CV_MEDIAN (中央値平滑化[median blur]) - param1×param1 隣接(隣接形状が正方形)の中央値の取得。
  • CV_BILATERAL (エッジ保持平滑化フィルタ[bilateral filter]) - 色(輝度値)についてsigma=param1 と 領域(距離)についてsigma=param2 を持つ3x3のバイラテラルフィルタを適用する。バイラテラルフィルタに関する情報は http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html を参照。
param1
平滑化処理のパラメータ1。
param2
平滑化処理のパラメータ2。スケーリング有り/無しの単純平滑またはガウシアン平滑化の場合、param2 が0のときは param1 にセットされる.
param3
ガウシアン平滑化 の場合、このパラメータがガウシアンsigma(標準偏差)を示す。 0の場合、以下のようにカーネルサイズから計算する。
              sigma = (n/2 - 1)*0.3 + 0.8、ここで、水平カーネルの場合は、n=param1
                                               、垂直カーネルの場合は、n=param2
              
小さいサイズのカーネル (3×3 から 7×7 まで) の場合は標準偏差を用いる方がパフォーマンスが良い。 param1param2が 0 で、param3 が 非0の場合、 カーネルサイズはsigmaより計算される(十分な精度を得るため)。
param4
非正方形のガウシアンカーネルを使用する場合、垂直方向に異なるsigma 値(param3と違う値)指定するために用いられる。

cvSmooth 関数は、手法を指定して画像の平滑化を行う。 各手法は、以下に示すような特徴や制限を持つ。

スケーリング無しの平滑化は、シングルチャンネル画像を対象とし、8ビットフォーマットのデータを16ビットフォーマットへの累積(cvSobelcvLaplace と同様)、32ビット浮動小数点の32ビット浮動小数点への累積、をサポートしている。

単純平滑化とガウシアン平滑化は、1 あるいは 3チャンネル、8ビットと32ビット浮動小数点画像をサポートしている。 これら2つの手法は、インプレースモードでの処理が可能である

メディアンフィルタとバイラテラルフィルタは、1あるいは 3チャンネル、8ビット画像をサポートしている。インプレースモードでの処理は不可能である。


★★★
void cvFilter2D( const CvArr* src, CvArr* dst,
                 const CvMat* kernel,
                 CvPoint anchor=cvPoint(-1,-1));

画像とカーネルの畳み込みを行う

src
入力画像。
dst
出力画像。
kernel
畳み込み用のカーネルで、シングルチャンネルの浮動小数点型行列。異なるチャンネルに対して異なるカーネルを適用する場合は、 cvSplit を用いてそれぞれのカラープレーンを分離し、それぞれに対して処理を行う。
anchor
フィルタ対象ピクセルのカーネル内での相対位置を表す、カーネルのアンカー。デフォルトはカーネルの中心を表す特別な値(-1,-1)である。

cvFilter2D 関数は、入力画像に対して任意の線形フィルタを適用する。 インプレース処理がサポートされている。フィルタ範囲が部分的に画像より外に出てしまった場合は、画像内の近隣ピクセルから範囲外のピクセル値を補間する。



void cvCopyMakeBorder( const CvArr* src, CvArr* dst, CvPoint offset,
                       int bordertype, CvScalar value=cvScalarAll(0) );

画像をコピーし、その周りに境界線をつける


★★
void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL );

任意の矩形領域の画素値の総和を計算する

image
入力画像、W×H、8ビットあるいは浮動小数点(32fか64f)画像。
sum
インテグラルイメージ(integral image)、W+1×H+1、32ビット整数型あるいは倍精度浮動小数点型(64f)。
sqsum
各ピクセル値を2乗したインテグラルイメージ、W+1×H+1、倍精度浮動小数点型(64f)。
tilted_sum
45度回転させた入力画像のインテグラルイメージ、W+1×H+1sumと同じデータフォーマット。


★★★
void cvCvtColor( const CvArr* src, CvArr* dst, int code );

画像の色空間を変換する

src
入力画像、8ビット(8u)、16ビット(16u)、あるいは単精度浮動小数点型(32f)。
dst
出力画像、入力画像と同じデータタイプ。チャンネル数は違うこともある。
code
CV_<src_color_space>2<dst_color_space> の定数を用いて色空間の変換を指定 (以下参照)。

cvCvtColor 関数は、入力画像の色空間を変換する。 この関数は IplImage ヘッダ部の colorModelchannelSeq フィールドを無視するため、入力画像の色空間は正しく指定する必要がある (RGB空間の場合は、チャンネル順にも注意する。例えば BGR は B0 G0 R0 B1 G1 R1 ... のように並ぶ24ビットフォーマットであり、RGB は R0 G0 B0 R1 G1 B1 ... のように並ぶ24ビットフォーマットである)。

通常の R、G、B チャンネルのレンジは、以下の通り。

もちろん線形変換では、レンジを任意とする事も可能である。しかし非線形変換で正しい変換結果を得るためには、必要に応じて入力画像のスケーリングを行うべきである。

関数は以下のような変換が可能である。

使用例は、2.2 チュートリアル、3.1 セピア変換を参照。


★★★
void cvThreshold( const CvArr* src, CvArr* dst, double threshold,
                  double max_value, int threshold_type );

配列の要素に対して一定値での閾値処理を行う

src
入力配列 (シングルチャンネル、8ビット、あるいは32ビット浮動小数点型)。
dst
出力配列。src と同じデータタイプ、または8ビット。
threshold
閾値。
max_value
threshold_type が CV_THRESH_BINARYCV_THRESH_BINARY_INV のときに使用する最大値。
threshold_type
閾値処理の種類(説明参照)。

cvThreshold 関数はシングルチャンネルの配列に対して、固定閾値での閾値処理を行う。 この関数は特に、グレースケール画像からの2値化画像生成(cvCmpS もこの目的で使われる)や、ノイズ除去(例えば、あまりに大きい値またはあまりにも小さい値のピクセルを除去するなど)のために用いられることが多い。 以下に示す threshold_type のように数種類の閾値処理が可能。

threshold_type=CV_THRESH_BINARY:
src(x,y)>thresholdの場合は、dst(x,y) = max_value
                それ以外は、           0

threshold_type=CV_THRESH_BINARY_INV:
src(x,y)>thresholdの場合は、dst(x,y) = 0
                それ以外は、           max_value

threshold_type=CV_THRESH_TRUNC:
src(x,y)>thresholdの場合は、dst(x,y) = threshold
                それ以外は、           src(x,y)

threshold_type=CV_THRESH_TOZERO:
src(x,y)>thresholdの場合は、dst(x,y) = src(x,y)
                それ以外は、           0

threshold_type=CV_THRESH_TOZERO_INV:
src(x,y)>thresholdの場合は、dst(x,y) = 0
                それ以外は、           src(x,y)

以下に、閾値処理を種類別に図式化したものを示す。

使用例は、4.1 2値化を参照。


★★★
void cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value,
                          int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C,
                          int threshold_type=CV_THRESH_BINARY,
                          int block_size=3, double param1=5 );

配列に対して適応的な閾値処理を行う

src
入力画像。
dst
出力画像。
max_value
threshold_type が CV_THRESH_BINARY あるいは CV_THRESH_BINARY_INV のときに用いる最大値。
adaptive_method
適応的閾値処理で使用するアルゴリズム。CV_ADAPTIVE_THRESH_MEAN_C または CV_ADAPTIVE_THRESH_GAUSSIAN_C (説明参照)。
threshold_type
閾値処理の種類、以下のどちらか。
  • CV_THRESH_BINARY,
  • CV_THRESH_BINARY_INV
block_size
ピクセルの閾値を計算するために用いる隣接領域のサイズ: 3, 5, 7, ...
param1
各適応手法に応じたパラメータ. 適応手法が CV_ADAPTIVE_THRESH_MEAN_C およびCV_ADAPTIVE_THRESH_GAUSSIAN_C の場合は、 平均値または重み付き平均値から引く定数(説明参照)、負の値の場合もある。

cvAdaptiveThreshold 関数は、次式に従いグレースケール画像を2値画像に変換する。

threshold_type=CV_THRESH_BINARY:
src(x,y)>T(x,y)の場合は、dst(x,y) = max_value
             それ以外は、           0

threshold_type=CV_THRESH_BINARY_INV:
src(x,y)>T(x,y)の場合は、dst(x,y) = 0
             それ以外は、           max_value

ここで TI は、各ピクセル独自に計算された閾値.

手法 CV_ADAPTIVE_THRESH_MEAN_C では、注目ピクセルの block_size × block_size 隣接領域の平均から、param1 を引いた値。

手法 CV_ADAPTIVE_THRESH_GAUSSIAN_C では、注目ピクセルの block_size × block_size 隣接領域の重み付き総和(ガウシアン)から param1 を引いた値。


ピラミッドとその応用(Pyramids and the Applications)


★★★
void cvPyrDown( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 );

画像のダウンサンプリングを行う

src
入力画像。
dst
出力画像。入力画像の1/2の幅と高さ。
filter
畳み込みに使うフィルタ。現在は CV_GAUSSIAN_5x5 のみサポート。

cvPyrDown 関数は、ガウシアンピラミッド分解の1ステップであるダウンサンプリングを行う。 最初に入力画像と指定されたフィルタの畳み込みを行い、偶数行と偶数列を間引くことでダウンサンプリングを行う。


★★★
void cvPyrUp( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 );

画像のアップサンプリングを行う

src
入力画像。
dst
出力画像。入力画像の2倍の幅と高さ。
filter
畳み込みに使うフィルタ。現在は CV_GAUSSIAN_5x5 のみサポート。

cvPyrUp 関数は、ガウシアンピラミッド分解の1ステップであるアップサンプリングを行う。 最初に入力画像に0の行と列を挿入することでアップサンプリングを行った後、補間のために4倍した指定フィルタとの畳み込みを行う。そのため、出力画像は入力画像の4倍の大きさになる。


画像分割,領域結合,輪郭検出(Image Segmentation, Connected Components and Contour Retrieval)


★★
CvConnectedComp

接続されたコンポーネント

    typedef struct CvConnectedComp
    {
        double area; /* セグメント化されたコンポーネントの領域 */
        float value; /* セグメント化されたコンポーネントのグレースケール値 */
        CvRect rect; /* セグメント化されたコンポーネントのROI */
    } CvConnectedComp;

使用例については、4.9 物体追跡を参照。


★★
void cvFloodFill( CvArr* image, CvPoint seed_point, CvScalar new_val,
                  CvScalar lo_diff=cvScalarAll(0), CvScalar up_diff=cvScalarAll(0),
                  CvConnectedComp* comp=NULL, int flags=4, CvArr* mask=NULL );
#define CV_FLOODFILL_FIXED_RANGE (1 << 16)
#define CV_FLOODFILL_MASK_ONLY   (1 << 17)

接続されたコンポーネントを指定した色で塗りつぶす

image
入力画像。1チャンネルあるいは3チャンネル、8ビットあるいは浮動小数点型。CV_FLOODFILL_MASK_ONLYフラグ(以下を参照)がセットされたとき以外は、データが書き換えられる。
seed_point
接続されたコンポーネントの開始点。シードピクセル。
new_val
塗りつぶされる領域の新しいピクセル値(塗りつぶす値)。
lo_diff
現在の観測対象ピクセルと、コンポーネントに属する隣接ピクセル、 またはそのピクセルをコンポーネントに追加するためのシードピクセルとの、輝度値/色の差(違い)の許容下限値。 8ビットカラー画像のときは、パックされた値。
up_diff
現在の観測対象ピクセルと、コンポーネントに属する隣接ピクセル、 またはそのピクセルをコンポーネントに追加するためのシードピクセルとの、輝度値/色の差(違い)の許容上限値。 8ビットカラー画像のときは、パックされた値。
comp
構造体へのポインタ。この関数は、塗りつぶされた領域の情報を構造体に代入する。
flags
操作フラグ。下位ビットは関数内で用いられる連結性に関する値4(デフォルト)または8が入っている。 連結性は、どのピクセルを隣接ピクセルと見なすかを定義する。上位ビットは0、あるいは以下のフラグの組み合わせである。
  • CV_FLOODFILL_FIXED_RANGE - セットされている場合は、現在のピクセルとシードピクセルとの差が対象となる。それ以外は、隣接同士の差が対象となる(つまりこのフラグがセットされない場合、レンジは変動的である)。
  • CV_FLOODFILL_MASK_ONLY - セットされている場合は、この関数では画像を塗りつぶさない(new_val は無視される)が、 マスク(この場合、マスクはNULL以外の値でないといけない)は塗りつぶす.
mask
処理用マスク。シングルチャンネル8ビット画像でimageより横・縦とも2ピクセル大きくなければならない。 NULLでない場合、この関数はこのマスクの使用と更新を行う。そのためユーザがmaskの内容を初期化しなければならない。 Floodfillはマスク中の0でないピクセルを塗りつぶさない。例えば、エッジ検出の結果は、エッジ部分で塗りつぶしを堰き止めるためのマスクとして利用できる。 あるいは、塗りつぶし領域の重なりがないことを確認するために、複数回の関数の呼び出しで同じマスクを用いることができる。 注意:マスクのサイズが塗られる画像より大きいため、image中の(x,y)座標のピクセルに 対応するmask中のピクセル座標は(x+1,y+1)になる。


★★★
int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,
                    int header_size=sizeof(CvContour), int mode=CV_RETR_LIST,
                    int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) );

2値画像中の輪郭を見つける

image
入力画像(8ビットシングルチャンネル)。値が0以外のピクセルは「1」、0のピクセルは「0」とする - これは画像を2値として扱うことを意味する。グレースケール画像から2値画像を得るために、cvThresholdcvAdaptiveThreshold、あるいは cvCanny などを使うことができる。この関数は入力画像の内容を変更する。
storage
抽出された輪郭を保存する領域。
first_contour
出力パラメータ。一番外側の輪郭へのポインタが入っている。
header_size
シーケンスヘッダのサイズ。method=CV_CHAIN_CODEの場合、 >=sizeof(CvChain) 、それ以外の場合 >=sizeof(CvContour)。
mode
抽出モード
  • CV_RETR_EXTERNAL - 最も外側の輪郭のみ抽出
  • CV_RETR_LIST - 全ての輪郭を抽出し、リストに追加
  • CV_RETR_CCOMP - 全ての輪郭を抽出し、二つのレベルを持つ階層構造を構成する。一番目のレベルはコンポーネントの外側の境界線、二番目のレベルは穴(コンポーネントの内側に存在する)の境界線。
  • CV_RETR_TREE - 全ての輪郭を抽出し、枝分かれした輪郭を完全に表現する階層構造を構成する。
method
近似手法(CV_RETR_RUNS以外の全ての手法は、組み込まれた近似手法を用いる)。
  • CV_CHAIN_CODE - 出力はフリーマンチェーンコード(Freeman chain code)で表現される。他の手法ではポリゴン(頂点のシーケンス).
  • CV_CHAIN_APPROX_NONE - 全ての点をチェーンコードから点へ変換する。
  • CV_CHAIN_APPROX_SIMPLE - 水平・垂直・斜めの線分を圧縮する。すなわち、この関数はそれぞれの端点のみを残す。
  • CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS - Teh-Chinチェーンの近似アルゴリズム中の一つを適用する。
  • CV_LINK_RUNS - 値1の水平セグメントの接続に基づく、異なる輪郭を完全に抽出するアルゴリズムを適用する。 抽出モードが CV_RETR_LIST の場合のみ指定可能。
offset
オフセット。全ての輪郭点はこれによってシフトされる。これは、画像のROIから輪郭を抽出した後に、それらを画像全体の中で解析しなければならない場合に有用である。

cvFindContours 関数は、2値画像から輪郭を抽 出し、その個数を返す。ポインタ first_contour に結果が出力される。 ここには最も外側の輪郭へのポインタが入り、 輪郭が抽出されなかった場合(画像が完全に黒の場合)はNULLが入る。 他の輪郭へは、 h_nextv_nextを用いることで、 first_contour から辿ることができる。 cvDrawContours で説明されるサンプルは、接続コンポーネントを検出するためどのように輪郭を用いるかを示している。 輪郭は形状解析やオブジェクト認識などにも用いられる - OpenCVサンプルディレクトリの squares.c を参照。

使用例については、4.3 輪郭抽出を参照。


★★
CvContourScanner cvStartFindContours( CvArr* image, CvMemStorage* storage,
                                      int header_size=sizeof(CvContour),
                                      int mode=CV_RETR_LIST,
                                      int method=CV_CHAIN_APPROX_SIMPLE,
                                      CvPoint offset=cvPoint(0,0) );

輪郭走査処理の初期化を行う

image
入力画像。8ビットシングルチャンネルの2値化画像。
storage
抽出された輪郭データの保存領域。
header_size
シーケンスヘッダのサイズ。 method=CV_CHAIN_CODEの時、 >=sizeof(CvChain) 、それ以外の場合 >=sizeof(CvContour)。
mode
抽出モード。cvFindContours を参照。
method
近似手法。cvFindContoursと同様、但し CV_LINK_RUNS は使用不可。
offset
ROIのオフセット。cvFindContoursを参照。


★★
CvSeq* cvFindNextContour( CvContourScanner scanner );

画像中の次の輪郭を検索する

scanner
cvStartFindContours 関数で初期化された輪郭スキャナ。


★★
void cvSubstituteContour( CvContourScanner scanner, CvSeq* new_contour );

抽出された輪郭を置き換える

scanner
cvStartFindContours 関数で初期化された輪郭スキャナ。
new_contour
新しく置き換える輪郭。


★★
CvSeq* cvEndFindContours( CvContourScanner* scanner );

輪郭走査処理を終了する

scanner
輪郭スキャナへのポインタ。


★★
void cvPyrSegmentation( IplImage* src, IplImage* dst,
                        CvMemStorage* storage, CvSeq** comp,
                        int level, double threshold1, double threshold2 );

画像ピラミッドを用いたセグメント化を行う

src
入力画像。
dst
出力画像。
storage
結果として得られる連結されたコンポーネントのシーケンスを保存するための領域。
comp
セグメント化されたコンポーネントの出力シーケンスへのポインタ。
level
セグメント化のためのピラミッドの最大レベル。
threshold1
リンク構築のための誤差閾値。
threshold2
セグメントクラスタリングのための誤差閾値。


★★
void cvPyrMeanShiftFiltering( const CvArr* src, CvArr* dst,
     double sp, double sr, int max_level=1,
     CvTermCriteria termcrit=cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,5,1));

平均値シフト法による画像のセグメント化を行う

src
入力画像。8ビット、3チャンネル。
dst
出力画像。入力画像と同じフォーマット、同じサイズ。
sp
空間ウィンドウの半径。
sr
色空間ウィンドウの半径。
max_level
セグメント化のためのピラミッドの最大レベル。
termcrit
終了条件。平均値シフトをいつまで繰り返すか。


★★
void cvWatershed( const CvArr* image, CvArr* markers );

watershedアルゴリズムによる画像のセグメント化を行う

image
入力画像。8ビット、3チャンネル画像。
markers
入出力画像。32ビットシングルチャンネルのマーカー画像(マップ)。


画像と形状のモーメント(Image and Contour Moments)


★★
void cvMoments( const CvArr* arr, CvMoments* moments, int binary=0 );

ポリゴンまたはラスタ形状の3次までのモーメントを計算する

arr
画像(1チャンネル、あるいはCOIをもつ3チャンネル画像) あるいはポリゴン (CvSeqで表される点群、または点のベクトル)。
moments
画像モーメントを表す構造体へのポインタ。
binary
(画像の場合のみ)このフラグが0でない場合、値0のピクセルは0として、その他のピクセル値は1として扱われる。

使用例は、2.2 チュートリアルを参照。


★★
double cvGetSpatialMoment( CvMoments* moments, int x_order, int y_order );

画像モーメント構造体から空間モーメントを計算する

moments
cvMoments によって得られる画像モーメント構造体。
x_order
取り出すモーメントのx方向の次数、x_order >= 0.
y_order
取り出すモーメントのy方向の次数、 y_order >= 0 かつ x_order + y_order <= 3.

使用例は、2.2 チュートリアルを参照。


★★
double cvGetCentralMoment( CvMoments* moments, int x_order, int y_order );

画像モーメント構造体から中心モーメントを計算する

moments
画像モーメント構造体へのポインタ。
x_order
取り出すモーメントのx方向の次数、x_order >= 0.
y_order
取り出すモーメントのy方向の次数、 y_order >= 0 かつ x_order + y_order <= 3.


★★
double cvGetNormalizedCentralMoment( CvMoments* moments, int x_order, int y_order );

画像モーメント構造体から正規化された中心モーメントを計算する

moments
画像モーメント構造体へのポインタ。
x_order
取り出すモーメントのx方向の次数、x_order >= 0.
y_order
取り出すモーメントのy方向の次数、 y_order >= 0 かつ x_order + y_order <= 3.


★★
void cvGetHuMoments( CvMoments* moments, CvHuMoments* hu_moments );

7つのHuモーメント不変量を計算する

moments
画像モーメント構造体へのポインタ。
hu_moments
Huモーメント構造体へのポインタ。


特殊な画像変換(Special Image Transforms)


★★★
CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method,
                      double rho, double theta, int threshold,
                      double param1=0, double param2=0 );

ハフ(Hough)変換を用いて2値画像から直線を検出する

image
入力画像(8ビット、シングルチャンネル、2値化画像)。確率的な手法の場合は、画像は関数内で変換される。
line_storage
検出された線を保存する領域。メモリストレージ(この場合、関数によって線分のシーケンスがストレージ内につくられ、そのポインタが返される)、あるいは、線のパラメータが記述された特定のタイプ(下参照)の1行の行列/1列の行列 (CvMat*)。行列のヘッダは、そのcolsrowsが検出された線の数となるように、この関数によって変更される。もし、line_storage が行列で、かつ実際の線の数が行列のサイズを超える場合は、線の最大可能数が返される(標準的ハフ変換の場合は 投票数でソートされる)。
method
ハフ変換の種類、以下のいずれか一つ。
  • CV_HOUGH_STANDARD - 標準的ハフ変換。全ての線分は2つの浮動小数点値 (ρ, θ)で表される。ここでρ は点(0,0) から線分までの距離、θ はx軸と線分の法線が成す角度。 そのため、行列(作成されるシーケンス)は、CV_32FC2 タイプとなる。
  • CV_HOUGH_PROBABILISTIC - 確率的ハフ変換(画像に長い線が少ない場合に有効)。全ての線を返すのではなく、線分を返す。 全ての線分は始点と終点で表され、行列(作成されるシーケンス)は、CV_32SC4 タイプとなる。
  • CV_HOUGH_MULTI_SCALE -マルチスケール型の古典的ハフ変換。 線は CV_HOUGH_STANDARD と同様の方法でエンコードされる。
rho
距離解像度(1ピクセル当たりの単位)。
theta
角度解像度(ラジアン単位で計測)。
threshold
閾値パラメータ。対応する投票数がthresholdより大きい場合のみ、抽出された線が返される。
param1
各手法に応じた1番目のパラメータ。
  • 標準的ハフ変換では、使用しない(0)。
  • 確率的ハフ変換では、最小の線の長さ。
  • マルチスケールハフ変換では、 距離解像度rhoの除数。 (荒い距離解像度では rho であり、詳細な解像度では (rho / param1) となる)。
param2
各手法に応じた2番目のパラメータ。
  • 標準的ハフ変換では、使用しない (0)。
  • 確率的ハフ変換では、同一線上に存在する線分として扱う(つまり、それらを統合しても問題ない)、二つの線分の最大の間隔。
  • マルチスケールハフ変換では、角度解像度 thetaの除数。 (荒い角度解像度では theta であり、詳細な解像度では (theta / param2) となる)。

cvHoughLines2 関数は、線検出のための3種類のハフ変換を実行する。

使用例は、4.5 ハフ変換を参照。


★★★
CvSeq* cvHoughCircles( CvArr* image, void* circle_storage,
                       int method, double dp, double min_dist,
                       double param1=100, double param2=100,
                       int min_radius=0, int max_radius=0 );

ハフ変換を用いてグレースケール画像中の円を検出する

image
入力画像 (8ビット、シングルチャンネル、グレースケール)。
circle_storage
検出された円を保存する領域。メモリストレージ(この場合、関数によって円のシーケンスがストレージ内につくられ、そのポインタが返される)、あるいは円のパラメータが記述されたCV_32FC3型の1行の行列/1列の行列 (CvMat*)。 行列のヘッダは、そのcolsrowsが検出された円の数となるように、この関数によって変更される。もし、circle_storage が行列で、かつ実際の円の数が行列のサイズを超える場合は、円の最大可能数が返される。全ての円は3つの浮動小数点値(中心座標(x,y)と半径)としてエンコードされる。
method
現状では、CV_HOUGH_GRADIENT(基本的な2段階のハフ変換、 [Yuen03]参照)のみ実装されている.
dp
円の中心を求める際に用いられる計算時の解像度。例えば、この値が 1 の場合は、計算は入力画像と同じ解像度で行われる。2 の場合は、計算は幅・高さともに1/2の解像度になる、等。
min_dist
円検出における中心座標間の最小間隔。この値が非常に小さい場合は、正しく抽出されるべき円の近傍に複数の間違った円が検出されることになる。また、逆に非常に大きい場合は、円検出に失敗する。
param1
手法に応じた1番目のパラメータ。 CV_HOUGH_GRADIENT の場合は、Cannyのエッジ検出器で用いる二つの閾値の高い方の値 (低い方の値は、この値を1/2したものになる)。
param2
手法に応じた2番目のパラメータ。 CV_HOUGH_GRADIENT の場合は、中心検出計算時の閾値。小さすぎると誤検出が多くなる。これに対応する値が大きい円から順に検出される。
min_radius
検出すべき円の最小半径。
max_radius
検出すべき円の最大半径 デフォルトの最大半径は max(image_width, image_height) にセットされている。

cvHoughCircles 関数は、グレースケール画像中の円をハフ変換を用いて検出する。


★★★
void cvDistTransform( const CvArr* src, CvArr* dst, int distance_type=CV_DIST_L2,
                      int mask_size=3, const float* mask=NULL, CvArr* labels=NULL );

入力画像中の値が0でないピクセルから、最も近い値が0のピクセルまでの距離を計算する

src
入力画像(8ビット、シングルチャンネル、2値画像)。
dst
距離計算結果をピクセル値として持つ出力画像 (32ビット浮動小数点型、シングルチャンネル)。
distance_type
距離の種類。CV_DIST_L1, CV_DIST_L2, CV_DIST_CCV_DIST_USER
mask_size
距離変換マスクのサイズで、3、5、0 のいずれか。 CV_DIST_L1CV_DIST_C の場合、このパラメータ値は3に固定される。なぜなら 3×3 は 5×5 のマスクを用いたときと同じ結果で、かつ計算速度が速いためである。mask_size==0の場合、距離計算に別の近似無しアルゴリズムが用いられる。
mask
ユーザ定義の距離の場合はユーザ定義のマスク。3×3のマスクを用いる場合は2つの値(上下シフト値、斜めシフト値)を指定、5×5のマスクを用いる場合は3つの値(上下シフト値、斜めシフト値、ナイト移動シフト値(桂馬飛びのシフト値))を指定する。
labels
オプション出力。整数ラベルに変換された2次元配列で、srcdstと同じサイズ。現在は mask_size==3 あるいは 5 のときのみに使用される。

cvDistTransform 関数は、2値画像の各ピクセルから最も近い値が0のピクセルまでの近似距離、あるいは正確な距離を計算する。mask_size==0 の場合は、この関数は高精度に距離計算を行うアルゴリズム[Felzenszwalb04]を用いる。mask_size==3 あるいは 5の場合は、近似距離を計算するアルゴリズム [Borgefors86]を用いる。

近似距離計算アルゴリズムの計算方法を説明する。関数は、値0のピクセルに対して、距離0をセットする。そのほかのピクセルについては、値0のピクセルに至るまでの基本シフトでの移動(水平・垂直・斜め・(5×5のマスクを用いたときは)ナイト移動)による最短経路を探索する。基本移動の移動総量を距離として全長距離を計算する。 距離関数は対称であるべきなので、水平・垂直のシフトコスト(aとする)は同じでないといけない。また、全ての斜めシフトコスト(bとする)、ナイト移動コスト(cとする)もまた、同じでないといけない。 タイプCV_DIST_CCV_DIST_L1 の場合、距離は正確に計算されるが、タイプ CV_DIST_L2 (ユークリッド距離)の場合、距離はいくらかの相対誤差を持つ(5×5 のマスクを用いると、より高精度な値を得ることができる)。OpenCVでは以下のように、[Borgefors86]で推奨されている値を用いる。

CV_DIST_C (3×3):
a=1, b=1

CV_DIST_L1 (3×3):
a=1, b=2

CV_DIST_L2 (3×3):
a=0.955, b=1.3693

CV_DIST_L2 (5×5):
a=1, b=1.4, c=2.1969

一般に、高速に近似距離を求める場合は CV_DIST_L2、 3×3 マスクを用い、 高精度な距離が必要な場合は CV_DIST_L2、 5×5 マスクを用いる。

出力パラメータ labelsNULLでない場合、この関数は、すべての非0のピクセルに対して値0のピクセルから構成される最も近い接続コンポーネントも検索する。探索される接続コンポーネントは、関数の最初の部分で輪郭として認識されている。

このモードでの処理時間は O(N) である(Nはピクセル数)。 そのため、この関数を用いて2値化画像の近似ボロノイ図を高速に計算することができる。


★★
void cvInpaint( const CvArr* src, const CvArr* mask, CvArr* dst,
                int flags, double inpaintRadius );

画像中の選択領域を修復する

src
入力画像(8ビット、1チャンネルあるいは3チャンネル)。
mask
修復マスク。8ビット、1チャンネル画像。 非0のピクセルが、修復の必要がある領域であることを示す。
dst
出力画像(入力画像と同じサイズ、同じタイプ)。
flags
修復方法、以下のいずれか。
CV_INPAINT_NS - ナビエ・ストークス(Navier-Stokes)ベースの手法
CV_INPAINT_TELEA - Alexandru Teleaによる手法 [Telea04]
inpaintRadius
修復されるピクセルの円状の隣接領域を示す半径。


ヒストグラム(Histograms)


★★★
CvHistogram

多次元ヒストグラムの構造体

typedef struct CvHistogram
{
    int     type;
    CvArr*  bins;
    float   thresh[CV_MAX_DIM][2]; /* 一様分布ヒストグラム用の配列 */
    float** thresh2; /* 非一様分布ヒストグラム用の配列 */
    CvMatND mat; /* ヒストグラム配列用に組み込まれた行列のヘッダ */
}
CvHistogram;

★★★
CvHistogram* cvCreateHist( int dims, int* sizes, int type,
                           float** ranges=NULL, int uniform=1 );

ヒストグラムを生成する

dims
ヒストグラムの次元数。
sizes
ヒストグラム各次元のサイズを示す配列。
type
ヒストグラム表現フォーマット。CV_HIST_ARRAY は、ヒストグラムデータが多次元で密な配列CvMatNDで表現されていることを意味する。 CV_HIST_SPARSE は、ヒストグラムデータが多次元で疎な配列 CvSparseMat で表現されていることを意味する。
ranges
ヒストグラムのビン(bin)(値域)を示す配列。このパラメータの意味はパラメータuniformに依存している。このレンジは、ヒストグラムを計算したり、またどのヒストグラムのビンが入力画像のどの値やどのデータ要素に対応するかを決めるためのバックプロジェクションで用いられる。
uniform
一様性に関するフラグ。非0の場合、ヒストグラムは等間隔のビンを持ち、 0<=i<dims の範囲のranges[i] は、それぞれi番目の次元のヒストグラムの下位と上位の境界を示す2つの値からなる配列である。各ヒストグラムのビンについて、i番目の入力タプル値のレンジを決めるために、[lower, upper]で表される全レンジは、 sizes[i]個に等しく分割される。0の場合、ranges配列のi番目の要素は、lower0, upper0, lower1, upper1 == lower2, ..., uppersizes[i]-1というsizes[i]+1 個の要素を持つ。ここで、lowerj , upperjはj番目のビンに対するi番目の入力タプル値の上下の境界をそれぞれ表す。このフラグが0であろうとなかろうと、ヒストグラムのビンの指定された範囲を越えるような入力値は、cvCalcHist ではカウントされず、cvCalcBackProject では0で満たされる。

cvCreateHist 関数は、指定サイズのヒストグラムを生成し、そのヒストグラムのポインタを返す。 配列 ranges が 0 の場合は、ヒストグラムのビンは、後からcvSetHistBinRanges 関数を用いて決定される。 しかし、cvCalcHistcvCalcBackProject においてはビンのレンジを設定せずに、8ビット画像を、0..255 の等間隔ビンであると仮定して処理する。

使用例は、4.2 ヒストグラムを参照。


★★★
void cvSetHistBinRanges( CvHistogram* hist, float** ranges, int uniform=1 );

ヒストグラムのビンのレンジをセットする

hist
ヒストグラム。
ranges
ビンのレンジの配列。cvCreateHist参照。
uniform
一様性フラグ。cvCreateHist参照。

cvSetHistBinRanges 関数は、ヒストグラムのビンのレンジをセットする独立関数である。 パラメータrangesuniform の詳しい説明は cvCalcHist 関数を参照のこと。この関数ではレンジの初期化も可能である。 ヒストグラムのビンのレンジは、ヒストグラムやバックプロジェクションの計算前にセットしておかなければならない。


★★★
void cvReleaseHist( CvHistogram** hist );

ヒストグラムを解放する

hist
解放するヒストグラムへのポインタのポインタ。

cvReleaseHist 関数は、ヒストグラム(ヘッダ・データ共)を解放する。 ヒストグラムへのポインタは、この関数でクリアされる。 ポインタ*hist が既にNULLである場合、この関数は何も行わない。


★★★
void cvClearHist( CvHistogram* hist );

ヒストグラムをクリアする

hist
ヒストグラム。

cvClearHist 関数は、密なヒストグラムの場合、全てのヒストグラムのビンを0にセットする、 また疎なヒストグラムの場合は、すべてのヒストグラムのビンを削除する。


★★
CvHistogram* cvMakeHistHeaderForArray( int dims, int* sizes, CvHistogram* hist,
                                        float* data, float** ranges=NULL, int uniform=1 );

配列からヒストグラムを作成する

dims
ヒストグラムの次元数。
sizes
ヒストグラムの各次元のサイズの配列。
hist
ヒストグラムのヘッダ。この関数で初期化される。
data
ヒストグラムのビンを保存するための配列。
ranges
ヒストグラムのビンのレンジ。cvCreateHist参照。
uniform
一様性フラグ。cvCreateHist参照。


★★
#define cvQueryHistValue_1D( hist, idx0 ) \
    cvGetReal1D( (hist)->bins, (idx0) )
#define cvQueryHistValue_2D( hist, idx0, idx1 ) \
    cvGetReal2D( (hist)->bins, (idx0), (idx1) )
#define cvQueryHistValue_3D( hist, idx0, idx1, idx2 ) \
    cvGetReal3D( (hist)->bins, (idx0), (idx1), (idx2) )
#define cvQueryHistValue_nD( hist, idx ) \
    cvGetRealND( (hist)->bins, (idx) )

ヒストグラムのビンの値の問い合わせを行う

hist
ヒストグラム。
idx0, idx1, idx2, idx3
ビンのインデックス。
idx
インデックスの配列。

マクロ cvQueryHistValue_*D は、1〜n次元ヒストグラムの指定されたビンの値を返す。 疎なヒストグラムの場合で、ビンがヒストグラムに存在せず、新しいビンも作成されない場合、この関数は0を返す。


★★
#define cvGetHistValue_1D( hist, idx0 ) \
    ((float*)(cvPtr1D( (hist)->bins, (idx0), 0 ))
#define cvGetHistValue_2D( hist, idx0, idx1 ) \
    ((float*)(cvPtr2D( (hist)->bins, (idx0), (idx1), 0 ))
#define cvGetHistValue_3D( hist, idx0, idx1, idx2 ) \
    ((float*)(cvPtr3D( (hist)->bins, (idx0), (idx1), (idx2), 0 ))
#define cvGetHistValue_nD( hist, idx ) \
    ((float*)(cvPtrND( (hist)->bins, (idx), 0 ))

ヒストグラムのビンへのポインタを返す

hist
ヒストグラム。
idx0, idx1, idx2, idx3
ビンのインデックス。
idx
インデックスの配列。


★★
void cvGetMinMaxHistValue( const CvHistogram* hist,
                           float* min_value, float* max_value,
                           int* min_idx=NULL, int* max_idx=NULL );

最大値、最小値を持つビンを求める

hist
ヒストグラム。
min_value
ヒストグラムの最小値へのポインタ。
max_value
ヒストグラムの最大値へのポインタ。
min_idx
最小値の場所の配列へのポインタ。
max_idx
最大値の場所の配列へのポインタ。

使用例は、4.2 ヒストグラムを参照。


★★
void cvNormalizeHist( CvHistogram* hist, double factor );

ヒストグラムの正規化を行う

hist
ヒストグラムへのポインタ。
factor
正規化係数。


★★
void cvThreshHist( CvHistogram* hist, double threshold );

ヒストグラムの閾値処理を行う

hist
ヒストグラムへのポインタ。
threshold
閾値レベル。


★★
double cvCompareHist( const CvHistogram* hist1, const CvHistogram* hist2, int method );

二つの密なヒストグラムを比較する

hist1
一番目の密なヒストグラム。
hist2
二番目の密なヒストグラム。
method
比較手法。以下のいずれか。
  • CV_COMP_CORREL
  • CV_COMP_CHISQR
  • CV_COMP_INTERSECT
  • CV_COMP_BHATTACHARYYA


★★
void cvCopyHist( const CvHistogram* src, CvHistogram** dst );

ヒストグラムのコピーを行う

src
コピー元のヒストグラム。
dst
コピー先のヒストグラムへのポインタ。


★★★
void cvCalcHist( IplImage** image, CvHistogram* hist,
                 int accumulate=0, const CvArr* mask=NULL );

画像(群)のヒストグラムを計算する

image
入力画像群( CvMat** 形式でも構わない)。全て同じサイズ・タイプ。
hist
ヒストグラムへのポインタ。
accumulate
計算フラグ。セットされている場合は、ヒストグラムは処理前には最初にクリアされない。 この特徴により、ユーザが複数の画像から単一のヒストグラムを作成する事や、オンラインでヒストグラムを更新する事が可能である。
mask
処理マスク。入力画像中のどのピクセルをカウントするかを決定する。

cvCalcHist 関数は、一つ以上のシングルチャンネル画像からヒストグラムを計算する。 ヒストグラムのビンを増加(インクリメント)するために用いられるタプルの各要素は、 対応する入力画像群の同じ場所から取り出される。

使用例は、4.2 ヒストグラムを参照。


★★
void cvCalcBackProject( IplImage** image, CvArr* back_project, const CvHistogram* hist );

バックプロジェクションの計算を行う

image
入力画像群( CvMat** 形式でも構わない)。すべて同一サイズ、同一タイプ。
back_project
出力のバックプロジェクション画像。入力画像群と同じタイプ。
hist
ヒストグラム。

使用例は、4.9 物体追跡を参照。


★★
void cvCalcBackProjectPatch( IplImage** images, CvArr* dst,
                             CvSize patch_size, CvHistogram* hist,
                             int method, float factor );

ヒストグラムの比較に基づき画像内部でのテンプレート位置を求める

images
入力画像群( CvMat** 形式でも構わない)。すべて同じサイズ。
dst
出力画像。
patch_size
入力画像群上をスライドさせるテンプレートのサイズ。
hist
テンプレートのヒストグラム。
method
比較方法。値は cvCompareHist 関数に渡される(この関数に関する記述を参照)。
factor
ヒストグラムの正規化係数。出力画像の正規化スケールに影響する。値に確信がない場合は、1にする。


★★
void cvCalcProbDensity( const CvHistogram* hist1, const CvHistogram* hist2,
                         CvHistogram* dst_hist, double scale=255 );

一つのヒストグラムをもう一方のヒストグラムで割る

hist1
一番目のヒストグラム(除数)。
hist2
二番目のヒストグラム。
dst_hist
出力ヒストグラム。
scale
出力ヒストグラムのスケール係数。


★★
void cvEqualizeHist( const CvArr* src, CvArr* dst );

グレースケール画像のヒストグラムを均一化する。

src
入力画像。8ビットシングルチャンネル。
dst
出力画像。srcと同じサイズ・同じデータタイプ。


マッチング(Matching)


★★★
void cvMatchTemplate( const CvArr* image, const CvArr* templ,
                      CvArr* result, int method );

テンプレートと重なった画像領域を比較する

image
テンプレートマッチングを行う画像。 8ビットか32ビット浮動小数点型でなければならない。
templ
探索用テンプレート。画像より大きくてはならない、かつ画像と同じタイプである必要がある。
result
比較結果のマップ。シングルチャンネルの32ビット浮動小数点型データ。imageW×Htemplw×h ならば、 resultW-w+1×H-h+1のサイズが必要。
method
テンプレートマッチングの方法(以下を参照)。

cvMatchTemplate 関数は、 cvCalcBackProjectPatch に類似している。 templを、image全体に対してスライドさせ、それとサイズ w×h で重なる領域とを指定された方法で比較し、その結果を result に保存する。 以下に、この関数で指定可能な比較手法を表す式を示す。 (I は画像を、T はテンプレートを、R は結果をそれぞれ表す。 総和計算は、以下のようにテンプレートと(または)画像領域に対して行われる。x'=0..w-1, y'=0..h-1)。

method=CV_TM_SQDIFF:
R(x,y)=sumx',y'[T(x',y')-I(x+x',y+y')]2

method=CV_TM_SQDIFF_NORMED:
R(x,y)=sumx',y'[T(x',y')-I(x+x',y+y')]2/sqrt[sumx',y'T(x',y')2•sumx',y'I(x+x',y+y')2]

method=CV_TM_CCORR:
R(x,y)=sumx',y'[T(x',y')•I(x+x',y+y')]

method=CV_TM_CCORR_NORMED:
R(x,y)=sumx',y'[T(x',y')•I(x+x',y+y')]/sqrt[sumx',y'T(x',y')2•sumx',y'I(x+x',y+y')2]

method=CV_TM_CCOEFF:
R(x,y)=sumx',y'[T'(x',y')•I'(x+x',y+y')],

where T'(x',y')=T(x',y') - 1/(w•h)•sumx",y"T(x",y")
      I'(x+x',y+y')=I(x+x',y+y') - 1/(w•h)•sumx",y"I(x+x",y+y")

method=CV_TM_CCOEFF_NORMED:
R(x,y)=sumx',y'[T'(x',y')•I'(x+x',y+y')]/sqrt[sumx',y'T'(x',y')2•sumx',y'I'(x+x',y+y')2]

比較終了後、cvMinMaxLoc 関数により、最も良いマッチング結果を最小値(CV_TM_SQDIFF*)あるいは最大値(CV_TM_CCORR* と CV_TM_CCOEFF*)として検出することができる。カラー画像、カラーテンプレートの場合は、分母・分子それぞれの総和計算は全てのチャンネルについて行われる(各チャンネルで用いる平均値はそれぞれ違う)。

使用例は、4.6 対応領域探索を参照。


★★★
double cvMatchShapes( const void* object1, const void* object2,
                      int method, double parameter=0 );

二つの形状を比較する

object1
1番目の輪郭、あるいはグレースケール画像。
object2
2番目の輪郭、あるいはグレースケール画像。
method
比較方法。CV_CONTOUR_MATCH_I1、 CV_CONTOURS_MATCH_I2、あるいは CV_CONTOURS_MATCH_I3 のいずれか。
parameter
それぞれの比較手法特有のパラメータ(現在未使用)。

cvMatchShapes 関数は、二つの形状を比較する。以下に示すように、実装されている3つの手法のいずれもHuモーメント(cvGetHuMoments参照)を用いている (ここでAobject1Bobject2を示す)。

method=CV_CONTOURS_MATCH_I1:
I1(A,B)=sumi=1..7abs(1/mAi - 1/mBi)

method=CV_CONTOURS_MATCH_I2:
I2(A,B)=sumi=1..7abs(mAi - mBi)

method=CV_CONTOURS_MATCH_I3:
I3(A,B)=sumi=1..7abs(mAi - mBi)/abs(mAi)

ここで、
mAi=sign(hAi)•log(hAi),
mBi=sign(hBi)•log(hBi),
hAi, hBi は、AとBそれぞれのHuモーメント。

★★
float cvCalcEMD2( const CvArr* signature1, const CvArr* signature2, int distance_type,
                  CvDistanceFunction distance_func=NULL, const CvArr* cost_matrix=NULL,
                  CvArr* flow=NULL, float* lower_bound=NULL, void* userdata=NULL );
typedef float (*CvDistanceFunction)(const float* f1, const float* f2, void* userdata);

二つの、重み付き点分布間の 「最小コスト(minimal work)」 距離を計算する。

signature1
1番目のシグネチャ(点分布)、size1×dims+1の浮動小数点型行列。 各行は座標に従った重みを保存する。ユーザ定義のコスト行列を用いる場合は、1列の行列(重みだけ)でも構わない。
signature2
2番目のシグネチャ(点分布)(signature1と同じフォーマット)。行数や重みの合計が異なることもあるが、この場合は余分の"dummy" 点が signature1signature2 のどちらかに追加される。
distance_type
用いる評価指標。 CV_DIST_L1, CV_DIST_L2, CV_DIST_C は 標準評価指標を表す。CV_DIST_USER はユーザ定義関数 distance_func あるいは、あらかじめ計算された cost_matrix が用いられることを意味する。
distance_func
ユーザ定義距離関数。2点の座標を与えると、その点間の距離を返す。
cost_matrix
ユーザ定義の size1×size2のコスト行列。 少なくとも、cost_matrixdistance_func のいずれか一つは NULL でなければならない。 コスト行列を用いる場合は、下限値(下記参照)の計算は距離定義関数を必要とするため不可能である。
flow
結果の size1×size2のフロー行列(flow matrix)。 flowijsignature1のi番目の点からsignature2のj番目の点へのフローを示す。
lower_bound
オプションの入出力パラメータ。二つのシグネチャ間の距離(重心間の距離)の下限値。ユーザ定義コスト行列が用いられる場合、点分布同士の重みの合計が等しくない場合、あるいは、重みだけで構成されるシグネチャが存在する(つまり、シグネチャ行列が1列だけの行列)場合など、下限値は計算されないことがある。ユーザは 必ず *lower_bound を初期化しなければならない。 計算された重心間の距離が *lower_bound 以上の場合(シグネチャ間が十分離れていることを意味する)、この関数はEMDを計算しない。いずれの場合でも、*lower_bound には、戻り値である計算された重心間の距離がセットされる。従って、重心間距離とEMDの両方の計算が必要な場合は、*lower_bound を 0 にセットする必要がある。
userdata
ユーザ定義の距離関数に渡されるオプションデータへのポインタ。


構造解析(Structural Analysis)


輪郭処理(Contour Processing)


★★
CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage,
                       int method=CV_CHAIN_APPROX_SIMPLE,
                       double parameter=0, int minimal_perimeter=0, int recursive=0 );

フリーマンチェーン(Freeman chain)をポリラインで近似する

src_seq
他のチェーンから参照可能なチェーンへのポインタ。
storage
計算結果保存用のストレージ。
method
推定手法(cvFindContours 関数を参照)。
parameter
メソッドパラメータ(現在は使われていない)。
minimal_perimeter
minimal_perimeter以上の周長をもつ輪郭のみを計算する。その他のチェーンは結果の構造体から削除される。
recursive
0ではない場合、src_seqからh_nextあるいはv_nextによって辿ることができる全てのチェーンを近似する。0の場合、単一のチェーンを近似する。



void cvStartReadChainPoints( CvChain* chain, CvChainPtReader* reader );

チェーンリーダを初期化する



CvPoint cvReadChainPoint( CvChainPtReader* reader );

次のチェーン上の点を得る


★★
CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemStorage* storage,
                     int method, double parameter, int parameter2=0 );

指定した精度でポリラインを近似する

src_seq
点のシーケンスまたは配列。
header_size
近似されたポリラインのヘッダサイズ。
storage
近似された輪郭の保存場所。NULLの場合、入力シーケンスのストレージが使われる。
method
近似方法。CV_POLY_APPROX_DPのみサポートされる。 これはDouglas-Peuckerアルゴリズムに相当する。
parameter
近似方法に依存するパラメータ。CV_POLY_APPROX_DPの場合には、要求する近似精度である。
parameter2
src_seqがシーケンスの場合、単一のシーケンスが近似されるか、 同じレベルまたはsrc_seq以下の全てのシーケンスが近似される(cvFindContoursの階層的な輪郭の構造を参照)。 src_seqが点の配列(CvMat*)の場合、 このパラメータは輪郭が閉じている(parameter2!=0)か、開いているか(parameter2=0)を指定する。


★★
CvRect cvBoundingRect( CvArr* points, int update=0 );

点列を包含するまっすぐな(傾いていない)矩形を求める

points
シーケンス(CvSeq*, CvContour*)か、点のベクトル(CvMat*)か、非0のピクセルを考慮した8ビット1チャンネルマスク画像 (CvMat*, IplImage*)のいずれかで表現された2次元の点列。
update
更新フラグ。以下にフラグの値とpointsの型の利用可能な組み合わせを列挙する:
  • pointsがCvContour* で、update=0の場合: 包含矩形は計算されず、輪郭ヘッダのrectフィールドから読み込まれる。
  • pointsがCvContour* で、update=1の場合: 包含矩形は計算され、輪郭ヘッダのrectフィールドに書き込まれる。 例えば、このモードはcvFindContours で使われる。
  • pointsがCvSeq*かCvMat*の場合: updateは無視されて、包含矩形は計算されて返される。


★★
double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );

輪郭の全体または部分領域を計算する

contour
輪郭(頂点のシーケンスまたは配列)。
slice
注目領域の輪郭の始点と終点。デフォルトでは全領域が計算される。


★★
double cvArcLength( const void* curve, CvSlice slice=CV_WHOLE_SEQ, int is_closed=-1 );

輪郭の周長または曲線の長さを計算する

curve
輪郭点のシーケンスまたは配列。
slice
曲線の始点と終点。デフォルトでは曲線の全ての長さが計算される。
is_closed
閉曲線かどうかを示す。次の3つの状態がある:
  • is_closed=0 - 曲線は閉曲線として扱われない。
  • is_closed>0 - 曲線は閉曲線として扱われる。
  • is_closed<0 - 曲線がシーケンスの場合、 ((CvSeq*)curve)->flagsのフラグCV_SEQ_FLAG_CLOSEDから閉曲線かどうかを判別する。そうでない(曲線が点の配列(CvMat*)で表現される)場合、閉曲線として扱われない。



CvContourTree* cvCreateContourTree( const CvSeq* contour, CvMemStorage* storage, double threshold );

輪郭の階層的表現を生成する



CvSeq* cvContourFromContourTree( const CvContourTree* tree, CvMemStorage* storage,
                                 CvTermCriteria criteria );

ツリーから輪郭を復元する



double cvMatchContourTrees( const CvContourTree* tree1, const CvContourTree* tree2,
                            int method, double threshold );

ツリー表現を使って2つの輪郭を比較する


計算幾何(Computational Geometry)


★★
CvRect cvMaxRect( const CvRect* rect1, const CvRect* rect2 );

与えられた二つの矩形を包含する矩形を見つける

rect1
一つ目の長方形。
rect2
二つ目の長方形。


★★
CvBox2D

回転が考慮された2次元の箱

typedef struct CvBox2D
{
    CvPoint2D32f center;  /* 箱の中心 */
    CvSize2D32f  size;    /* 箱の幅と長さ */
    float angle;          /* 水平軸と始めの辺(長さ方向の辺)との角度(度) */
}
CvBox2D;

使用例は、4.9 物体追跡を参照。



CvSeq* cvPointSeqFromMat( int seq_kind, const CvArr* mat,
                          CvContour* contour_header,
                          CvSeqBlock* block );

点のベクトルを用いて、点のシーケンスヘッダを初期化する


★★
void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] );

箱の頂点を見つける

box
箱。
pt
頂点の配列。


★★
CvBox2D cvFitEllipse2( const CvArr* points );

2次元の点列に楕円をフィッティングする

points
点のシーケンス、または配列。


★★
void cvFitLine( const CvArr* points, int dist_type, double param,
                 double reps, double aeps, float* line );

2次元または3次元の点列に線をフィッティングする

points
32ビット整数型または浮動小数点型の2次元または3次元の点の配列、またはシーケンス。
dist_type
フィッティングに使われる距離(下の解説を参照)。
param
それぞれの距離関数における数値パラメータ(C)。0を指定した場合、最適な値が選択される。
reps, aeps
半径(座標原点と線の距離)と角度に対する精度。それぞれ0.01が初期値として適している。
line
出力される線のパラメータ。2次元フィッティングの場合、四つの浮動小数点型数(vx, vy, x0, y0)の配列で、(vx, vy)は正規化された方向ベクトル、(x0, y0)は線上の点を意味する。3次元フィッティングの場合、(vx, vy, vz, x0, y0, z0)の六つの浮動小数点型数の配列で、(vx, vy, vz)は正規化された方向ベクトル、(x0, y0, z0)は線上の点を意味する。


★★
CvSeq* cvConvexHull2( const CvArr* input, void* hull_storage=NULL,
                      int orientation=CV_CLOCKWISE, int return_points=0 );

点列の凸包を見つける

points
32ビット整数型、もしくは浮動小数点型で表された2次元の点のシーケンスまたは配列。
hull_storage
凸包を格納した出力配列(CvMat*)、またはメモリストレージ (CvMemStorage*)。配列の場合、1次元でなければならず、入力した配列/シーケンスと同じ要素数を持たなければならない。出力時にヘッダが変更されて、凸包のサイズまで配列が切り詰められる。
orientation
凸包を構成するデータの並び。CV_CLOCKWISE、またはCV_COUNTER_CLOCKWISE
return_points
このパラメータが0で、hull_storageが配列の場合にはインデックスが、メモリストレージの場合にはポインタが出力配列に格納される。0でない場合、凸包を表す点の集合自身が格納される。

使用例は、4.8 形状特徴抽出を参照。



int cvCheckContourConvexity( const CvArr* contour );

輪郭が凸であるかを調べる



CvConvexityDefect

輪郭の凸包の凹状欠損を表す構造体



CvSeq* cvConvexityDefects( const CvArr* contour, const CvArr* convexhull,
                           CvMemStorage* storage=NULL );

輪郭の凸包から凹状欠損を見つける


★★
double cvPointPolygonTest( const CvArr* contour,
                           CvPoint2D32f pt, int measure_dist );

点と輪郭の関係を調べる

contour
入力輪郭。
pt
入力輪郭に対して調べる点。
measure_dist
非0の場合、この関数は与えた点に最も近い輪郭までの距離を求める。

使用例は、4.8 形状特徴抽出を参照。


★★
CvBox2D cvMinAreaRect2( const CvArr* points, CvMemStorage* storage=NULL );

与えられた2次元の点列を囲む最小矩形を求める

points
点のシーケンスまたは配列。
storage
一時的なメモリストレージ。オプション。


★★
int cvMinEnclosingCircle( const CvArr* points, CvPoint2D32f* center, float* radius );

与えられた2次元の点列を囲む最小円を求める

points
2次元の点のシーケンスまたは配列。
center
出力パラメータ。囲む円の中心。
radius
出力パラメータ。囲む円の半径。



void cvCalcPGH( const CvSeq* contour, CvHistogram* hist );

輪郭のpair-wise geometrical histogramを求めるr


平面再分割(Planar Subdivisions)



CvSubdiv2D

平面細分割のための構造体



CvQuadEdge2D

平面細分割のQuad-edge構造体



CvSubdiv2DPoint

オリジナルの細分割と双対細分割の点を表す構造体



CvSubdiv2DEdge cvSubdiv2DGetEdge( CvSubdiv2DEdge edge, CvNextEdgeType type );
#define cvSubdiv2DNextEdge( edge ) cvSubdiv2DGetEdge( edge, CV_NEXT_AROUND_ORG )

与えられた辺に関連する辺の一つを返す



CvSubdiv2DEdge cvSubdiv2DRotateEdge( CvSubdiv2DEdge edge, int rotate );

同一のquad-edge内にある他の辺を返す



CvSubdiv2DPoint* cvSubdiv2DEdgeOrg( CvSubdiv2DEdge edge );

辺の始点を返す



CvSubdiv2DPoint* cvSubdiv2DEdgeDst( CvSubdiv2DEdge edge );

辺の終点を返す



CvSubdiv2D* cvCreateSubdivDelaunay2D( CvRect rect, CvMemStorage* storage );

空のドロネー三角形を作成する



CvSubdiv2DPoint* cvSubdivDelaunay2DInsert( CvSubdiv2D* subdiv, CvPoint2D32f pt);

ドロネー三角形に点を追加する



CvSubdiv2DPointLocation cvSubdiv2DLocate( CvSubdiv2D* subdiv, CvPoint2D32f pt,
                                           CvSubdiv2DEdge* edge,
                                           CvSubdiv2DPoint** vertex=NULL );

ドロネー三角形に点を追加する



CvSubdiv2DPoint* cvFindNearestPoint2D( CvSubdiv2D* subdiv, CvPoint2D32f pt );

与えられた点に最も近い細分割の頂点を求める



void cvCalcSubdivVoronoi2D( CvSubdiv2D* subdiv );

ボロノイ図のセルの座標を計算する



void cvClearSubdivVoronoi2D( CvSubdiv2D* subdiv );

全ての仮想点の削除する


モーション解析と物体追跡(Motion Analysis and Object Tracking)


背景統計量の累積(Accumulation of Background Statistics)


★★
void cvAcc( const CvArr* image, CvArr* sum, const CvArr* mask=NULL );

アキュムレータにフレームを加算する

image
入力画像、1- あるいは 3-チャンネル、8 ビットあるいは 32 ビット浮動小数点型。(マルチチャンネル画像の各チャンネルは、個別に処理される)。
sqsum
入力画像と同じチャンネル数のアキュムレータ、32 ビットあるいは 64 ビット浮動小数点型。
mask
オプションの処理マスク。

詳細については、付録A.背景差分(xx-xxページ)を参照。


★★
void cvSquareAcc( const CvArr* image, CvArr* sqsum, const CvArr* mask=NULL );

アキュムレータに入力画像の二乗を加算する

image
入力画像、1- あるいは 3-チャンネル、8 ビットあるいは 32 ビット浮動小数点型。(マルチチャンネル画像の各チャンネルは、個別に処理される)。
sqsum
入力画像と同じチャンネル数のアキュムレータ、32 ビットあるいは 64 ビット浮動小数点型。
mask
オプションの処理マスク。

使用例は、4.10 動的な背景差分法を参照。


★★
void cvMultiplyAcc( const CvArr* image1, const CvArr* image2, CvArr* acc, const CvArr* mask=NULL );

アキュムレータに二つの入力画像の積を加算する

image1
1番目の入力画像、1 または 3 チャンネル、8 ビットあるいは 32 ビッ ト浮動小数点型。(マルチチャンネル画像の各チャンネルは、個別に処理される)。
image2
2番目の入力画像。1番目画像と同様のフォーマット。
acc
入力画像と同じチャンネル数のアキュムレータ、32 ビットあるいは 64 ビット浮動小数点型。
mask
オプションの処理マスク。


★★
void cvRunningAvg( const CvArr* image, CvArr* acc, double alpha, const CvArr* mask=NULL );

現在の平均値を更新する

image
入力画像、1 または 3 チャンネル、8 ビットあるいは 32 ビッ ト浮動小数点型。(マルチチャンネル画像の各チャンネルは、個別に処理される)。
acc
入力画像と同じチャンネル数のアキュムレータ、32 ビットあるいは 64 ビット浮動小数点型。
alpha
入力画像の重み。
mask
オプションの処理マスク。

使用例は、4.10 動的な背景差分法を参照。


モーションテンプレート(Motion Templates)


★★
void cvUpdateMotionHistory( const CvArr* silhouette, CvArr* mhi,
                            double timestamp, double duration );

動くシルエットを用いてモーション履歴画像を更新する

silhouette
モーションが発生した場所が 0 以外のピクセル値をもつシルエットマスク。
mhi
関数によって更新される、モーション履歴画像(シングルチャンネル、32 ビット浮動小数点型)。
timestamp
ミリ秒単位、あるはその他の単位で表される現在時間。
duration
timestamp と同じ時間単位で表される、モーション軌跡の最大保持時間。


★★
void cvCalcMotionGradient( const CvArr* mhi, CvArr* mask, CvArr* orientation,
                           double delta1, double delta2, int aperture_size=3 );

モーション履歴画像の勾配方向を計算する

mhi
モーション履歴画像。
mask
マスク画像。モーション勾配方向として有効なピクセルがマーキングされているマスク。出力パラメータ。
orientation
モーション勾配方向画像。値は0~360°の角度値。
delta1, delta2
この関数は、各ピクセル (x,y) の近傍における 最小 (m(x,y)) および 最大 (M(x,y))の mhi 値を見つけ、次の条件を満たす場合にのみ、その勾配が有効であると仮定する。
min(delta1,delta2) <= M(x,y)-m(x,y) <= max(delta1,delta2).
aperture_size
この関数で用いられるいられる微分オペレータのアパーチャサイズ: CV_SCHARR, 1, 3, 5 または 7 (cvSobel を参照)。


★★
double cvCalcGlobalOrientation( const CvArr* orientation, const CvArr* mask, const CvArr* mhi,
                                double timestamp, double duration );

選択された複数の領域の全体的なモーション方向を計算する

orientation
モーション勾配方向画像。 cvCalcMotionGradient 関数によって計算されている。
mask
マスク画像。cvCalcMotionGradient によって得られる有効な勾配マスクと、方向を計算する必要がある領域を示すマスクの共通部分。
mhi
モーション履歴画像。
timestamp
ミリ秒単位、あるいはその他の単位で表される現在時間。cvUpdateMotionHistory の呼び出し時に引数として渡した時間を保存しておいて、ここでその値を再利用する方が良い。なぜなら大きな画像に対して cvUpdateMotionHistorycvCalcMotionGradient を行った場合、長い処理時間を要することがあるためである。
duration
timestamp と同じ時間単位で表される、モーション軌跡の最大保持時間。cvUpdateMotionHistory での引数と同じ。



CvSeq* cvSegmentMotion( const CvArr* mhi, CvArr* seg_mask, CvMemStorage* storage,
                        double timestamp, double seg_thresh );

全体のモーションを動作部分毎に分割する


物体追跡(Object Tracking)


★★
int cvMeanShift( const CvArr* prob_image, CvRect window,
                 CvTermCriteria criteria, CvConnectedComp* comp );

バックプロジェクションでのオブジェクトの中心を検出する

prob_image
オブジェクトヒストグラムのバックプロジェクション(cvCalcBackProject を参照)。
window
初期探索ウィンドウ。
criteria
ウィンドウ探索を終了するための条件。
comp
結果として得られる構造体。収束した探索ウィンドウの座標(comp->rect フィールド)、および ウィンドウ内の全ピクセルの合計値(comp->area フィールド)が含まれる。


★★
int cvCamShift( const CvArr* prob_image, CvRect window, CvTermCriteria criteria,
                CvConnectedComp* comp, CvBox2D* box=NULL );

オブジェクト中心、サイズおよび姿勢を求める

prob_image
オブジェクトヒストグラムのバックプロジェクション (cvCalcBackProjectを参照)。
window
初期探索ウィンドウ。
criteria
結果として得られる構造体。収束した探索ウィンドウの座標(comp->rect フィールド)、およびウィンドウ内の全ピクセルの合計値(comp->area フィールド)が含まれる。
box
オブジェクトの外接矩形。NULLでない場合、オブジェクトのサイズと姿勢が含まれる。

使用例は、4.9 物体追跡を参照。


★★★
void cvSnakeImage( const IplImage* image, CvPoint* points, int length,
                   float* alpha, float* beta, float* gamma, int coeff_usage,
                   CvSize win, CvTermCriteria criteria, int calc_gradient=1 );

エネルギーが最小となるように輪郭位置を変化させる

image
元画像あるいは、外部エネルギー場。
points
輪郭点(snake)。
length
輪郭中の点数。
alpha
連続エネルギーの重み。浮動小数点数 1つ、または length の長さを持つ浮動小数点型配列(各輪郭点に配列の各要素が対応)。
beta
曲率エネルギーの重み。alpha と同様。
gamma
画像エネルギーの重み。alpha と同様。
coeff_usage
前述の 3 つのパラメータの使用方法を表す変数。
  • CV_VALUEの場合、alpha, beta, gamma は、 全ての点に対して用いられる単一の値へのポインタを示す。
  • CV_ARRAYの場合、alpha, beta, gamma は、 snake の全ての点に対して異なる係数となる配列へのポインタを示す。 全ての配列は、輪郭のサイズと同じサイズでなければならない。
win
最小値を探索する各点の近傍のサイズ。 win.widthwin.height は奇数でなければならない。
criteria
終了条件。
calc_gradient
勾配フラグ。0 でない場合、この関数は全ての画像ピクセルに対する勾配の強さを計算し、これをエネルギー場と見なす。 0 の場合は、入力画像自体がエネルギー場と見なされる。

cvSnakeImage 関数は、内部エネルギーと外部エネルギーの総和が最小になるように snake を更新する。 内部エネルギーは輪郭形状に依存する(滑らかな輪郭ほど内部エネルギーが小さい)。外部エネルギーはエネルギー場に依存し、画像勾配の場合は画像のエッジに対応するような局所的なエネルギー極小値において最小になる。

パラメータ criteria.epsilon は、反復処理を継続するために必要な移動点の最小数の定義に用いられる。

ある反復回において、移動点の数が criteria.epsilon よりも小さい場合、または関数が criteria.max_iter 回繰り返された場合、この関数は終了する。

使用例は、4.9 物体追跡を参照。


オプティカルフロー(Optical Flow)


★★★
void cvCalcOpticalFlowHS( const CvArr* prev, const CvArr* curr, int use_previous,
                          CvArr* velx, CvArr* vely, double lambda,
                          CvTermCriteria criteria );

二つの画像に対するオプティカルフローを計算する

prev
1番目の画像、8 ビット、シングルチャンネル。
curr
2番目の画像、8 ビット、シングルチャンネル。
use_previous
前の(入力)速度場を用いる。
velx
入力画像と同じサイズのオプティカルフローの水平成分、32 ビット浮動小数点型、シングルチャンネル。
vely
入力画像と同じサイズのオプティカルフローの垂直成分、32 ビット浮動小数点型、シングルチャンネル。
lambda
ラグランジュ乗数。
criteria
速度計算の終了条件。

cvCalcOpticalFlowHS 関数は、Horn & Schunck アルゴリズム [Horn81] を用いて、 1番目の入力画像の全ピクセルに対するフローを、2番目の画像を参照して計算する。


★★★
void cvCalcOpticalFlowLK( const CvArr* prev, const CvArr* curr, CvSize win_size,
                          CvArr* velx, CvArr* vely );

二つの画像に対するオプティカルフローを計算する

prev
1番目の画像、8 ビット、シングルチャンネル。
curr
2番目の画像、8 ビット、シングルチャンネル。
win_size
ピクセルをグループ化するために用いられる平均化ウィンドウのサイズ。
velx
入力画像と同じサイズのオプティカルフローの水平成分、32 ビット浮動小数点型、シングルチャンネル。
vely
入力画像と同じサイズのオプティカルフローの垂直成分、32 ビット浮動小数点型、シングルチャンネル。

cvCalcOpticalFlowHS 関数は、Lucas & Kanade アルゴリズム [Lucas81] を用いて、1番目の入力画像の全ピクセルに対するフローを、2番目の画像を参照して計算する。


★★★
void cvCalcOpticalFlowBM( const CvArr* prev, const CvArr* curr, CvSize block_size,
                          CvSize shift_size, CvSize max_range, int use_previous,
                          CvArr* velx, CvArr* vely );

二つの画像に対するオプティカルフローをブロックマッチング法を用いて計算する

prev
1番目の画像、8 ビット、シングルチャンネル。
curr
2番目の画像、8 ビット、シングルチャンネル。
block_size
比較対象となる基本ブロックのサイズ。
shift_size
ブロック座標の増加量。
max_range
走査対象となるブロックの近傍領域。ピクセル単位。
use_previous
前の(入力)速度場を用いる。
velx
以下のオプティカルフローの水平成分
ceil(prev->width/block_size.width)×ceil(prev->height/block_size.height) のサイズ、 32 ビット浮動小数点型、シングルチャンネル。
vely
velx と同一サイズ、32 ビット浮動小数点型、シングルチャンネルのオプティカルフローの垂直成分。

cvCalcOpticalFlowBM 関数は、重なり合ったblock_size.width×block_size.heightピクセルのブロック毎にオプティカルフローを計算する。従って、その速度場は元画像よりも小さくなる。 この関数は、prev のそれぞれのブロックに対して、 curr から似ているブロックを探そうとする その探索範囲は、元のブロックの近傍か、あるいは、前回呼ばれた関数によって計算された (velx(x0,y0),vely(x0,y0)) だけシフトしたブロックの近傍 (use_previous=1 の場合)である。


★★★
void cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr, CvArr* prev_pyr, CvArr* curr_pyr,
                             const CvPoint2D32f* prev_features, CvPoint2D32f* curr_features,
                             int count, CvSize win_size, int level, char* status,
                             float* track_error, CvTermCriteria criteria, int flags );

画像ピラミッドでのLucas-Kanade法の反復を持ちいて、疎な特徴に対するオプティカルフローを計算する

prev
1番目のフレーム(時間 t
curr
2番目のフレーム(時間 t + dt
prev_pyr
最初の画像に対するピラミッドのバッファ。これが NULL でない場合は、このバッファは、レベル 1 からレベル#level までのピラミッドを格納するのに十分なサイズでなければならない。 (image_width+8)*image_height/3 バイトの合計が十分なサイズとなる。
curr_pyr
prev_pyr と同様に、2番目のフレームに対して用いられる。
prev_features
フローを検出するのに必要な点の配列。
curr_features
2次元の点の配列。2番目の画像(フレーム)中の入力特徴の新たな位置が計算され、ここに格納される。
count
特徴点の数。
win_size
各ピラミッドレベルでの探索ウィンドウのサイズ。
level
ピラミッドレベルの最大値。0 の場合はピラミッドは用いられない(シングルレベル)。1 の場合はレベル 2 となる。
status
配列。特徴に対応するフローが見つかった場合に、配列の各要素 が 1 にセットされる。そうでない場合は0 になる。
track_error
移動前の点と移動後の点の周辺領域の差(誤差)を含む倍精度型の配列。オプションパラメータ(NULL も取りうる)。
criteria
各ピラミッドの各点に対するフローを検出する繰り返し計算の終了条件。
flags
雑多なフラグ。
  • CV_LKFLOW_PYR_A_READY 1番目のフレームに対するピラミッドが事前に計算される。
  • CV_LKFLOW_PYR_B_READY 2番目のフレームに対するピラミッドが事前に計算される。
  • CV_LKFLOW_INITIAL_GUESSES この関数呼び出し以前に、配列 curr_featuresは特徴の初期座標を持つ。

cvCalcOpticalFlowPyrLK 関数は、 Lucas-Kanade オプティカルフローの、 ピラミッドを用いて疎な特徴に対応した反復バージョン([Bouguet00])の実装である。前フレームにおける特徴点の座標が与えられた場合に、現在のフレームにおける特徴点の座標が計算される。座標はサブピクセル精度で検出される。

パラメータ prev_pyrcurr_pyrは以下の規則に従う。画像ポインタが 0 の場合、関数は内部バッファを確保し、ピラミッドを計算した後にバッファを解放する。 画像ポインタが 0 以外の場合、CV_LKFLOW_PYR_A[B]_READY がセットされている場合を除いて、関数はピラミッドを計算し、それをバッファ内部に保持する。 画像はガウシアンピラミッドデータに対して十分な大きさを持つべきである。 関数呼び出しの後、両方のピラミッドが計算され、次の呼び出しで対応する画像の準備フラグがセットされる (つまり通常は、1回目の関数呼び出し以外のすべての画像ペアに対する関数呼び出しにおいて CV_LKFLOW_PYR_A_READY がセットされる)。


推定器(Estimators)


★★★
CvKalman

カルマンフィルタ状態

typedef struct CvKalman
{
    int MP;                     /* 観測ベクトルの次元数 */
    int DP;                     /* 状態ベクトルの次元数 */
    int CP;                     /* コントロールベクトルの次元数 */

    /* 後方互換性フィールド */
#if 1
    float* PosterState;         /* =state_pre->data.fl */
    float* PriorState;          /* =state_post->data.fl */
    float* DynamMatr;           /* =transition_matrix->data.fl */
    float* MeasurementMatr;     /* =measurement_matrix->data.fl */
    float* MNCovariance;        /* =measurement_noise_cov->data.fl */
    float* PNCovariance;        /* =process_noise_cov->data.fl */
    float* KalmGainMatr;        /* =gain->data.fl */
    float* PriorErrorCovariance;/* =error_cov_pre->data.fl */
    float* PosterErrorCovariance;/* =error_cov_post->data.fl */
    float* Temp1;               /* temp1->data.fl */
    float* Temp2;               /* temp2->data.fl */
#endif

    CvMat* state_pre;           /* 予測状態 (x'(k)):
                                    x(k)=A*x(k-1)+B*u(k) */
    CvMat* state_post;          /* 修正後の状態 (x(k)):
                                    x(k)=x'(k)+K(k)*(z(k)-H*x'(k)) */
    CvMat* transition_matrix;   /* 状態遷移行列 (A) */
    CvMat* control_matrix;      /* コントロール行列 (B)
                                   (コントロールされない場合は,用いられない) */
    CvMat* measurement_matrix;  /* 観測行列 (H) */
    CvMat* process_noise_cov;   /* プロセスノイズ共分散行列 (Q) */
    CvMat* measurement_noise_cov; /* 観測ノイズ共分散行列 (R) */
    CvMat* error_cov_pre;       /* 事前誤差推定共分散行列 (P'(k)):
                                    P'(k)=A*P(k-1)*At + Q)*/
    CvMat* gain;                /* カルマンゲイン行列 (K(k)):
                                    K(k)=P'(k)*Ht*inv(H*P'(k)*Ht+R)*/
    CvMat* error_cov_post;      /* 事後誤差推定共分散行列 (P(k)):
                                    P(k)=(I-K(k)*H)*P'(k) */
    CvMat* temp1;               /* テンポラリ行列 */
    CvMat* temp2;
    CvMat* temp3;
    CvMat* temp4;
    CvMat* temp5;
}
CvKalman;

CvKalman 構造体は、カルマンフィルタ状態を保存するために用いられる。 これは cvCreateKalman 関数によって作成され、 cvKalmanPredict 関数および、 cvKalmanCorrect 関数によって更新される。 また cvReleaseKalman 関数によって解放される。 通常、構造体は標準カルマンフィルタに対して用いられる (以下の表記法と式は優れたカルマンフィルタのチュートリアルである [Welch95] から引用した):

xk=A•xk-1+B•uk+wk
zk=H•xk+vk,

ここで、

xk (xk-1) - 時刻 k (k-1) におけるシステム状態
zk - 時刻 k におけるシステム状態の観測
uk - 時刻 k に適用される外部コントロール

wk と vk は、それぞれ正規分布に従うプロセスノイズと観測ノイズである。
p(w) ~ N(0,Q)
p(v) ~ N(0,R),

つまり、
Q - プロセスノイズ共分散行列、定数あるいは変数、
R - 観測ノイズ共分散行列、定数あるいは変数

標準的なカルマンフィルタの場合、全ての行列:A, B, H, Q, R は、 cvCreateKalman によって CvKalman 構造体が確保された後に一度だけ初期化される。 ただし、現在のシステム状態の近傍における、線形化された拡張カルマンフィルタの式によって、拡張カルマンフィルタをシミュレートするために、同じ構造体と同じ関数が用いられることがある。 この場合、A, B, H は(おそらくQ, R も)毎回更新される。


★★
CvKalman* cvCreateKalman( int dynam_params, int measure_params, int control_params=0 );

カルマンフィルタ構造体の領域確保を行う

dynam_params
状態ベクトルの次元数
measure_params
観測ベクトルの次元
control_params
コントロールベクトルの次元



void cvReleaseKalman( CvKalman** kalman );

カルマンフィルタ構造体を解放する

kalman
カルマンフィルタ構造体へのポインタのポインタ。

cvReleaseKalman 関数は、CvKalman 構造体および、内部的に用いられる全ての行列を解放する。



const CvMat* cvKalmanPredict( CvKalman* kalman, const CvMat* control=NULL );
#define cvKalmanUpdateByTime cvKalmanPredict

次のモデル状態を推定する



const CvMat* cvKalmanCorrect( CvKalman* kalman, const CvMat* measurement );
#define cvKalmanUpdateByMeasurement cvKalmanCorrect

モデル状態を修正する

kalman
更新される構造体へのポインタ。
measurement
観測ベクトルを含む CvMat 構造体 へのポインタ。


★★★
CvConDensation

ConDenstation 状態

    typedef struct CvConDensation
    {
        int MP;     // 観測ベクトルの次元
        int DP;     // 状態ベクトルの次元
        float* DynamMatr;       // 線形ダイナミクスを表す行列
        float* State;           // 状態ベクトル
        int SamplesNum;         // サンプル数
        float** flSamples;      // サンプルベクトルの配列
        float** flNewSamples;   // サンプルベクトルのテンポラリ配列
        float* flConfidence;    // 各サンプルの確かさ
        float* flCumulative;    // 確かさの累積値
        float* Temp;            // テンポラリベクトル
        float* RandomSample;    // サンプルセットを更新するためのランダムベクトル
        CvRandState* RandS;     // ランダムベクトルを生成するための構造体配列
    } CvConDensation;

CvConDensation 構造体は、CONditional DENSity propagATION 追跡器の状態を保存する。 このアルゴリズムに関する情報は、 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/ISARD1/condensation.html で得られる。


★★
CvConDensation* cvCreateConDensation( int dynam_params, int measure_params, int sample_count );

ConDensation フィルタ構造体の領域確保を行う

dynam_params
状態ベクトルの次元。
measure_params
観測ベクトルの次元。
sample_count
サンプル数。



void cvReleaseConDensation( CvConDensation** condens );

ConDensation フィルタ構造体を解放する



void cvConDensInitSampleSet( CvConDensation* condens, CvMat* lower_bound, CvMat* upper_bound );

ConDensation アルゴリズムのためのサンプル集合を初期化する



void cvConDensUpdateByTime( CvConDensation* condens );

次のモデル状態を推定する


パターン認識(Pattern Recognition)


物体検出(Object Detection)

ここで述べるオブジェクト検出器は、最初に Paul Viola[Viola01]によって提案され、 Rainer Lienhart[Lienhart02]に改良されたもので ある。分類器(つまり、haar-like特徴を用いるブースとされた分類器のカスケー ド)は最初に、数百の正例と負例によって学習される。 正例とは、同一のサイ ズ(例えば、20×20)にスケーリングされた特定のオブジェ クト(つまり、顔 や車)を含むサンプルであり、負例とは、正例と同一サイズの任意の画像であ る。

学習後、分類器は入力画像の(学習に用いられた物と同じサイズの)ROI に対 して適用される。その領域にオブジェクト(顔や車)が写っていると思われる 場合は、分類器は "1" を出力し、それ以外では、"0" を出力する。 画像全体 からオブジェクトを探索するためには、画像中の探索ウィンドウを移 動させな がら、その個々の領域を分類器を用いて判別する。トレーニング時とは異なる 大きさのオブジェクトも検出できるように、 分類器は簡単に 「サイズ変更」 できるように設計される。 これは画像自身のサイズを変更するよりも効率的で ある。 そして、画像中からサイズが不明なオブジェクトを検出するためには、 異なるスケールで複数回の探索がなされるべきである。

分類器の名前にある「カスケード(cascade)」という単語は、結果として得ら れる分類器がいくつかの単純な分類器(stages)から構成されるという事を意 味する。 この単純な分類器は、いずれかのステージでオブジェクト候補が却下 されるか、あるいは全てのステージをパスするまで ROI に対して次々に適用さ れる。 また、「ブーストされた(boosted)」という単語は、カスケードの各 ステージにおける分類器自身が複合体である事を意味する。これらは4つの異な るブースティング技法(重み付き投票)のうち 1 つを用いて、基本分類器から 構成される。 現在のところ、Discrete Adaboost、Real Adaboost、Gentle Adaboost そして Logitboost がサポートされる。 基本分類器は、少なくとも 2つの葉を持つ決定木である。 Haar-like 特徴は基本分類器の入力である。

以下のリファレンスでは検出部分のみについて述べる。


★★★
CvHaarFeature, CvHaarClassifier, CvHaarStageClassifier, CvHaarClassifierCascade

ブーストされたHaar分類器構造体

#define CV_HAAR_FEATURE_MAX  3

/* haar 特徴は適切な重みを持つ 2 個,あるいは 3 個の矩形から構成される */
typedef struct CvHaarFeature
{
    int  tilted;  /* 0 は,垂直な特徴,1 は,45度回転した特徴を意味する */
    
    /* 2、3 個の矩形の重みは正負の符号を持ち,その絶対値は矩形の面積に反比例する.
      rect[2].weight != 0 の場合,特徴は3個の矩形から構成され,
      そうでない場合は2個の矩形から構成される */
    struct
    {
        CvRect r;
        float weight;
    } rect[CV_HAAR_FEATURE_MAX];
}
CvHaarFeature;

/* 単一決定木による分類器(最も単純な場合は stump).これは個々の画像
  位置における特徴に対する応答(つまりウィンドウ内の部分矩形におけるピクセル合計値)
  を返し,その応答に依存する値を出力する */
typedef struct CvHaarClassifier
{
    int count;  /* 決定木のノード数 */

    /* これらは,「並列」な配列である.各インデックスiが決定木のノード(ルートのインデックスは0)に対応する.
        left[i] - 左側の子のインデックス(左側の子が葉だった場合には負のインデックス)
        right[i] - 右側の子のインデックス(右側の子が葉だった場合には負のインデックス)
        threshold[i] - 枝の閾値.特徴応答 <= threshold となる場合は左側の枝が選択され,そうでない場合は右の枝が選択される.
        alpha[i] - 葉に対応する出力値.*/
    CvHaarFeature* haar_feature;
    float* threshold;
    int* left;
    int* right;
    float* alpha;
}
CvHaarClassifier;

/* ブーストされた分類器の組(= 段階分類器(stage classifiers)): 分類器の応答の合計がthresholdよりも大きい場合には
    段階分類器は 1 を返し,そうでない場合は 0 を返す.*/
typedef struct CvHaarStageClassifier
{
    int  count;  /* 組に含まれる分類器の個数 */
    float threshold; /* ブーストされた分類器で用いる閾値 */
    CvHaarClassifier* classifier; /* 分類器の配列 */

    /* これらのフィールドは,単に一直線につながったカスケードよりもむし
        ろ,段階分類器の木を構成するために用いられる.*/
    int next;
    int child;
    int parent;
}
CvHaarStageClassifier;

typedef struct CvHidHaarClassifierCascade CvHidHaarClassifierCascade;

/* 段階分類器のカスケードまたは木 */
typedef struct CvHaarClassifierCascade
{
    int  flags; /* シグネチャ */
    int  count; /* 段階数 */
    CvSize orig_window_size; /* オリジナルのオブジェクトサイズ(カスケードの学習対象)*/

    /* これら 2 つのパラメータは cvSetImagesForHaarClassifierCascade によって設定される */
    CvSize real_window_size; /* 現在のオブジェクトサイズ */
    double scale; /* 現在のスケール */
    CvHaarStageClassifier* stage_classifier; /* 段階分類器の配列 */
    CvHidHaarClassifierCascade* hid_cascade; /* cvSetImagesForHaarClassifierCascade によって生成されるカスケードの、隠れ最適表現 */
}
CvHaarClassifierCascade;

全ての構造体は、ブーストされたHaar分類器のカスケードを表現するために用 いられる。このカスケードは次のような階層構造を持っている。

    Cascade:
        Stage1:
            Classifier11:
                Feature11
            Classifier12:
                Feature12
            ...
        Stage2:
            Classifier21:
                Feature21
            ...
        ...

全ての階層は手動で構成されるか、あるいは関数 cvLoadHaarClassifierCascadecvLoad を用いてファイルか ら読み込まれる。



CvHaarClassifierCascade* cvLoadHaarClassifierCascade(
                         const char* directory,
                         CvSize orig_window_size );

ファイルまたはOpenCV 内に組み込まれた分類器データベースから学習されたカスケード分類器を読み込む



void cvReleaseHaarClassifierCascade( CvHaarClassifierCascade** cascade );

haar分類器カスケードを解放する



CvSeq* cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade,
                            CvMemStorage* storage, double scale_factor=1.1,
                            int min_neighbors=3, int flags=0,
                            CvSize min_size=cvSize(0,0) );

typedef struct CvAvgComp
{
    CvRect rect; /* オブジェクトを内包する矩形(グループの平均矩形) */
    int neighbors; /* グループ内に存在する隣接矩形の数 */
}
CvAvgComp;

画像中のオブジェクトを検出



void cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* cascade,
                                          const CvArr* sum, const CvArr* sqsum,
                                          const CvArr* tilted_sum, double scale );

隠れカスケードに画像を割り当てる



int cvRunHaarClassifierCascade( CvHaarClassifierCascade* cascade,
                                CvPoint pt, int start_stage=0 );

ブーストされた分類器のカスケードを、与えられた画像位置で実行する


カメラキャリブレーションと3次元再構成(Camera Calibration and 3D Reconstruction)


ピンホールカメラモデル, 歪み

このセクションの関数は、ピンホールカメラモデルを取り扱う。すなわち、ひとつのビューは透視投影変換を用いて、3次元座標を画像平面に投影することで 構成されている。


s\left[ x \right]
s*m' = A*[R|t]*M', あるいは [u] [fx 0 cx] [r11 r12 r13 t1] [X] s[v] = [0 fy cy]*[r21 r22 r23 t2]*[Y] [1] [0 0 1] [r31 r32 r33 t2] [Z] [1]
ここで(X, Y, Z)はワールド座標系の3次元座標であり、 (u, v)は画像平面に投影された座標である。 Aはカメラ行列、またはカメラの内部パラメータ行列と呼ばれている。 (cx, cy)は通常は画像中心である主点(レンズの光学的な中心) であり、fx, fyは焦点距離でピクセル単位で表現される。従って、 もしある係数によってカメラ画像がアップサンプリングまたはダウンサンプリ ングされている場合、これらすべてのパラメータ(fx, fy, cx、 cy)も同じ係数でスケーリング(それぞれが乗算/除算)されなければな らない。 内部パラメータ行列はビューに依存しないので、一度推定すれば焦点 距離を固定している限りは繰返し使用することができる。 また、同次変換行列である [R|t] は外部パラメータと呼ばれる。 これは、静的環境に対するカメラの動き、または固定カメラの前のオブジェク トの剛体運動を表す。[R|t] は3次元座標 (X, Y, Z) をそれぞれのカメラ座標系に変換する。上述の変換は、以下の式で z≠0 のときと等しい。
[x]     [X]
[y] = R*[Y] + t
[z]     [Z]

x' = x/z
y' = y/z

u = fx*x' + cx
v = fy*y' + cy
カメラのレンズは半径方向の歪みや、わずかな円周方向の歪みを持っているので、上のモデルは以下のように拡張される。
[x]     [X]
[y] = R*[Y] + t
[z]     [Z]

x' = x/z
y' = y/z

x" = x'*(1 + k1r2 + k2r4) + 2*p1x'*y' + p2(r2+2*x'2)
y" = y'*(1 + k1r2 + k2r4) + p1(r2+2*y'2) + 2*p2*x'*y'
ここで r2 = x'2+y'2

u = fx*x" + cx
v = fy*y" + cy
k1, k2 は半径方向の歪み係数、 p1, p2 は円周方向の歪み係数である。高次の係数は OpenCVでは考慮されない。歪み係数はビューに依存しないので、内部パラメー タとなる。またキャプチャした画像の解像度にかかわらず同じである。

このセクションの関数は、以下の目的で使用される。


カメラキャリブレーション(Camera Calibration)


★★★
void cvProjectPoints2( const CvMat* object_points, const CvMat* rotation_vector,
                       const CvMat* translation_vector, const CvMat* intrinsic_matrix,
                       const CvMat* distortion_coeffs, CvMat* image_points,
                       CvMat* dpdrot=NULL, CvMat* dpdt=NULL, CvMat* dpdf=NULL,
                       CvMat* dpdc=NULL, CvMat* dpddist=NULL );

3次元空間中の点を画像平面へ投影する

object_points
オブジェクトの点の配列でその大きさは3xNまたはNx3である。N は画像内の点の個数。
rotation_vector
回転ベクトル。1x3または3x1。
translation_vector
並進ベクトル。1x3または3x1。
intrinsic_matrix
カメラマトリクス(A) [fx 0 cx; 0 fy cy; 0 0 1].
distortion_coeffs
歪み係数。4x1または1x4 [k1, k2, p1, p2]. NULLの場合、すべての歪み係数を0とする。
image_points
画像平面上の点の出力配列で、その大きさは2xNまたはNx2である。ここでNはビュー上の点の数。
dpdrot
オプション:画像平面上の点の回転ベクトルの各要素に関する微分係数を表す2Nx3行列。
dpdt
オプション:画像平面上の点の並進ベクトルの各要素に関する微分係数を表す2Nx3行列。
dpdf
オプション:画像平面上の点のfx と fyに関する微分係数を表す2Nx2行列。
dpdc
オプション:画像平面上の点のcx とcyに関する微分係数を表す2Nx2行列。
dpddist
オプション:画像平面上の点の歪み係数に関する微分係数を表す2Nx4行列。

cvProjectPoints2 関数は、3次元空間中の点を画像平面上に投 影した際の座標を、内部パラメータと外部パラメータを用いて計算する。オプ ションとして、この関数は画像中の投影点の偏微分係数行列であるヤコビアン を求める。これは、各パラメータ(内部、外部パラメータ)に関連する全ての 入力パラメータの関数として計算される。ヤコビアンは関 数 cvCalibrateCamera2と関 数 cvFindExtrinsicCameraParams2 に おいて、最適化を行うときに用いられる。この関数自身も、現在の内部/外部パ ラメータの逆投影誤差を計算するために利用される。

注釈: 内部パラメータ及び/または外部パラメータを特別な値に設定 すると、この関数を外部変換のみ、あるいは内部変換のみ(つまり、疎な点集 合の歪みを考慮したものに変換する)を計算するために利用することができる。


★★★
void cvFindHomography( const CvMat* src_points,
                       const CvMat* dst_points,
                       CvMat* homography );

2枚の画像間の射影変換を求める

src_points
1枚目の画像上の座標。 2xN、Nx2、3xN または Nx3の配列 (後ろ二つは同次座標系表記である)。ここで N は点の数。
dst_points
2枚目の画像上の座標。2xN、Nx2、3xN または Nx3の配列 (後ろ二つは同次座標系表記である)。
homography
出力される3x3ホモグラフィ行列(平面射影変換行列)。

cvFindHomography 関数は、2枚の画像間の射影変換行列 H=||hij|| を求める。

  [x'i]   [xi]
si[y'i]~H*[yi]
  [1  ]  [ 1]
以下のように、逆投影誤差を最小にする各要素を計算する。
sum_i((x'i-(h11*xi + h12*yi + h13)/(h31*xi + h32*yi + h33))2+
      (y'i-(h21*xi + h22*yi + h23)/(h31*xi + h32*yi + h33))2) -> min
この関数は、内部行列及び外部行列の初期値を求めるために用いられる。ホモ グラフィ行列(平面射影変換行列)はスケールに依存するので、h33=1になる ように正規化される。


★★★
void cvCalibrateCamera2( const CvMat* object_points, const CvMat* image_points,
                         const CvMat* point_counts, CvSize image_size,
                         CvMat* intrinsic_matrix, CvMat* distortion_coeffs,
                         CvMat* rotation_vectors=NULL, CvMat* translation_vectors=NULL,
                         int flags=0 );

キャリブレーションパターンを用いて内部パラメータ及び外部パラメータを求める

object_points
オブジェクト(キャリブレーションパターン)上の点群 座標の結合行列。3xN または Nx3の配列。Nはすべてのビューでの点の数の合計 である。
image_points
対応する画像上の点群座標の結合行列。 2xN またはNx2 の配列。Nはすべてのビューでの点の数の合計である。
point_counts
それぞれのビューに含まれる点の数を表すベクトル。サ イズは 1xM または Mx1 でMはビューの数。1xM or Mx1,
image_size
画像サイズ。内部カメラ行列の初期化のみに用いられる。
intrinsic_matrix
出力されるカメラ行列 (A) [fx 0 cx; 0 fy cy; 0 0 1]. CV_CALIB_USE_INTRINSIC_GUESSCV_CALIB_FIX_ASPECT_RATION が指定され た場合、fx, fy, cx, cyのパラメータのうち いくつか、またはすべてを初期化する必要がある。
distortion_coeffs
出力される4x1または1x4のひずみ係数ベクトル [k1, k2, p1, p2].
rotation_vectors
出力される3xMまたはMx3の回転ベクトルの配列 (コ ンパクトな回転行列の表記について はcvRodrigues2を参 照)。
translation_vectors
出力される3xMまたはMx3の並進ベクトルの配列。
flags
処理フラグ。0または以下の値の組み合わせ。
CV_CALIB_USE_INTRINSIC_GUESS - intrinsic_matrixは最適化が行われた正しい初 期値 fx, fy, cx, cyを含む。このパラメータがセッ トされていない場合、(cx, cy) は最初に画像中心 にセットされ(image_size はこの計算に用いられ る)、焦点距離は最小二乗法で計算される。注釈:もし内部パラ メータが既知であれば、 この手法を使う必要はない。 代わりに 関 数 cvFindExtrinsicCameraParams2 を使用すること。
CV_CALIB_FIX_PRINCIPAL_POINT - 主点(光学中心) は最適化中には変化せず、中心またはそれ以外の指定された場所 (このパラメータと同時 に CV_CALIB_USE_INTRINSIC_GUESS がセットされ ている場合)に固定される。
CV_CALIB_FIX_ASPECT_RATIO - fxfy のうちのどちらか一方だけが独立変数であ るとし、アスペクト比 fx/fyintrinsic_matrix の初期値として与えられた値か ら変わらないように最適化処理を行う。この場合、実際に用いら れる(fx, fy)の初期値は、行列から与えられる (CV_CALIB_USE_INTRINSIC_GUESSがセットされて いる場合)か、何らかの方法で推定される(後者の場合は、 fx, fy は任意の値にセットされ、それらの比率だ けが用いられる)。
CV_CALIB_ZERO_TANGENT_DIST - 円周方向の歪み係 数はゼロにセットされ、最適化中は変化しない。

cvCalibrateCamera2 関数は、内部パラメータと各画像に対する 外部パラメータを推定する。3次元のオブジェクトポイントの座標と、それら に対応する画像上に投影された点を指定する必要がある。それは、幾何学的に 既知で、容易に特徴点が発見できるオブジェクトを使用することで得られるこ とができる。そのようなオブジェクトは、キャリブレーション装置やキャリブ レーションパターンと呼ばれ、OpenCVはキャリブレーションの道具としてチェ スパターンをサポートしている (cvFindChessboardCorners を参照)。現在は、平面キャリブレーションパターン(オブジェクト上の点の z座標がすべて0または1である)を用いた、内部パラメータの初期化 (CV_CALIB_USE_INTRINSIC_GUESS がセットされていない場合) のみ実装されている。3次元のキャリブレーション装置は、初期値 intrinsic_matrix が与えられさえすれば、動かさずに用いるこ とができる。内部パラメータと外部パラメータの初期値が計算された後、逆投 影誤差の総和(実際の画像上の座標 と cvProjectPoints2 で画像上に投 影した座標の差の二乗の総和)が最小になるように各パラメータが最適化され る。

使用例は、4.11 カメラキャリブレーションを参照。


★★★
void cvFindExtrinsicCameraParams2( const CvMat* object_points,
                                   const CvMat* image_points,
                                   const CvMat* intrinsic_matrix,
                                   const CvMat* distortion_coeffs,
                                   CvMat* rotation_vector,
                                   CvMat* translation_vector );

特定の画像に対する外部パラメータを求める

object_points
オブジェクトの点の配列。3xNまたはNx3でNはビューにおける点の数。
image_points
対応する画像上の点の配列。2xNまたはNx2でNはビューにおける点の数。
intrinsic_matrix
カメラ内部行列 (A) [fx 0 cx; 0 fy cy; 0 0 1].
distortion_coeffs
み係数のベクトル。4x1または1x4 [k1, k2, p1, p2]。NULLの場合、歪み係数はすべて0 であるとする。
rotation_vector
出力される3x1 または 1x3の回転ベクトル(コンパク トな回転行列の表記についてはcvRodrigues2 を参照)。
translation_vector
出力される3x1 または 1x3の並進ベクトル。

cvFindExtrinsicCameraParams2 関数は、既知の内部パラメータ を用いて、それぞれのビューにおける外部パラメータを推定する。3次元のオブジェクトの点とそれに対応する2次元投影点が指定されなければならない。 この関数も逆投影誤差の最小化を行う。

使用例は、4.11 カメラキャリブレーションを参照。


★★★
int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );

回転行列から回転ベクトルへ変換する(またはその逆)

src
入力の回転ベクトル(3x1 あるいは 1x3)、または回転行列(3x3)。
dst
各入力に対応した出力の回転行列(3x3)、または回転ベクトル(3x1 あるいは 1x3)。
jacobian
オプション出力の3x9または9x3のヤコビアン - 出力配列の各要素の、入力配列の各要素に関する偏微分係数。

cvRodrigues2 関数は、回転ベクトルを回転行列に変換する。ま たはその逆も可能である。 回転ベクトルは回転行列のコンパクトな表記である。 回転ベクトルの方向は回転軸で、ベクトルの長さは回転軸周りの回転量になっ ている。回転行列 R とそれに対応する回転ベクトル r は次のように計算される。

theta <- norm(r)
r <- r/theta
                                                   [0 -rz ry]
R = cos(theta)*I + (1-cos(theta))*rrT + sin(theta)*[rz 0 -rx]
                                                   [ry rx 0 ]
逆変換も以下のように簡単に行うことができる。

           [0 -rz ry]
sin(theta)*[rz 0 -rx] = (R - RT)/2
           [ry rx 0 ]

回転ベクトルは、わずか3自由度の行列で回転行列を表すことができる便利な 表記である。この表記 は cvFindExtrinsicCameraParams2cvCalibrateCamera2 において最適化を行う際に用いられる。

使用例は、4.11 カメラキャリブレーションを参照。


★★★
void cvUndistort2( const CvArr* src, CvArr* dst,
                   const CvMat* intrinsic_matrix,
                   const CvMat* distortion_coeffs );

レンズ歪みを補正するため画像を変換する

src
入力画像(歪みあり)。
dst
出力画像(補正済み)。
intrinsic_matrix
カメラ内部行列 (A) [fx 0 cx; 0 fy cy; 0 0 1].
distortion_coeffs
歪み係数ベクトル。 4x1 または 1x4 [k1, k2, p1, p2].

cvUndistort2 関数は,半径方向や円周方向のレンズ歪みを補正する ために画像を変換する。カメラ行列や歪みパラメータは、 cvCalibrateCamera2 を用いて決定 することができる。このセクションの最初の式を用いて、出力画像のすべての ピクセルについて、入力画像中の対応する座標を計算する。そして、各ピクセ ル値がバイリニア補間を用いて計算される。キャリブレーションを行った画像 と入力画像の解像度が異なる場合は、歪み係数はそのままの値で問題ないが、 fx, fy, cx、cy は適切な調整が必要である。

使用例は、4.11 カメラキャリブレーションを参照。


★★
void cvInitUndistortMap( const CvMat* intrinsic_matrix,
                         const CvMat* distortion_coeffs,
                         CvArr* mapx, CvArr* mapy );

歪み補正マップの計算

intrinsic_matrix
カメラ内部行列 (A) [fx 0 cx; 0 fy cy; 0 0 1].
distortion_coeffs
歪み係数ベクトル。4x1 または 1x4 [k1, k2, p1, p2].
mapx
補正マップのx座標の出力配列。
mapy
補正マップのy座標の出力配列。


★★★
int cvFindChessboardCorners( const void* image, CvSize pattern_size,
                             CvPoint2D32f* corners, int* corner_count=NULL,
                             int flags=CV_CALIB_CB_ADAPTIVE_THRESH );

チェスボード内のコーナーを求める

image
入力のチェスボード画像。8ビットのグレースケールまたはカラー画像。
pattern_size
チェスボードの行と列ごとのコーナーの数。
corners
検出されたコーナーの配列。
corner_count
コーナーの数。NULLでない場合、検出したコーナーの数が保存される。
flags
処理フラグ。0または以下の値の組み合わせ。
CV_CALIB_CB_ADAPTIVE_THRESH - 画像を2値化する際に、固定の閾値を使うのではなく、(画像の平均輝度値から計算される)適応的な閾値を用いる。
CV_CALIB_CB_NORMALIZE_IMAGE - 固定閾値処理または適応的閾値処理を行う前に、cvNormalizeHistを用いて画像を正規化する。
CV_CALIB_CB_FILTER_QUADS - 輪郭の探索 段階で抽出される間違った四角形を無視するために、追 加基準(輪郭面積、周囲長、形は正方形など)を使用す る。

cvFindChessboardCorners 関数は、入力画像がチェ スボードパターンであるかどうかを確認し、チェスボードの各コーナーの位置 検出を試みる。すべてのコーナーが検出され、正しい順番(行順で、かつ各行 は左から右に並ぶ)でそれらが配置されている場合には、この関数は0以外の数 値を返す。そうでない場合、例えば関数がコーナー検出やそれらの順番付けに 失敗した場合などは0を返す。例えば、標準のチェスボードは8x8の正方形 と、7x7の内部コーナー(黒色の正方形が互いに接する点)を持っている。検出 された座標値は近似値であるので、位置の高精度化のためには関数 cvFindCornerSubPixを使用する。

使用例は、4.11 カメラキャリブレーションを参照。


★★★
void cvDrawChessboardCorners( CvArr* image, CvSize pattern_size,
                              CvPoint2D32f* corners, int count,
                              int pattern_was_found );

検出されたチェスボードのコーナーを表示する

image
コーナー点を表示する画像。8ビットカラー画像。
pattern_size
チェスボードの各行と各列の内部コーナーの数。
corners
検出されたコーナーの配列。
count
コーナーの数。
pattern_was_found
チェスボードからコーナーが完全に発見された (≠0)か、そうでない(=0)かを示す。この値は関数 cvFindChessboardCorners からの戻り値を渡すだけでよい。

cvDrawChessboardCorners 関数は、チェスボードからコーナー が完全に検出されていない場合(pattern_was_found=0)は、検 出されたコーナーそれぞれに赤色の円を描く。また完全に検出されている場合 (pattern_was_found≠0)は、色付けされた各コーナを線分で 接続して表示する。

使用例は、4.11 カメラキャリブレーションを参照。


姿勢推定(Pose Estimation)



CvPOSITObject* cvCreatePOSITObject( CvPoint3D32f* points, int point_count );

オブジェクトの情報を持つ構造体を初期化する



void cvPOSIT( CvPOSITObject* posit_object, CvPoint2D32f* image_points, double focal_length,
              CvTermCriteria criteria, CvMatr32f rotation_matrix, CvVect32f translation_vector );

POSITアルゴリズムの実装



void cvReleasePOSITObject( CvPOSITObject** posit_object );

3次元オブジェクト構造体のメモリを解放する



void cvCalcImageHomography( float* line, CvPoint3D32f* center,
                            float* intrinsic, float* homography );

楕円平面オブジェクト(例えば、人間の腕)のためのホモグラフィ行列(平面射影変換行列)を計算する


エピポーラ幾何(Epipolar Geometry)


★★★
int cvFindFundamentalMat( const CvMat* points1,
                          const CvMat* points2,
                          CvMat* fundamental_matrix,
                          int    method=CV_FM_RANSAC,
                          double param1=1.,
                          double param2=0.99,
                          CvMat* status=NULL);

2枚の画像間の点対応から基礎行列(F行列)を計算する

points1
大きさが2xN, Nx2, 3xN、また は Nx3 の1枚目の画像上の点の配列 (N は点の数)。 マルチチャンネルで大きさ 1xN、または Nx1 の配 列も使用可能である。 点の座標は浮動小数点型で表される(単精度または倍精度)。
points2
2枚目の画像上の点の配列で point1とフォーマッ トやサイズは同じ。
fundamental_matrix
出力される基礎行列。サイズは 3x3、 または 9x3(7-point methodは3つの行列を返す)。
method
基礎行列の計算手法。
CV_FM_7POINT - 7-pointアルゴリズム。 N == 7
CV_FM_8POINT - 8-pointアルゴリズム。 N >= 8
CV_FM_RANSAC - RANSAC アルゴリズム。 N >= 8
CV_FM_LMEDS - LMedSアルゴリズム。 N >= 8
param1
RANSAC またはLMedSメソッドのときにのみ使用されるパラメー タ。点からエピポーラ線までの最大距離(その距離を超えるもの は外れ値であると判断し、それらを最終的な基礎行列の計算に使 用しない)をピクセル単位で示す。通常は0.5 または 1.0にセッ トされる。
param2
RANSAC または LMedSメソッドのときにのみ使用されるパラメー タ。行列の計算精度の信頼レベルを示す。
status
N個の要素をもつオプションの出力配列。各要素において外れ値 のときは0、そうでないときは1がセットされている。 この配列はRANSACまた はLMedSメソッドのときのみ計算される。他の手法では、すべて1にセットされ る.

エピポーラ幾何は以下の式で表される。

p2T*F*p1=0,

ここで F は基礎行列、p1p2 は2枚の画像間での対応点である。

cvFindFundamentalMat 関数は、基礎行列を上記の4つの手法の うちの1つを用いて計算し、求めた基礎行列の数(1 または 3) を返す。もし行列が求まらないときは0を返す。

計算された基礎行列は、この後cvComputeCorrespondEpilinesに渡され、指定された点に対応するエピポーラ線を求める。


★★★
void cvComputeCorrespondEpilines( const CvMat* points,
                                  int which_image,
                                  const CvMat* fundamental_matrix,
                                  CvMat* correspondent_lines);

ステレオ画像の一方の画像上の点に対応する他方の画像上のエピポーラ線を計算する

points
入力点で大きさは2xN, Nx2, 3xN、また はNx3の配列である (ここで N は 点の数)。 マルチチャンネルの 1xN、また は Nx1 の配列も使用可能。
which_image
pointsを含む画像のインデックス(1 また は 2)。
fundamental_matrix
基礎行列。
correspondent_lines
計算されたエピポーラ線。大きさ は3xN また Nx3 の配列。

cvComputeCorrespondEpilines 関数は、ステレオ画像の一方の 画像上の各点に対応する他方の画像上の点(つまり、同じ3次元点を投影したもの) を含むような直線の方程式を求める。 それぞれの線は、以下に示すように3つの要素 l=[a,b,c]T を持つベクトルで表される。


lT*[x, y, 1]T=0, または
a*x + b*y + c = 0

基礎行列の定義から (cvFindFundamentalMatrix を 参照)、1枚目の画像(which_image=1)上の 点p1に対応する直線l2は 以下のように計算される。
l2=F*p1
また、2枚目の画像(which_image=2)上の 点p2に対応する直線l1は 以下のように計算される。
l1=FT*p2

直線の係数はある範囲内に収まる。この直線は (a2+b2=1)となるように正規化され、 correspondent_lines として保存される。


★★
void cvConvertPointsHomogenious( const CvMat* src, CvMat* dst );

座標を同次座標系に(または同次座標系から)変換する

src
入力点の配列。大きさは2xN, Nx2, 3xN, Nx3, 4xN、 またはNx4(ここでNは点の数)。マルチチャンネ ルの1xNまたはNx1の配列も使用可能。
dst
出力点の配列。入力配列と同じ数の点が含まれる。次元数は、同じ、 あるいは入力より1少ないか1大きい。そして2..4の範囲内でなければならない。

OpenCVリファレンスマニュアル


CV_RGB
CV_TREE_NODE_FIELDS
CvANN_MLP
CvANN_MLP_TrainParams
CvANN_MLP::create
CvANN_MLP::train
CvArr
CvAttrList
CvBoost
CvBoostParams
CvBoostTree
CvBoost::get_weak_predictors
CvBoost::predict
CvBoost::prune
CvBoost::train
CvBox2D
CvCapture
CvConnectedComp
CvConvexityDefect
CvDTree
CvDTreeNode
CvDTreeParams
CvDTreeSplit
CvDTreeTrainData
CvDTree::predict
CvDTree::train
CvEM
CvEMParams
CvEM::train
CvFileNode
CvFileStorage
CvGraph
CvGraphScanner
CvHaarClassifier
CvHaarClassifierCascade
CvHaarFeature
CvHaarStageClassifier
CvHistogram
CvKNearest
CvKNearest::find_nearest
CvKNearest_train
CvKalman
CvMat
CvMatND
CvMemBlock
CvMemStorage
CvMemStoragePos
CvNormalBayesClassifier
CvNormalBayesClassifier::predict
CvNormalBayesClassifier::train
CvPoint
CvPoint2D32f
CvPoint2D64f
CvPoint3D32f
CvPoint3D64f
CvQuadEdge2D
CvRTParams
CvRTrees
CvRTrees::get_proximity
CvRTrees::get_var_importance
CvRTrees::predict
CvRTrees::train
CvRect
CvSVM
CvSVMParams
CvSVM::get_support_vector
CvSVM::train
CvScalar
CvSeq
CvSeqBlock
CvSet
CvSize
CvSize2D32f
CvSlice
CvSparseMat
CvStatModel
CvStatModel::CvStatModel
CvStatModel::clear
CvStatModel::CvStatModel(data)
CvStatModel::~CvStatModel
CvStatModel::load
CvStatModel::predict
CvStatModel::read
CvStatModel::save
CvStatModel::train
CvStatModel::write
CvSubdiv2D
CvSubdiv2DPoint
CvTermCriteria
CvTreeNodeIterator
CvTypeInfo
IplImage
RTreesOOBerror
cv2DRotationMatrix
cvAbsDiff
cvAbsDiffS
cvAcc
cvAdaptiveThreshold
cvAdd
cvAddS
cvAddWeighted
cvAlloc
cvAnd
cvAndS
cvApproxChains
cvApproxPoly
cvArcLength
cvAvg
cvAvgSdv
cvBackProjectPCA
cvBoundingRect
cvBoxPoints
cvCalcBackProject
cvCalcBackProjectPatch
cvCalcCovarMatrix
cvCalcEMD2
cvCalcGlobalOrientation
cvCalcHist
cvCalcImageHomography
cvCalcMotionGradient
cvCalcOpticalFlowBM
cvCalcOpticalFlowHS
cvCalcOpticalFlowLK
cvCalcOpticalFlowPyrLK
cvCalcPCA
cvCalcPGH
cvCalcProbDensity
cvCalcSubdivVoronoi2D
cvCalibrateCamera2
cvCamShift
cvCanny
cvCartToPolar
cvCbrt
cvCheckArr
cvCheckContourConvexity
cvCircle
cvClearGraph
cvClearHist
cvClearMemStorage
cvClearND
cvClearSeq
cvClearSet
cvClearSubdivVoronoi2D
cvClipLine
cvClone
cvCloneGraph
cvCloneImage
cvCloneMat
cvCloneMatND
cvCloneSeq
cvCloneSparseMat
cvCmp
cvCmpS
cvCompareHist
cvComputeCorrespondEpilines
cvConDensInitSampleSet
cvConDensUpdateByTime
cvContourArea
cvContourFromContourTree
cvConvert
cvConvertImage
cvConvertPointsHomogenious
cvConvertScale
cvConvertScaleAbs
cvConvexHull2
cvConvexityDefects
cvCopy
cvCopyHist
cvCopyMakeBorder
cvCornerEigenValsAndVecs
cvCornerHarris
cvCornerMinEigenVal
cvCountNonZero
cvCreateCameraCapture
cvCreateChildMemStorage
cvCreateConDensation
cvCreateContourTree
cvCreateData
cvCreateFileCapture
cvCreateGraph
cvCreateGraphScanner
cvCreateHist
cvCreateImage
cvCreateImageHeader
cvCreateKalman
cvCreateMat
cvCreateMatHeader
cvCreateMatND
cvCreateMatNDHeader
cvCreateMemStorage
cvCreatePOSITObject
cvCreateSeq
cvCreateSet
cvCreateSparseMat
cvCreateStructuringElementEx
cvCreateSubdivDelaunay2D
cvCreateTrackbar
cvCreateVideoWriter
cvCrossProduct
cvCvtColor
cvCvtScale
cvCvtSeqToArray
cvDCT
cvDFT
cvDecRefData
cvDestroyAllWindows
cvDestroyWindow
cvDet
cvDilate
cvDistTransform
cvDiv
cvDotProduct
cvDrawChessBoardCorners
cvDrawContours
cvEigenVV
cvEllipse
cvEllipse2Poly
cvEllipseBox
cvEndFindContours
cvEndWriteSeq
cvEndWriteStruct
cvEqualizeHist
cvErode
cvError
cvErrorStr
cvExp
cvFastArctan
cvFillConvexPoly
cvFillPoly
cvFilter2D
cvFindChessboardCorners
cvFindContours
cvFindCornerSubPix
cvFindExtrinsicCameraParams2
cvFindFundamentalMat
cvFindGraphEdge
cvFindGraphEdgeByPtr
cvFindHomography
cvFindNearestPoint2D
cvFindNextContour
cvFindType
cvFirstType
cvFitEllipse2
cvFitLine2D
cvFlip
cvFloodFill
cvFlushSeqWriter
cvFree
cvGEMM
cvGet1D
cvGet2D
cvGet3D
cvGetND
cvGetAffineTransform
cvGetCaptureProperty
cvGetCentralMoment
cvGetCol
cvGetDiag
cvGetDims
cvGetElemType
cvGetErrMode
cvGetErrStatus
cvGetFileNode
cvGetFileNodeByName
cvGetFileNodeName
cvGetGraphVtx
cvGetHashedKey
cvGetHistValue_1D
cvGetHistValue_2D
cvGetHistValue_3D
cvGetHistValue_nD
cvGetHuMoments
cvGetImage
cvGetImageCOI
cvGetImageROI
cvGetMat
cvGetMinMaxHistValue
cvGetModuleInfo
cvGetNextSparseNode
cvGetNormalizedCentralMoment
cvGetNumThreads
cvGetOptimalDFTSize
cvGetPerspectiveTransform
cvGetQuadrangleSubPix
cvGetRawData
cvGetReal1D
cvGetReal2D
cvGetReal3D
cvGetRealND
cvGetRectSubPix
cvGetRootFileNode
cvGetRow
cvGetSeqElem
cvGetSeqReaderPos
cvGetSetElem
cvGetSize
cvGetSpatialMoment
cvGetSubRect
cvGetTextSize
cvGetThreadNum
cvGetTickCount
cvGetTickFrequency
cvGetTrackbarPos
cvGetWindowHandle
cvGetWindowName
cvGoodFeaturesToTrack
cvGrabFrame
cvGraphAddEdge
cvGraphAddEdgeByPtr
cvGraphAddVtx
cvGraphEdgeIdx
cvGraphRemoveEdge
cvGraphRemoveEdgeByPtr
cvGraphRemoveVtx
cvGraphRemoveVtxByPtr
cvGraphVtxDegree
cvGraphVtxDegreeByPtr
cvGraphVtxIdx
cvGuiBoxReport
cvHaarDetectObjects
cvHoughCircles
cvHoughLines2
cvInRange
cvInRangeS
cvIncRefData
cvInitFont
cvInitImageHeader
cvInitLineIterator
cvInitMatHeader
cvInitMatNDHeader
cvInitSparseMatIterator
cvInitSystem
cvInitTreeNodeIterator
cvInitUndistortMap
cvInpaint
cvInsertNodeIntoTree
cvIntegral
cvInvSqrt
cvInvert
cvIsInf
cvIsNaN
cvKMeans2
cvKalmanCorrect
cvKalmanPredict
cvLUT
cvLaplace
cvLine
cvLoad
cvLoadHaarClassifierCascade
cvLoadImage
cvLog
cvLogPolar
cvMahalonobis
cvMakeHistHeaderForArray
cvMakeSeqHeaderForArray
cvMat
cvMatchContourTrees
cvMatchShapes
cvMatchTemplate
cvMax
cvMaxRect
cvMaxS
cvMeanShift
cvMemStorageAlloc
cvMemStorageAllocString
cvMerge
cvMin
cvMinAreaRect2
cvMinEnclosingCircle
cvMinMaxLoc
cvMinS
cvMixChannels
cvMoments
cvMorphologyEx
cvMoveWindow
cvMul
cvMulSpectrums
cvMulTransposed
cvMultiplyAcc
cvNamedWindow
cvNextGraphItem
cvNextTreeNode
cvNorm
cvNormalize
cvNormalizeHist
cvNot
cvNulDevReport
cvOpenFileStorage
cvOr
cvOrS
cvPOSIT
cvPerspectiveTransform
cvPointPolygonTest
cvPointSeqFromMat
cvPolarToCart
cvPolyLine
cvPow
cvPreCornerDetect
cvPrevTreeNode
cvProjectPCA
cvProjectPoints2
cvPtr1D
cvPtr2D
cvPtr3D
cvPtrND
cvPutText
cvPyrDown
cvPyrMeanShiftFiltering
cvPyrSegmentation
cvPyrUp
cvQueryFrame
cvQueryHistValue_1D
cvQueryHistValue_2D
cvQueryHistValue_3D
cvQueryHistValue_nD
cvRNG
cvRandArr
cvRandInt
cvRandReal
cvRandShuffle
cvRange
cvRead
cvReadByName
cvReadChainPoint
cvReadInt
cvReadIntByName
cvReadRawData
cvReadRawDataSlice
cvReadReal
cvReadRealByName
cvReadString
cvReadStringByName
cvRectangle
cvRedirectError
cvReduce
cvRegisterModule
cvRegisterType
cvRelease
cvReleaseCapture
cvReleaseConDensation
cvReleaseData
cvReleaseFileStorage
cvReleaseGraphScanner
cvReleaseHaarClassifierCascade
cvReleaseHist
cvReleaseImage
cvReleaseImageHeader
cvReleaseKalman
cvReleaseMat
cvReleaseMatND
cvReleaseMemStorage
cvReleasePOSITObject
cvReleaseSparseMat
cvReleaseStructuringElement
cvReleaseVideoWriter
cvRemap
cvRemoveNodeFromTree
cvRepeat
cvResetImageROI
cvReshape
cvReshapeMatND
cvResize
cvResizeWindow
cvRestoreMemStoragePos
cvRetrieveFrame
cvRodrigues2
cvRound
cvRunHaarClassifierCascade
cvRunningAvg
cvSVBkSb
cvSVD
cvSampleLine
cvSave
cvSaveImage
cvSaveMemStoragePos
cvScale
cvScaleAdd
cvSegmentMotion
cvSeqElemIdx
cvSeqInsert
cvSeqInsertSlice
cvSeqInvert
cvSeqPartition
cvSeqPop
cvSeqPopFront
cvSeqPopMulti
cvSeqPush
cvSeqPushFront
cvSeqPushMulti
cvSeqRemove
cvSeqRemoveSlice
cvSeqSearch
cvSeqSlice
cvSeqSort
cvSet
cvSet1D
cvSet2D
cvSet3D
cvSetND
cvSetAdd
cvSetCaptureProperty
cvSetData
cvSetErrMode
cvSetErrStatus
cvSetHistBinRanges
cvSetIPLAllocators
cvSetIdentity
cvSetImageCOI
cvSetImageROI
cvSetImagesForHaarClassifierCascade
cvSetMemoryManager
cvSetMouseCallback
cvSetNew
cvSetNumThreads
cvSetReal1D
cvSetReal2D
cvSetReal3D
cvSetRealND
cvSetRemove
cvSetRemoveByPtr
cvSetSeqBlockSize
cvSetSeqReaderPos
cvSetTrackbarPos
cvSetZero
cvShowImage
cvSmooth
cvSnakeImage
cvSobel
cvSolveCubic
cvSplit
cvSqrt
cvSquareAcc
cvStartAppendToSeq
cvStartFindContours
cvStartNextStream
cvStartReadChainPoints
cvStartReadRawData
cvStartReadSeq
cvStartWriteSeq
cvStartWriteStruct
cvStdErrReport
cvSub
cvSubRS
cvSubS
cvSubdiv2DEdgeDst
cvSubdiv2DEdgeOrg
cvSubdiv2DGetEdge
cvSubdiv2DLocate
cvSubdiv2DRotateEdge
cvSubdivDelaunay2DInsert
cvSubstituteContour
cvSum
cvThreshHist
cvThreshold
cvTrace
cvTransform
cvTranspose
cvTreeToNodeSeq
cvTypeOf
cvUndistort2
cvUnregisterType
cvUpdateMotionHistory
cvUseOptimized
cvWaitKey
cvWarpAffine
cvWarpPerspective
cvWatershed
cvWrite
cvWriteComment
cvWriteFileNode
cvWriteFrame
cvWriteInt
cvWriteRawData
cvWriteReal
cvWriteString
cvXor
cvXorS
cvmGet
cvmSet
error_handling_sample
error_macros