構造解析と形状ディスクリプタ ========================================== .. highlight:: cpp .. index:: moments cv::moments ----------- `id=0.879018654952 Comments from the Wiki `__ .. cfunction:: Moments moments( const Mat\& array, bool binaryImage=false ) ポリゴンまたはラスタライズされた形状の,3次までのモーメントを求めます. ここで ``Moments`` クラス は次のように定義されます: .. code-block:: c 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`` )の配列( :math:`1 \times N` または :math:`N \times 1` ). :param binaryImage: (画像の場合のみ)これが真の場合,すべての非0ピクセルが1として扱われます. 関数 ``moments`` は,ベクタ形状またはラスタライズされた形状の,3次までのモーメントを求めます.ラスタ画像の場合,空間モーメント :math:`\texttt{Moments::m}_{ji}` は次のように求められます: .. math:: \texttt{m} _{ji}= \sum _{x,y} \left ( \texttt{array} (x,y) \cdot x^j \cdot y^i \right ), また,中心モーメント :math:`\texttt{Moments::mu}_{ji}` は,次のように求められます: .. math:: \texttt{mu} _{ji}= \sum _{x,y} \left ( \texttt{array} (x,y) \cdot (x - \bar{x} )^j \cdot (y - \bar{y} )^i \right ) ここで :math:`(\bar{x}, \bar{y})` は重心を表します: .. math:: \bar{x} = \frac{\texttt{m}_{10}}{\texttt{m}_{00}} , \; \bar{y} = \frac{\texttt{m}_{01}}{\texttt{m}_{00}} また,正規化された中心モーメント :math:`\texttt{Moments::nu}_{ij}` は次のように求められます: .. math:: \texttt{nu} _{ji}= \frac{\texttt{mu}_{ji}}{\texttt{m}_{00}^{(i+j)/2+1}} . :math:`\texttt{mu}_{00}=\texttt{m}_{00}` , :math:`\texttt{nu}_{00}=1` :math:`\texttt{nu}_{10}=\texttt{mu}_{10}=\texttt{mu}_{01}=\texttt{mu}_{10}=0` となるので,これらの値は保存されないことに注意してください. 輪郭のモーメントも同様に定義されますが,これはグリーンの定理を用いて求められます( http://en.wikipedia.org/wiki/Green_theorem を参照してください).したがって,ラスタライズの分解能の制限により,輪郭に対して計算されたモーメントは,ラスタライズされた同じ輪郭に対して計算されたものとは多少異なります. 参考: :func:`contourArea` , :func:`arcLength` .. index:: HuMoments cv::HuMoments ------------- `id=0.514637546632 Comments from the Wiki `__ .. cfunction:: void HuMoments( const Moments\& moments, double h[7] ) 7つの Hu モーメント不変量を求めます. :param moments: :func:`moments` で求められた入力モーメント. :param h: 出力される Hu 不変量. 関数 ``HuMoments`` は,次のように定義される7つの Hu 不変量( http://en.wikipedia.org/wiki/Image_moment を参照)を求めます. .. math:: \begin{array}{l} h[0]= \eta _{20}+ \eta _{02} \\ h[1]=( \eta _{20}- \eta _{02})^{2}+4 \eta _{11}^{2} \\ h[2]=( \eta _{30}-3 \eta _{12})^{2}+ (3 \eta _{21}- \eta _{03})^{2} \\ h[3]=( \eta _{30}+ \eta _{12})^{2}+ ( \eta _{21}+ \eta _{03})^{2} \\ h[4]=( \eta _{30}-3 \eta _{12})( \eta _{30}+ \eta _{12})[( \eta _{30}+ \eta _{12})^{2}-3( \eta _{21}+ \eta _{03})^{2}]+(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ h[5]=( \eta _{20}- \eta _{02})[( \eta _{30}+ \eta _{12})^{2}- ( \eta _{21}+ \eta _{03})^{2}]+4 \eta _{11}( \eta _{30}+ \eta _{12})( \eta _{21}+ \eta _{03}) \\ h[6]=(3 \eta _{21}- \eta _{03})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}]-( \eta _{30}-3 \eta _{12})( \eta _{21}+ \eta _{03})[3( \eta _{30}+ \eta _{12})^{2}-( \eta _{21}+ \eta _{03})^{2}] \\ \end{array} ここで :math:`\eta_{ji}` は :math:`\texttt{Moments::nu}_{ji}` の省略形です. 反転によって符号が逆転してしまう 7 番目の Hu モーメントを除いて,これらの値は,画像のスケール変化,回転,および反転に対して不変であることが分かっています.この不変量は,もちろん画像解像度が無限であるという仮定の元に成り立っています.ラスタ画像の場合は,元画像に対する Hu 不変量と変形した画像に対するものとは多少異なります. 参考: :func:`matchShapes` .. index:: findContours cv::findContours ---------------- `id=0.776008613467 Comments from the Wiki `__ .. cfunction:: void findContours( const Mat\& image, vector >\& contours, vector\& hierarchy, int mode, int method, Point offset=Point()) .. cfunction:: void findContours( const Mat\& image, vector >\& contours, int mode, int method, Point offset=Point()) 2値画像中の輪郭を検出します. :param image: 入力画像,8ビット,シングルチャンネル.0以外のピクセルは 1として,0のピクセルは0のまま扱われます.つまり,入力画像は ``2値画像`` として扱われます.グレースケールやカラー画像から2値画像を得るには, :func:`compare` , :func:`inRange` , :func:`threshold` , :func:`adaptiveThreshold` , :func:`Canny` などの関数を利用します.また,この関数は,輪郭抽出処理中に入力画像 ``image`` の中身を書き換えます. :param contours: 検出された輪郭.各輪郭は,点のベクトルとして格納されます. :param hiararchy: オプション.画像のトポロジーに関する情報を含む出力ベクトル.これは,輪郭数と同じ数の要素を持ちます.各輪郭 ``contours[i]`` に対して,要素 ``hierarchy[i][0]`` , ``hiearchy[i][1]`` , ``hiearchy[i][2]`` , ``hiearchy[i][3]`` にはそれぞれ,同じ階層レベルに存在する前後の輪郭,最初の子輪郭,および親輪郭の ``contours`` インデックス(0 基準)がセットされます.また,輪郭 ``i`` において,前後,親,子の輪郭が存在しない場合,それに対応する ``hierarchy[i]`` の要素は,負の値になります. :param mode: 輪郭抽出モード * **CV_RETR_EXTERNAL** 最も外側の輪郭のみを抽出します.すべての輪郭に対して ``hierarchy[i][2]=hierarchy[i][3]=-1`` がセットされます. * **CV_RETR_LIST** すべての輪郭を抽出しますが,一切の階層構造を保持しません. * **CV_RETR_CCOMP** すべての輪郭を抽出し,それらを2階層構造として保存します:上のレベルには,連結成分の外側の境界線が,下のレベルには,連結成分の内側に存在する穴の境界線が属します.ある連結成分の穴の内側に別の輪郭が存在する場合,その穴は上のレベルに属します. * **CV_RETR_TREE** すべての輪郭を抽出し,入れ子構造になった輪郭を完全に表現する階層構造を構成します.この完全な階層構造は,OpenCVの ``contours.c`` デモで見ることができます. :param method: 輪郭の近似手法: * **CV_CHAIN_APPROX_NONE** すべての輪郭点を完全に格納します.つまり,この手法により格納された任意の隣り合う2点は,互いに8近傍に存在します. * **CV_CHAIN_APPROX_SIMPLE** 水平・垂直・斜めの線分を圧縮し,それらの端点のみを残します.例えば,まっすぐな矩形の輪郭線は,4つの点にエンコードされます. * **CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS** Teh-Chinチェーン近似アルゴリズムの1つを適用します. TehChin89 を参照してください. :param offset: オプションのオフセット.各輪郭点はこの値の分だけシフトします.これは,ROIの中で抽出された輪郭を,画像全体に対して位置づけて解析する場合に役立ちます. 関数 ``findContours`` は, Suzuki85 のアルゴリズムを利用して,2値画像から輪郭を抽出します.この輪郭は,形状の解析や物体検出,物体認識を行うための有効な手段となります.OpenCV のサンプルディレクトリにある ``squares.c`` を参照してください. **注意:** 元の ``image`` は,この関数によって書き換えられます. .. index:: drawContours cv::drawContours ---------------- `id=0.374961436047 Comments from the Wiki `__ .. cfunction:: void drawContours( Mat\& image, const vector >\& contours, int contourIdx, const Scalar\& color, int thickness=1, int lineType=8, const vector\& hierarchy=vector(), int maxLevel=INT_MAX, Point offset=Point() ) 輪郭線,または内側が塗りつぶされた輪郭を描きます. :param image: 出力画像. :param contours: 入力される全輪郭.各輪郭は,点のベクトルとして格納されています. :param contourIdx: 描かれる輪郭を示します.これが負値の場合,すべての輪郭が描画されます. :param color: 輪郭の色. :param thickness: 輪郭線の太さ.これが負値の場合(例えば ``thickness=CV_FILLED`` ),輪郭の内側が塗りつぶされます. :param lineType: 線の連結性. :func:`line` の説明を参照してください. :param hierarchy: 階層に関するオプションの情報.これは,特定の輪郭だけを描画したい場合にのみ必要になります. :param maxLevel: 描画される輪郭の最大レベル.0ならば,指定された輪郭のみが描画されます.1ならば,指定された輪郭と,それに入れ子になったすべての輪郭が描画されます.2ならば,指定された輪郭と,それに入れ子になったすべての輪郭,さらにそれに入れ子になったすべての輪郭が描画されます.このパラメータは, ``hierarchy`` が有効な場合のみ考慮されます. :param offset: 輪郭をシフトするオプションパラメータ.指定された :math:`\texttt{offset}=(dx,dy)` だけ,すべての描画輪郭がシフトされます. 関数 ``drawContours`` は, :math:`\texttt{thickness} \ge 0` ならば画像に輪郭線を描き, :math:`\texttt{thickness}<0` ならば輪郭で囲まれた領域を塗りつぶします.ここでは,2値画像から連結性分を抽出し,それらをラベリングする例を示します: .. code-block:: c #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 > contours; vector hierarchy; findContours( src, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); // トップレベルにあるすべての輪郭を横断し, // 各連結成分をランダムな色で描きます. int idx = 0; for( ; idx >= 0; idx = hierarchy[idx][0] ) { Scalar color( rand()&255, rand()&255, rand()&255 ); drawContours( dst, contours, idx, color, CV_FILLED, 8, hierarchy ); } namedWindow( "Components", 1 ); imshow( "Components", dst ); waitKey(0); } .. .. index:: approxPolyDP cv::approxPolyDP ---------------- `id=0.848006535935 Comments from the Wiki `__ .. cfunction:: void approxPolyDP( const Mat\& curve, vector\& approxCurve, double epsilon, bool closed ) .. cfunction:: void approxPolyDP( const Mat\& curve, vector\& approxCurve, double epsilon, bool closed ) 折れ線(カーブ)を指定された精度で近似します. :param curve: 近似されるポリゴン,またはカーブ. :math:`1 \times N` または :math:`N \times 1` の行列で,その型は ``CV_32SC2`` または ``CV_32FC2`` です.また,コンストラクタ ``Mat(const vector&)`` を呼び出すことで, ``vector`` または ``vector`` をこのような行列に変換することもできます. :param approxCurve: 近似結果.入力されたカーブの型と同じ型です. :param epsilon: 近似精度を指定します.これは,元のカーブと近似カーブの最大距離です. :param closed: これが真の場合,近似された曲線は閉じたものになり(つまり,最初と最後の頂点が接続されます),そうでない場合は,開いた曲線になります. 関数 ``approxPolyDP`` は,折れ線カーブまたはポリゴンを,互いの距離が指定された精度以下になるように,より少ない頂点数のカーブやポリゴンで近似します.ここでは Douglas-Peucker アルゴリズム http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm が利用されます. .. index:: arcLength cv::arcLength ------------- `id=0.850425661555 Comments from the Wiki `__ .. cfunction:: double arcLength( const Mat\& curve, bool closed ) 輪郭線の周囲長,あるいは曲線の長さを求めます. :param curve: 入力される2次元点のベクトル. ``CV_32SC2`` または ``CV_32FC2`` の行列,あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. :param closed: カーブが開いているか閉じているかを示します. この関数は,輪郭線の周囲長,あるいは曲線の長さを求めます. .. index:: boundingRect cv::boundingRect ---------------- `id=0.788678100373 Comments from the Wiki `__ .. cfunction:: Rect boundingRect( const Mat\& points ) 点群に外接する傾いていない矩形を求めます. :param points: 入力される2次元点の集合. ``CV_32SC2`` または ``CV_32FC2`` の行列,あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. この関数は,指定された点群に外接する傾いていない最小の矩形を求め,それを返します. .. index:: estimateRigidTransform cv::estimateRigidTransform -------------------------- `id=0.452496487719 Comments from the Wiki `__ .. cfunction:: Mat estimateRigidTransform( const Mat\& srcpt, const Mat\& dstpt, bool fullAffine ) 2 次元点集合間の最適なアフィン変換を求めます. :param srcpt: 1 番目の 2 次元点集合. :param dstpt: ``srcpt`` と同じサイズ,同じ型の 2 番目の 2 次元点集合. :param fullAffine: これが true の場合,この関数は,制約条件を追加することなく最適なアフィン変換を求めます(つまり,6自由度).そうでない場合,並進,回転および等方性スケーリングの組み合わせ(つまり,5自由度)から変換を求めます. この関数は, :math:`\texttt{srcpt}_i` から :math:`\texttt{dstpt}_i` への変換を最も良く近似する,最適なアフィン変換 :math:`[A|b]` ( :math:`2 \times 3` の浮動小数点型行列)を求めます: .. math:: [A^*|b^*] = arg \min _{[A|b]} \sum _i \| \texttt{dstpt} _i - A { \texttt{srcpt} _i}^T - b \| ^2 ここで ``fullAffine=true`` の場合は :math:`[A|b]` は任意の行列になりますが, ``fullAffine=false`` の場合は .. math:: \begin{bmatrix} a_{11} & a_{12} & b_1 \\ -a_{12} & a_{11} & b_2 \end{bmatrix} という形式になります. 参考: :func:`getAffineTransform` , :func:`getPerspectiveTransform` , :func:`findHomography` .. index:: estimateAffine3D cv::estimateAffine3D -------------------- `id=0.485193326414 Comments from the Wiki `__ .. cfunction:: int estimateAffine3D(const Mat\& srcpt, const Mat\& dstpt, Mat\& out, vector\& outliers, double ransacThreshold = 3.0, double confidence = 0.99) 3 次元点集合間の最適なアフィン変換を求めます. :param srcpt: 1 番目の 3 次元点集合. :param dstpt: 2 番目の 3 次元点集合. :param out: 出力される, :math:`3 \times 4` の3次元アフィン変換行列. :param outliers: 外れ値である点を示す出力ベクトル. :param ransacThreshold: RANSACアルゴリズムにおいて外れ値ではないと見なされる,逆投影誤差の最大値. :param confidence: 0 から 1 の値で表現される,推定された行列の信頼レベル. この関数は,RANSACアルゴリズムを用いて,3次元点集合間の最適な 3 次元アフィン変換を求めます. .. index:: contourArea cv::contourArea --------------- `id=0.958409748028 Comments from the Wiki `__ .. cfunction:: double contourArea( const Mat\& contour ) 輪郭が囲む領域の面積を求めます. :param contour: 輪郭の頂点. ``CV_32SC2`` または ``CV_32FC2`` の行列,あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. この関数は,輪郭の囲む領域の面積を求めます. :func:`moments` と同様にグリーンの定理を利用して面積を求めるので, :func:`drawContours` や :func:`fillPoly` を用いて輪郭を描画しても,その面積と非0ピクセルの数は異なります. ここでは,短い例を示します: .. code-block:: c vector 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 approx; approxPolyDP(contour, approx, 5, true); double area1 = contourArea(approx); cout << "area0 =" << area0 << endl << "area1 =" << area1 << endl << "approx poly vertices" << approx.size() << endl; .. .. index:: convexHull cv::convexHull -------------- `id=0.425114512952 Comments from the Wiki `__ .. cfunction:: void convexHull( const Mat\& points, vector\& hull, bool clockwise=false ) .. cfunction:: void convexHull( const Mat\& points, vector\& hull, bool clockwise=false ) .. cfunction:: void convexHull( const Mat\& points, vector\& hull, bool clockwise=false ) 点集合に対する凸包を求めます. :param points: 入力される2次元点の vector. ``CV_32SC2`` または ``CV_32FC2`` の行列で表現されます.あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. :param hull: 出力される凸包.凸包を構成する点のベクトル(必ず,入力された点と同じ型になります),あるいは,凸包を構成する点の元の配列におけるインデックス(0基準)のベクトルです(凸包の点集合は元の点集合の部分集合となるので). :param clockwise: これが真の場合,出力される凸包は時計回りになり,そう でなければ反時計回りになります.ここで,スクリーンの座標系は左上原点,x 軸は右向き,y 軸は下向きであると仮定しています. この関数は, Sklansky のアルゴリズム Sklansky82 を利用して 2 次元点集合の凸包を求めます.計算量は :math:`O(N logN)` または :math:`O(N)` であり( :math:`N` は入力点数を表します),これは初期ソートの実装に依存します(現在は :math:`O(N logN)` です).この関数の各形式の利用方法を実演する OpenCV のサンプル ``convexhull.c`` を参照してください. .. index:: fitEllipse cv::fitEllipse -------------- `id=0.219202370793 Comments from the Wiki `__ .. cfunction:: RotatedRect fitEllipse( const Mat\& points ) 2 次元の点集合に楕円をフィッティングします. :param points: 入力される 2 次元点の集合. ``CV_32SC2`` または ``CV_32FC2`` の行列,あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. 関数 ``fitEllipse`` は,2次元点の集合に最もフィットする(二乗誤差が最小になる)楕円を求めます.その楕円に外接する,回転を考慮した矩形が返されます. .. index:: fitLine cv::fitLine ----------- `id=0.924879375128 Comments from the Wiki `__ .. cfunction:: void fitLine( const Mat\& points, Vec4f\& line, int distType, double param, double reps, double aeps ) .. cfunction:: void fitLine( const Mat\& points, Vec6f\& line, int distType, double param, double reps, double aeps ) 2 次元あるいは 3 次元の点集合に直線をフィッティングします. :param points: 入力される 2 次元点の集合. ``CV_32SC2`` または ``CV_32FC2`` の行列,あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. :param line: 出力される直線パラメータ.2次元フィッティングの場合,これは4つの浮動小数点数 ``(vx, vy, x0, y0)`` のベクトルとなります.ここで, ``(vx, vy)`` は正規化された直線方向ベクトル, ``(x0, y0)`` は直線上の点を表します.3次元フィッティングの場合,これは6つの浮動小数点数 ``(vx, vy, vz, x0, y0, z0)`` のベクトルとなります.ここで, ``(vx, vy, vz)`` は正規化された直線方向ベクトル, ``(x0, y0, z0)`` は直線上の点を表します. :param distType: M-推定で利用される距離(説明を参照). :param param: ある種の距離で用いられる数値パラメータ ( ``C`` ).0 の場合は最適な値が選択されます. :param reps, aeps: それぞれ半径(座標原点と直線との距離)および角度に対する精度を表します.デフォルト値の 0.01 は,両方に対して適切な値です. 関数 ``fitLine`` は, :math:`\sum_i \rho(r_i)` を最小化することで,2次元あるいは3次元の点集合に直線をフィッティングします.ここで, :math:`r_i` は :math:`i` 番目の点と直線の距離, :math:`\rho(r)` は距離関数(以下の内の1つ)を表します: * distType=CV\_DIST\_L2 .. math:: \rho (r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)} * distType=CV\_DIST\_L1 .. math:: \rho (r) = r * distType=CV\_DIST\_L12 .. math:: \rho (r) = 2 \cdot ( \sqrt{1 + \frac{r^2}{2}} - 1) * distType=CV\_DIST\_FAIR .. math:: \rho \left (r \right ) = C^2 \cdot \left ( \frac{r}{C} - \log{\left(1 + \frac{r}{C}\right)} \right ) \quad \text{where} \quad C=1.3998 * distType=CV\_DIST\_WELSCH .. math:: \rho \left (r \right ) = \frac{C^2}{2} \cdot \left ( 1 - \exp{\left(-\left(\frac{r}{C}\right)^2\right)} \right ) \quad \text{where} \quad C=2.9846 * distType=CV\_DIST\_HUBER .. math:: \rho (r) = \fork{r^2/2}{if $r < C$}{C \cdot (r-C/2)}{otherwise} \quad \text{where} \quad C=1.345 このアルゴリズムは,M-推定( http://en.wikipedia.org/wiki/M-estimator )に基づいており,重み付き最小二乗アルゴリズムを用いて反復フィッティングを行います.各試行の度に, :math:`\rho(r_i)` に反比例するように重み :math:`w_i` が調整されます. .. index:: isContourConvex cv::isContourConvex ------------------- `id=0.351709856714 Comments from the Wiki `__ .. cfunction:: bool isContourConvex( const Mat\& contour ) 輪郭形状が凸であるかを調べます. :param contour: 調べられる輪郭. ``CV_32SC2`` または ``CV_32FC2`` の行列,あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. 関数 ``isContourConvex`` は,入力された輪郭が凸であるかどうかを調べます.輪郭は,自己交差しないような単純なものでなければならず,そうでない場合の出力は未定義です. .. index:: minAreaRect cv::minAreaRect --------------- `id=0.905832538393 Comments from the Wiki `__ .. cfunction:: RotatedRect minAreaRect( const Mat\& points ) 与えられた 2 次元点集合を囲む,(回転を考慮した)最小の矩形を求めます. :param points: 入力される 2 次元点の集合. ``CV_32SC2`` または ``CV_32FC2`` の行列,あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. この関数は,指定された点の集合を囲む(回転してるかもしれない)最小の矩形領域を求めます.OpenCV のサンプル ``minarea.c`` を参照してください. .. index:: minEnclosingCircle cv::minEnclosingCircle ---------------------- `id=0.0538371813194 Comments from the Wiki `__ .. cfunction:: void minEnclosingCircle( const Mat\& points, Point2f\& center, float\& radius ) 与えられた 2 次元点集合を囲む最小の円を求めます. :param points: 入力される 2 次元点の集合. ``CV_32SC2`` または ``CV_32FC2`` の行列,あるいは,コンストラクタ ``Mat(const vector&)`` により行列に変換される ``vector`` または ``vector`` のベクトルで表現されます. :param center: 出力される円の中心. :param radius: 出力される円の半径. この関数は,反復アルゴリズムを用いて,与えられた 2 次元点集合を囲む最小の円を求めます.OpenCV のサンプル ``minarea.c`` を参照してください. .. index:: matchShapes cv::matchShapes --------------- `id=0.618314370511 Comments from the Wiki `__ .. cfunction:: double matchShapes( const Mat\& object1, const Mat\& object2, int method, double parameter=0 ) 2つの形状を比較します. :param object1: 1 番目の輪郭,またはグレースケール画像. :param object2: 2 番目の輪郭,またはグレースケール画像. :param method: 比較手法: ``CV_CONTOUR_MATCH_I1`` , \ ``CV_CONTOURS_MATCH_I2`` \ または ``CV_CONTOURS_MATCH_I3`` (see the discussion below) :param parameter: 比較手法毎のパラメータ(現在は利用されていません). 関数 ``matchShapes`` は,2 つの形状を比較します.実装されている 3 種類の手法は,以下に示すように,いずれも Hu モーメント( :func:`HuMoments` の説明を参照してください)を利用します( :math:`A` は ``object1`` , :math:`B` は ``object2`` を表しています): * method=CV\_CONTOUR\_MATCH\_I1 .. math:: I_1(A,B) = \sum _{i=1...7} \left | \frac{1}{m^A_i} - \frac{1}{m^B_i} \right | * method=CV\_CONTOUR\_MATCH\_I2 .. math:: I_2(A,B) = \sum _{i=1...7} \left | m^A_i - m^B_i \right | * method=CV\_CONTOUR\_MATCH\_I3 .. math:: I_3(A,B) = \sum _{i=1...7} \frac{ \left| m^A_i - m^B_i \right| }{ \left| m^A_i \right| } ここで .. math:: \begin{array}{l} m^A_i = \mathrm{sign} (h^A_i) \cdot \log{h^A_i} \\ m^B_i = \mathrm{sign} (h^B_i) \cdot \log{h^B_i} \end{array} です. また, :math:`h^A_i, h^B_i` は, :math:`A` と :math:`B` それぞれの Hu モーメントを表します. .. index:: pointPolygonTest cv::pointPolygonTest -------------------- `id=0.587963364307 Comments from the Wiki `__ .. cfunction:: double pointPolygonTest( const Mat\& contour, Point2f pt, bool measureDist ) 点と輪郭の関係を調べます. :param contour: 入力輪郭. :param pt: 輪郭に対して調べられる点. :param measureDist: これが真の場合,関数は与えられた点から最も近い輪郭辺までの符号付き距離を求めます.そうでない場合,点が輪郭の内側にあるか外側にあるかだけが調べられます. この関数は,点が輪郭の内側にあるか,外側にあるか,輪郭上に乗っている(あるいは,頂点と一致している)か, を判別します.そして,それに応じて,正値(内側),負置(外側),0(辺上)を返します. ``measureDist=false`` の場合は,戻り値はそれぞれ +1, -1, 0 になります. そうでない場合は,点と最も近い輪郭辺までの符号付き距離が戻り値となります. ここでは,画像の各ピクセルと輪郭との関係を調べたときの出力例を示します. .. image:: ../../pics/pointpolygon.png