ここで Moments クラス は次のように定義されます:
class Moments
{
public:
Moments();
Moments(double m00, double m10, double m01, double m20, double m11,
double m02, double m30, double m21, double m12, double m03 );
Moments( const CvMoments& moments );
operator CvMoments() const;
// 空間モーメント
double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
// 中心モーメント
double mu20, mu11, mu02, mu30, mu21, mu12, mu03;
// 正規化された中心モーメント
double nu20, nu11, nu02, nu30, nu21, nu12, nu03;
};
param array: ラスタ画像(シングルチャンネル,8ビットまたは浮動小数点型の2次元配列)あるいは,2次元点( Point または Point2f )の配列( または ) param binaryImage: (画像の場合のみ)これが真の場合,すべての非0ピクセルが1として扱われます
関数 moments は,ベクタ形状またはラスタライズされた形状の,3次までのモーメントを求めます.ラスタ画像の場合,空間モーメント は次のように求められます:
また,中心モーメント は,次のように求められます:
ここで は重心を表します:
また,正規化された中心モーメント は次のように求められます:
, となるので,これらの値は保存されないことに注意してください.
輪郭のモーメントも同様に定義されますが,これはグリーンの定理を用いて求められます( http://en.wikipedia.org/wiki/Green_theorem を参照してください).したがって,ラスタライズの分解能の制限により,輪郭に対して計算されたモーメントは,ラスタライズされた同じ輪郭に対して計算されたものとは多少異なります.
参考: contourArea() , arcLength()
7つの Hu モーメント不変量を求めます.
パラメタ: |
|
---|
関数 HuMoments は,次のように定義される7つの Hu 不変量( http://en.wikipedia.org/wiki/Image_moment を参照)を求めます.
ここで は の省略形です.
反転によって符号が逆転してしまう7番目のHuモーメントを除いて,これらの値は,画像のスケール変化,回転,および反転に対して不変であることが分かっています.この不変量は,もちろん画像解像度が有限であるという仮定の元に成り立っています.ラスタ画像の場合は,元画像に対する Hu 不変量と変形した画像に対するものとは多少異なります.
参考: matchShapes()
2値画像中の輪郭を検出します.
パラメタ: |
|
---|
関数 findContours は, Suzuki85 のアルゴリズムを利用して,2値画像から輪郭を抽出します.この輪郭は,形状の解析や物体検出,物体認識のための便利な道具となります.OpenCV のサンプルディレクトリにある squares.c を参照してください.
注意: 元の image は,この関数によって書き換えられます.
輪郭線,または内側が塗りつぶされた輪郭を描きます.
パラメタ: |
|
---|
関数 drawContours は, ならば画像に輪郭線を描き, ならば輪郭で囲まれた領域を塗りつぶします.ここでは,2値画像から連結性分を抽出し,それらをラベリングする例を示します:
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main( int argc, char** argv )
{
Mat src;
// コマンドライン引数の 1 番目に 2 値画像(白黒)
// のファイル名を与えてください.
if( argc != 2 || !(src=imread(argv[1], 0)).data)
return -1;
Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3);
src = src > 1;
namedWindow( "Source", 1 );
imshow( "Source", src );
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( src, contours, hierarchy,
CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
// トップレベルにあるすべての輪郭を横断し,
// 各連結成分をランダムな色で描きます.
int idx = 0;
for( ; idx >= 0; idx = hiearchy[idx][0] )
{
Scalar color( rand()&255, rand()&255, rand()&255 );
drawContours( dst, contours, idx, color, CV_FILLED, 8, hiearchy );
}
namedWindow( "Components", 1 );
imshow( "Components", dst );
waitKey(0);
}
折れ線カーブを指定された精度で近似します.
パラメタ: |
|
---|
関数 approxPolyDP は,折れ線カーブまたはポリゴンを,互いの距離が指定された精度以下になるように,より少ない頂点数のカーブやポリゴンで近似します.ここでは Douglas-Peucker アルゴリズム http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm が利用されます.
輪郭線の周囲長,あるいは曲線の長さを求めます.
パラメタ: |
|
---|
この関数は,輪郭線の周囲長,あるいは曲線の長さを求めます.
点群を包含する傾いていない最小の矩形を求めます.
Parameter: | points – 入力される2次元点の集合. CV_32SC2 または CV_32FC2 の行列,あるいは,コンストラクタ Mat(const vector<T>&) により行列に変換される vector<Point> または vector<Point2f> のベクトルで表現されます |
---|
この関数は,指定された点群を包含する傾いていない最小の矩形を求め,それを返します.
2次元点集合間の最適なアフィン変換を求めます.
パラメタ: |
|
---|
この関数は, から への変換を最も良く近似する,最適なアフィン変換 ( の浮動小数点型行列)を求めます:
ここで fullAffine=true の場合は は任意の行列になりますが, fullAffine=false の場合は
という形式になります.
参考: getAffineTransform() , getPerspectiveTransform() , findHomography()
Computes optimal affine transformation between two 3D point sets
パラメタ: |
|
---|
この関数は,RANSACアルゴリズムを用いて,3次元点集合間の最適な3次元アフィン変換を求めます.
輪郭が囲む領域の面積を求めます.
Parameter: | contour – 輪郭の頂点. CV_32SC2 または CV_32FC2 の行列,あるいは,コンストラクタ Mat(const vector<T>&) により行列に変換される vector<Point> または vector<Point2f> のベクトルで表現されます |
---|
この関数は,輪郭の囲む領域の面積を求めます. moments() と同様にグリーンの定理を利用して面積を求めるので, drawContours() や fillPoly() を用いて輪郭を描画しても,その面積と非0ピクセルの数は異なります.
ここでは,短い例を示します:
vector<Point> contour;
contour.push_back(Point2f(0, 0));
contour.push_back(Point2f(10, 0));
contour.push_back(Point2f(10, 10));
contour.push_back(Point2f(5, 4));
double area0 = contourArea(contour);
vector<Point> approx;
approxPolyDP(contour, approx, 5, true);
double area1 = contourArea(approx);
cout << "area0 =" << area0 << endl <<
"area1 =" << area1 << endl <<
"approx poly vertices" << approx.size() << endl;
点集合に対する凸包を求めます.
パラメタ: |
|
---|
この関数は, Sklansky のアルゴリズム Sklansky82 を利用して2次元点集合の凸包を求めます.計算量は または であり( は入力点数を表す),これは初期ソートの実装に依存します(現在は ).この関数の各形式の利用方法を実演する OpenCV のサンプル convexhull.c を参照してください.
2次元の点集合に楕円をフィッティングします.
Parameter: | points – 入力される2次元点の集合. CV_32SC2 または CV_32FC2 の行列,あるいは,コンストラクタ Mat(const vector<T>&) により行列に変換される vector<Point> または vector<Point2f> のベクトルで表現されます |
---|
関数 fitEllipse は,2次元点の集合に最もフィットする(二乗誤差が最小になる)楕円を求めます.その楕円に外接する,回転を考慮した矩形が返されます.
2次元あるいは3次元の点集合に直線をフィッティングします.
パラメタ: |
|
---|
関数 fitLine は, を最小化することで,2次元あるいは3次元の点集合に直線をフィッティングします.ここで, は 番目の点と直線の距離, は距離関数(以下の内の1つ)を表します:
distType=CV_DIST_L2
distType=CV_DIST_L1
distType=CV_DIST_L12
distType=CV_DIST_FAIR
distType=CV_DIST_WELSCH
distType=CV_DIST_HUBER
このアルゴリズムは,M-推定( http://en.wikipedia.org/wiki/M-estimator )に基づいており,重み付き最小二乗アルゴリズムを用いて反復フィッティングを行います.各試行の度に, に反比例するように重み が調整されます.
輪郭形状が凸であるかを調べます.
Parameter: | contour – 調べられる輪郭. CV_32SC2 または CV_32FC2 の行列,あるいは,コンストラクタ Mat(const vector<T>&) により行列に変換される vector<Point> または vector<Point2f> のベクトルで表現されます |
---|
関数 isContourConvex は,入力された輪郭が凸であるかどうかを調べます.輪郭は,自己交差しないような単純なものでなければならず,そうでない場合の出力は未定義です.
与えられた2次元点集合を囲む,(回転を考慮した)最小の矩形を求めます.
Parameter: | points – 入力される2次元点の集合. CV_32SC2 または CV_32FC2 の行列,あるいは,コンストラクタ Mat(const vector<T>&) により行列に変換される vector<Point> または vector<Point2f> のベクトルで表現されます |
---|
この関数は,指定された点の集合を囲む(回転してるかもしれない)最小の矩形領域を求めます.OpenCVのサンプル minarea.c を参照してください.
与えられた2次元点集合を囲む最小の円を求めます.
パラメタ: |
|
---|
この関数は,反復アルゴリズムを用いて,与えられた2次元点集合を囲む最小の円を求めます.OpenCVのサンプル minarea.c を参照してください.
2つの形状を比較します.
パラメタ: |
|
---|
関数 matchShapes は,2つの形状を比較します.実装されている3種類の手法は,以下に示すように,いずれもHuモーメント( HuMoments() の説明を参照してください)を利用します( は object1 , は object2 を表しています):
method=CV_CONTOUR_MATCH_I1
method=CV_CONTOUR_MATCH_I2
method=CV_CONTOUR_MATCH_I3
ここで
です. また, は, と それぞれのHuモーメントを表します.
点と輪郭の関係を調べます.
パラメタ: |
|
---|
この関数は, 点が輪郭の内側にある か,外側にあるか,輪郭上に乗っている(あるいは,頂点と一致している)か を判別します.そして,それに応じて,正値(内側),負置(外側),0(辺上)を返します.
measureDist=false の場合は,戻り値はそれぞれ +1, -1, 0 になります. そうでない場合は,点と最も近い輪郭辺までの符号付き距離が戻り値となります.
ここでは,画像の各ピクセルと輪郭との関係を調べたときの出力を示します.