OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
Geometry_shape

トピック

 Geometry_subdiv2d
 

詳細説明

クラス

struct  cv::Subdiv2D::QuadEdge
 
struct  cv::Subdiv2D::Vertex
 

列挙型

enum  {
  cv::Subdiv2D::PTLOC_ERROR = -2 ,
  cv::Subdiv2D::PTLOC_OUTSIDE_RECT = -1 ,
  cv::Subdiv2D::PTLOC_INSIDE = 0 ,
  cv::Subdiv2D::PTLOC_VERTEX = 1 ,
  cv::Subdiv2D::PTLOC_ON_EDGE = 2
}
 
enum  {
  cv::Subdiv2D::NEXT_AROUND_ORG = 0x00 ,
  cv::Subdiv2D::NEXT_AROUND_DST = 0x22 ,
  cv::Subdiv2D::PREV_AROUND_ORG = 0x11 ,
  cv::Subdiv2D::PREV_AROUND_DST = 0x33 ,
  cv::Subdiv2D::NEXT_AROUND_LEFT = 0x13 ,
  cv::Subdiv2D::NEXT_AROUND_RIGHT = 0x31 ,
  cv::Subdiv2D::PREV_AROUND_LEFT = 0x20 ,
  cv::Subdiv2D::PREV_AROUND_RIGHT = 0x02
}
 
enum  cv::DistanceTypes {
  cv::DIST_USER = -1 ,
  cv::DIST_L1 = 1 ,
  cv::DIST_L2 = 2 ,
  cv::DIST_C = 3 ,
  cv::DIST_L12 = 4 ,
  cv::DIST_FAIR = 5 ,
  cv::DIST_WELSCH = 6 ,
  cv::DIST_HUBER = 7
}
 
enum  cv::RectanglesIntersectTypes {
  cv::INTERSECT_NONE = 0 ,
  cv::INTERSECT_PARTIAL = 1 ,
  cv::INTERSECT_FULL = 2
}
 矩形間の交差の種類 詳細...
 

関数

 cv::Subdiv2D::QuadEdge::QuadEdge ()
 
 cv::Subdiv2D::QuadEdge::QuadEdge (int edgeidx)
 
 cv::Subdiv2D::Subdiv2D ()
 
 cv::Subdiv2D::Subdiv2D (Rect rect)
 
 cv::Subdiv2D::Subdiv2D (Rect2f rect2f)
 
 cv::Subdiv2D::Vertex::Vertex ()
 
 cv::Subdiv2D::Vertex::Vertex (Point2f pt, bool isvirtual, int firstEdge=0)
 
void cv::approxPolyDP (InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
 指定した精度で多角形曲線を近似する。
 
void cv::approxPolyN (InputArray curve, OutputArray approxCurve, int nsides, float epsilon_percentage=-1.0, bool ensure_convex=true)
 指定した精度と辺数で凸包により多角形を近似する。
 
double cv::arcLength (InputArray curve, bool closed)
 輪郭の周囲長または曲線の長さを計算する。
 
Rect cv::boundingRect (InputArray array)
 点集合またはグレースケール画像の非ゼロピクセルの正立バウンディング矩形を計算する。
 
void cv::boxPoints (RotatedRect box, OutputArray points)
 回転矩形の4つの頂点を求める。回転矩形の描画に役立つ。
 
void cv::Subdiv2D::calcVoronoi ()
 
void cv::Subdiv2D::checkSubdiv () const
 
void cv::Subdiv2D::clearVoronoi ()
 
int cv::Subdiv2D::connectEdges (int edgeA, int edgeB)
 
double cv::contourArea (InputArray contour, bool oriented=false)
 輪郭の面積を計算する。
 
void cv::convexHull (InputArray points, OutputArray hull, bool clockwise=false, bool returnPoints=true)
 点集合の凸包を求める。
 
void cv::convexityDefects (InputArray contour, InputArray convexhull, OutputArray convexityDefects)
 輪郭の凸性欠陥を求める。
 
void cv::Subdiv2D::deleteEdge (int edge)
 
void cv::Subdiv2D::deletePoint (int vtx)
 
int cv::Subdiv2D::edgeDst (int edge, Point2f *dstpt=0) const
 エッジの終点を返す。
 
int cv::Subdiv2D::edgeOrg (int edge, Point2f *orgpt=0) const
 エッジの始点を返す。
 
int cv::Subdiv2D::findNearest (Point2f pt, Point2f *nearestPt=0)
 与えられた点に最も近い細分割頂点を見つける。
 
RotatedRect cv::fitEllipse (InputArray points)
 2次元点群に楕円をフィッティングする。
 
RotatedRect cv::fitEllipseAMS (InputArray points)
 2次元点群に楕円をフィッティングする。
 
RotatedRect cv::fitEllipseDirect (InputArray points)
 2次元点群に楕円をフィッティングする。
 
void cv::fitLine (InputArray points, OutputArray line, int distType, double param, double reps, double aeps)
 2次元または3次元の点群に直線をフィッティングする。
 
Mat cv::getAffineTransform (const Point2f src[], const Point2f dst[])
 対応する3組の点からアフィン変換を計算する。
 
Mat cv::getAffineTransform (InputArray src, InputArray dst)
 
void cv::getClosestEllipsePoints (const RotatedRect &ellipse_params, InputArray points, OutputArray closest_pts)
 各2次元点について、指定した楕円上にある最も近い2次元点を計算する。
 
int cv::Subdiv2D::getEdge (int edge, int nextEdgeType) const
 与えられたエッジに関連するエッジのいずれかを返す。
 
void cv::Subdiv2D::getEdgeList (std::vector< Vec4f > &edgeList) const
 すべてのエッジのリストを返す。
 
void cv::Subdiv2D::getLeadingEdgeList (std::vector< int > &leadingEdgeList) const
 各三角形に接続された先頭エッジIDのリストを返す。
 
Mat cv::getPerspectiveTransform (const Point2f src[], const Point2f dst[], int solveMethod=DECOMP_LU)
 
Mat cv::getPerspectiveTransform (InputArray src, InputArray dst, int solveMethod=DECOMP_LU)
 対応する4組の点から透視変換を計算する。
 
Mat cv::getRotationMatrix2D (Point2f center, double angle, double scale)
 2次元回転のアフィン行列を計算する。
 
Matx23d cv::getRotationMatrix2D_ (Point2f center, double angle, double scale)
 
void cv::Subdiv2D::getTriangleList (std::vector< Vec6f > &triangleList) const
 すべての三角形のリストを返す。
 
Point2f cv::Subdiv2D::getVertex (int vertex, int *firstEdge=0) const
 頂点IDから頂点位置を返す。
 
void cv::Subdiv2D::getVoronoiFacetList (const std::vector< int > &idx, std::vector< std::vector< Point2f > > &facetList, std::vector< Point2f > &facetCenters)
 すべてのボロノイ面のリストを返す。
 
void cv::HuMoments (const Moments &m, OutputArray hu)
 
void cv::HuMoments (const Moments &moments, double hu[7])
 7つのHu不変モーメントを計算する。
 
void cv::Subdiv2D::initDelaunay (Rect rect)
 新しい空のドロネー細分割を作成する。
 
void cv::Subdiv2D::initDelaunay (Rect2f rect)
 新しい空のドロネー細分割を作成する。
 
void cv::Subdiv2D::insert (const std::vector< Point2f > &ptvec)
 ドロネー三角形分割に複数の点を挿入する。
 
int cv::Subdiv2D::insert (Point2f pt)
 ドロネー三角形分割に1つの点を挿入する。
 
float cv::intersectConvexConvex (InputArray p1, InputArray p2, OutputArray p12, bool handleNested=true)
 2つの凸多角形の交差を求める。
 
void cv::invertAffineTransform (InputArray M, OutputArray iM)
 アフィン変換を反転する。
 
bool cv::isContourConvex (InputArray contour)
 輪郭の凸性を判定する。
 
bool cv::Subdiv2D::QuadEdge::isfree () const
 
bool cv::Subdiv2D::Vertex::isfree () const
 
int cv::Subdiv2D::isRightOf (Point2f pt, int edge) const
 
bool cv::Subdiv2D::Vertex::isvirtual () const
 
int cv::Subdiv2D::locate (Point2f pt, int &edge, int &vertex)
 ドロネー三角形分割内における点の位置を返す。
 
double cv::matchShapes (InputArray contour1, InputArray contour2, int method, double parameter)
 2つの形状を比較する。
 
RotatedRect cv::minAreaRect (InputArray points)
 入力された2次元点群を囲む最小面積の回転矩形を求める。
 
void cv::minEnclosingCircle (InputArray points, Point2f &center, float &radius)
 2次元点群を囲む最小面積の円を求める。
 
double cv::minEnclosingConvexPolygon (InputArray points, OutputArray polygon, int k)
 2次元点群を囲む最小面積の凸多角形を求め、その面積を返す。
 
double cv::minEnclosingTriangle (InputArray points, OutputArray triangle)
 2次元点群を囲む最小面積の三角形を求め、その面積を返す。
 
Moments cv::moments (InputArray array, bool binaryImage=false)
 多角形またはラスタライズされた形状について、3次までのすべてのモーメントを計算する。
 
int cv::Subdiv2D::newEdge ()
 
int cv::Subdiv2D::newPoint (Point2f pt, bool isvirtual, int firstEdge=0)
 
int cv::Subdiv2D::nextEdge (int edge) const
 エッジ始点まわりの次のエッジを返す。
 
double cv::pointPolygonTest (InputArray contour, Point2f pt, bool measureDist)
 点が輪郭内にあるかどうかのテストを行う。
 
int cv::rotatedRectangleIntersection (const RotatedRect &rect1, const RotatedRect &rect2, OutputArray intersectingRegion)
 2つの回転矩形の間に交差があるかどうかを調べる。
 
int cv::Subdiv2D::rotateEdge (int edge, int rotate) const
 同じクワッドエッジの別のエッジを返す。
 
void cv::Subdiv2D::setEdgePoints (int edge, int orgPt, int dstPt)
 
void cv::Subdiv2D::splice (int edgeA, int edgeB)
 
void cv::Subdiv2D::swapEdges (int edge)
 
int cv::Subdiv2D::symEdge (int edge) const
 

変数

Point2f cv::Subdiv2D::bottomRight
 バウンディング矩形の右下隅。
 
int cv::Subdiv2D::Vertex::firstEdge
 
int cv::Subdiv2D::freePoint
 
int cv::Subdiv2D::freeQEdge
 
int cv::Subdiv2D::QuadEdge::next [4]
 
int cv::Subdiv2D::QuadEdge::pt [4]
 
Point2f cv::Subdiv2D::Vertex::pt
 
std::vector< QuadEdgecv::Subdiv2D::qedges
 すべてのエッジ。
 
int cv::Subdiv2D::recentEdge
 
Point2f cv::Subdiv2D::topLeft
 バウンディング矩形の左上隅。
 
int cv::Subdiv2D::Vertex::type
 
bool cv::Subdiv2D::validGeometry
 
std::vector< Vertexcv::Subdiv2D::vtx
 すべての頂点。
 

列挙型詳解

◆ anonymous enum

anonymous enum

Subdiv2D の点位置のケース

列挙値
PTLOC_ERROR 

点位置エラー。

PTLOC_OUTSIDE_RECT 

細分割のバウンディング矩形の外側の点。

PTLOC_INSIDE 

いずれかの面の内側の点。

PTLOC_VERTEX 

細分割頂点のいずれかと一致する点。

PTLOC_ON_EDGE 

いずれかのエッジ上の点。

◆ anonymous enum

anonymous enum

Subdiv2D のエッジ型ナビゲーション(参照: getEdge()

列挙値
NEXT_AROUND_ORG 
NEXT_AROUND_DST 
PREV_AROUND_ORG 
PREV_AROUND_DST 
NEXT_AROUND_LEFT 
NEXT_AROUND_RIGHT 
PREV_AROUND_LEFT 
PREV_AROUND_RIGHT 

◆ DistanceTypes

#include <opencv2/geometry/2d.hpp>

距離変換と M 推定量のための距離型

参照
distanceTransform, fitLine
列挙値
DIST_USER 
Python: cv.DIST_USER

ユーザー定義の距離。

DIST_L1 
Python: cv.DIST_L1

distance = |x1-x2| + |y1-y2|

DIST_L2 
Python: cv.DIST_L2

単純なユークリッド距離

DIST_C 
Python: cv.DIST_C

distance = max(|x1-x2|,|y1-y2|)

DIST_L12 
Python: cv.DIST_L12

L1-L2 メトリック: distance = 2(sqrt(1+x*x/2) - 1))

DIST_FAIR 
Python: cv.DIST_FAIR

distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998

DIST_WELSCH 
Python: cv.DIST_WELSCH

distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846

DIST_HUBER 
Python: cv.DIST_HUBER

distance = |x|<c ? x^2/2 : c(|x|-c/2), c=1.345

◆ RectanglesIntersectTypes

#include <opencv2/geometry/2d.hpp>

矩形間の交差の種類

列挙値
INTERSECT_NONE 
Python: cv.INTERSECT_NONE

交差なし。

INTERSECT_PARTIAL 
Python: cv.INTERSECT_PARTIAL

部分的な交差がある。

INTERSECT_FULL 
Python: cv.INTERSECT_FULL

一方の矩形がもう一方に完全に内包されている。

関数詳解

◆ QuadEdge() [1/2]

cv::Subdiv2D::QuadEdge::QuadEdge ( )

◆ QuadEdge() [2/2]

cv::Subdiv2D::QuadEdge::QuadEdge ( int edgeidx)

◆ Subdiv2D() [1/3]

cv::Subdiv2D::Subdiv2D ( )
Python:
cv.Subdiv2D() -> <Subdiv2D object>
cv.Subdiv2D(rect) -> <Subdiv2D object>
cv.Subdiv2D(rect2f) -> <Subdiv2D object>

#include <opencv2/geometry/2d.hpp>

空の Subdiv2D オブジェクトを生成する。新しい空のドロネー細分割を作成するには、initDelaunay 関数を使用する必要がある。

◆ Subdiv2D() [2/3]

cv::Subdiv2D::Subdiv2D ( Rect rect)
Python:
cv.Subdiv2D() -> <Subdiv2D object>
cv.Subdiv2D(rect) -> <Subdiv2D object>
cv.Subdiv2D(rect2f) -> <Subdiv2D object>

#include <opencv2/geometry/2d.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

引数
rect細分割に追加されるすべての2D点を含む矩形。

この関数は、insert() 関数を使って2D点を追加できる空のドロネー細分割を生成する。追加するすべての点は指定した矩形内になければならず、そうでない場合は実行時エラーが発生する。

◆ Subdiv2D() [3/3]

cv::Subdiv2D::Subdiv2D ( Rect2f rect2f)
Python:
cv.Subdiv2D() -> <Subdiv2D object>
cv.Subdiv2D(rect) -> <Subdiv2D object>
cv.Subdiv2D(rect2f) -> <Subdiv2D object>

#include <opencv2/geometry/2d.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ Vertex() [1/2]

cv::Subdiv2D::Vertex::Vertex ( )

◆ Vertex() [2/2]

cv::Subdiv2D::Vertex::Vertex ( Point2f pt,
bool isvirtual,
int firstEdge = 0 )

◆ approxPolyDP()

void cv::approxPolyDP ( InputArray curve,
OutputArray approxCurve,
double epsilon,
bool closed )
Python:
cv.approxPolyDP(curve, epsilon, closed[, approxCurve]) -> approxCurve

#include <opencv2/geometry/2d.hpp>

多角形の曲線を指定された精度で近似する。

cv::approxPolyDP 関数は、曲線または多角形を、それらの間の距離が指定された精度以下となるように、より少ない頂点を持つ別の曲線/多角形で近似する。Douglas-Peucker アルゴリズムを使用する https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm

引数
curvestd::vector または Mat に格納された2D点の入力ベクトル
approxCurve近似の結果。型は入力曲線の型と一致する必要がある。
epsilon近似精度を指定する引数。これは元の曲線とその近似との間の最大距離である。
closedtrue の場合、近似された曲線は閉曲線となる(最初と最後の頂点が接続される)。そうでない場合は閉じない。

◆ approxPolyN()

void cv::approxPolyN ( InputArray curve,
OutputArray approxCurve,
int nsides,
float epsilon_percentage = -1.0,
bool ensure_convex = true )
Python:
cv.approxPolyN(curve, nsides[, approxCurve[, epsilon_percentage[, ensure_convex]]]) -> approxCurve

#include <opencv2/geometry/2d.hpp>

指定された精度と辺数で、多角形を凸包で近似する。

cv::approxPolyN 関数は、元の輪郭の輪郭面積と新しい多角形との差が最小になるように、多角形を凸包で近似する。追加される面積が最小になるように2つの頂点を1つに収縮させる貪欲法を使用する。凸輪郭の各エッジで形成される直線が描かれ、その結果生じる三角形の面積が考慮される。各頂点は元の輪郭上にあるか、その外側にある。

このアルゴリズムは論文 [153] に基づく。

引数
curvestd::vector または Mat に格納された2D点の入力ベクトル。点は float または整数でなければならない。
approxCurve近似の結果。型は std::vector または Mat に格納された2D点(Point2f または Point)のベクトルである。
nsides結果の多角形の辺の数を定義する引数。
epsilon_percentage追加面積の最大値の割合を定義する。-1 の場合は使用されない。そうでない場合、追加面積が contourArea(_curve) * percentage を超えるとアルゴリズムは停止する。追加面積が制限を超えた場合、アルゴリズムは制限を超えた時点で存在していた数だけの頂点を返す。
ensure_convextrue の場合、アルゴリズムは入力輪郭の凸包を作成する。そうでない場合、入力ベクトルは凸でなければならない。

◆ arcLength()

double cv::arcLength ( InputArray curve,
bool closed )
Python:
cv.arcLength(curve, closed) -> retval

#include <opencv2/geometry/2d.hpp>

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

この関数は、曲線の長さまたは閉じた輪郭の周囲長を計算する。

引数
curvestd::vector または Mat に格納された2D点の入力ベクトル。
closed曲線が閉じているかどうかを示すフラグ。

◆ boundingRect()

Rect cv::boundingRect ( InputArray array)
Python:
cv.boundingRect(array) -> retval

#include <opencv2/geometry/2d.hpp>

点集合またはグレースケール画像の非ゼロピクセルに対する上向き(傾きのない)バウンディング矩形を計算する。

この関数は、指定された点集合またはグレースケール画像の非ゼロピクセルに対する最小の上向き(傾きのない)バウンディング矩形を計算して返す。

引数
array入力のグレースケール画像、または std::vector もしくは Mat に格納された2D点集合。

◆ boxPoints()

void cv::boxPoints ( RotatedRect box,
OutputArray points )
Python:
cv.boxPoints(box[, points]) -> points

#include <opencv2/geometry/2d.hpp>

回転矩形の4つの頂点を求める。回転矩形を描画する際に便利。

この関数は、回転矩形の4つの頂点を求める。4つの頂点は、\(y\) が最大の点から始まり時計回りの順序で返される。2つの点が同じ \(y\) 座標を持つ場合は、最も右の点が開始点となる。この関数は矩形を描画する際に便利である。C++では、この関数を使う代わりに、RotatedRect::points メソッドを直接使用できる。詳細については、バウンディング回転矩形と楕円の作成に関するチュートリアルを参照のこと。

引数
box入力の回転矩形。minAreaRect の出力でもよい。
points矩形の4頂点の出力配列。

◆ calcVoronoi()

void cv::Subdiv2D::calcVoronoi ( )
protected

◆ checkSubdiv()

void cv::Subdiv2D::checkSubdiv ( ) const
protected

◆ clearVoronoi()

void cv::Subdiv2D::clearVoronoi ( )
protected

◆ connectEdges()

int cv::Subdiv2D::connectEdges ( int edgeA,
int edgeB )
protected

◆ contourArea()

double cv::contourArea ( InputArray contour,
bool oriented = false )
Python:
cv.contourArea(contour[, oriented]) -> retval

#include <opencv2/geometry/2d.hpp>

輪郭の面積を計算する。

この関数は輪郭の面積を計算する。momentsと同様に、面積はグリーンの公式を用いて計算される。したがって、返される面積と、drawContoursfillPoly で輪郭を描画した場合の非ゼロピクセル数とは異なる場合がある。また、自己交差を持つ輪郭に対しては、この関数はほぼ確実に誤った結果を返す。

例:

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;
Point_< float > Point2f
Definition types.hpp:207
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
Approximates a polygonal curve(s) with the specified precision.
double contourArea(InputArray contour, bool oriented=false)
Calculates a contour area.
引数
contourstd::vector または Mat に格納された2D点(輪郭の頂点)の入力ベクトル。
oriented符号付き面積フラグ。true の場合、関数は輪郭の向き(時計回りまたは反時計回り)に応じて符号付きの面積値を返す。この機能を使うと、面積の符号から輪郭の向きを判定できる。デフォルトではこの引数は false で、絶対値が返される。

◆ convexHull()

void cv::convexHull ( InputArray points,
OutputArray hull,
bool clockwise = false,
bool returnPoints = true )
Python:
cv.convexHull(points[, hull[, clockwise[, returnPoints]]]) -> hull

#include <opencv2/geometry/2d.hpp>

点集合の凸包を求める。

cv::convexHull 関数は、Sklansky のアルゴリズム [256] を用いて2D点集合の凸包を求める。このアルゴリズムは現在の実装で O(N logN) の計算量を持つ。

引数
pointsstd::vector または Mat に格納された入力の2D点集合。
hull出力される凸包。インデックスの整数ベクトル、または点のベクトルのいずれかである。前者の場合、凸包の要素は元の配列における凸包点の0始まりのインデックスである(凸包点の集合は元の点集合の部分集合だからである)。後者の場合、凸包の要素は凸包点そのものである。
clockwise向きのフラグ。true の場合、出力される凸包は時計回りに向き付けられる。そうでない場合は反時計回りに向き付けられる。想定される座標系は、X 軸が右向き、Y 軸が上向きである。
returnPoints操作フラグ。行列の場合、フラグが true のとき、関数は凸包の点を返す。そうでない場合は凸包点のインデックスを返す。出力配列が std::vector の場合、このフラグは無視され、出力はベクトルの型に依存する。std::vector<int> は returnPoints=false を意味し、std::vector<Point> は returnPoints=true を意味する。
覚え書き
pointshull は異なる配列でなければならない。インプレース処理はサポートされていない。

詳細については 対応するチュートリアル を確認のこと。

参考リンク:

https://www.learnopencv.com/convex-hull-using-opencv-in-python-and-c/

◆ convexityDefects()

void cv::convexityDefects ( InputArray contour,
InputArray convexhull,
OutputArray convexityDefects )
Python:
cv.convexityDefects(contour, convexhull[, convexityDefects]) -> convexityDefects

#include <opencv2/geometry/2d.hpp>

輪郭の凸性欠陥を求める。

下図は手の輪郭の凸性欠陥を表示している:

image
引数
contour入力輪郭。
convexhullconvexHull を使って得られた凸包。凸包を構成する輪郭点のインデックスを含む必要がある。
convexityDefects凸性欠陥の出力ベクトル。C++ および新しい Python/Java インターフェースでは、各凸性欠陥は4要素の整数ベクトル(すなわち Vec4i)として表現される: (start_index, end_index, farthest_pt_index, fixpt_depth)。ここでインデックスは、凸性欠陥の始点・終点・最遠点の元の輪郭における0始まりのインデックスであり、fixpt_depth は最遠輪郭点と凸包との距離の固定小数点近似(8ビットの小数部を持つ)である。すなわち、深さの浮動小数点値を得るには fixpt_depth/256.0 とする。

◆ deleteEdge()

void cv::Subdiv2D::deleteEdge ( int edge)
protected

◆ deletePoint()

void cv::Subdiv2D::deletePoint ( int vtx)
protected

◆ edgeDst()

int cv::Subdiv2D::edgeDst ( int edge,
Point2f * dstpt = 0 ) const
Python:
cv.Subdiv2D.edgeDst(edge) -> retval, dstpt

#include <opencv2/geometry/2d.hpp>

エッジの終点を返す。

引数
edge細分割エッジのID。
dstpt出力の頂点位置。
戻り値
頂点ID。

◆ edgeOrg()

int cv::Subdiv2D::edgeOrg ( int edge,
Point2f * orgpt = 0 ) const
Python:
cv.Subdiv2D.edgeOrg(edge) -> retval, orgpt

#include <opencv2/geometry/2d.hpp>

エッジの始点を返す。

引数
edge細分割エッジのID。
orgpt出力の頂点位置。
戻り値
頂点ID。

◆ findNearest()

int cv::Subdiv2D::findNearest ( Point2f pt,
Point2f * nearestPt = 0 )
Python:
cv.Subdiv2D.findNearest(pt) -> retval, nearestPt

#include <opencv2/geometry/2d.hpp>

与えられた点に最も近い細分割頂点を見つける。

引数
pt入力点。
nearestPt出力の細分割頂点。

この関数は、入力点を細分割内で特定するもう一つの関数である。入力点に最も近い細分割の頂点を見つける。それは必ずしも入力点を含むファセットの頂点の一つとは限らないが、(locate() を用いて特定された)ファセットが開始点として使用される。

戻り値
頂点ID。

◆ fitEllipse()

RotatedRect cv::fitEllipse ( InputArray points)
Python:
cv.fitEllipse(points) -> retval

#include <opencv2/geometry/2d.hpp>

2D 点の集合の周りに楕円をフィッティングする。

この関数は、2D点集合に(最小二乗の意味で)最もよく適合する楕円を計算する。楕円が内接する回転矩形を返す。[97] で説明されている最初のアルゴリズムが使用される。データ点が、それらを含む Mat 要素の境界に近い場合、返される楕円/rotatedRect のデータに負のインデックスが含まれる可能性があることに留意すべきである。

引数
pointsstd::vector<> または Mat に格納された入力の2D点集合
覚え書き
入力点の型は Point2i または Point2f であり、少なくとも 5 点が必要である。
getClosestEllipsePoints 関数を用いて楕円フィッティングの誤差を計算できる。

◆ fitEllipseAMS()

RotatedRect cv::fitEllipseAMS ( InputArray points)
Python:
cv.fitEllipseAMS(points) -> retval

#include <opencv2/geometry/2d.hpp>

2D 点の集合の周りに楕円をフィッティングする。

この関数は、2D点集合に適合する楕円を計算する。楕円が内接する回転矩形を返す。[274] によって提案された Approximate Mean Square (AMS) が使用される。

楕円の場合、この基底集合は \( \chi= \left(x^2, x y, y^2, x, y, 1\right) \) であり、これは 6 つの自由係数 \( A^T=\left\{A_{\text{xx}},A_{\text{xy}},A_{\text{yy}},A_x,A_y,A_0\right\} \) の集合である。しかし、楕円を指定するために必要なのは 5 つの数値だけである。すなわち、長軸と短軸の長さ \( (a,b) \)、位置 \( (x_0,y_0) \)、および向き \( \theta \) である。これは、基底集合が楕円関数だけでなく、直線、二次関数、放物線関数、双曲線関数も可能なフィットとして含むためである。フィットが放物線関数または双曲線関数であると判明した場合は、標準の fitEllipse メソッドが使用される。AMS 法は、\( A^T ( D_x^T D_x + D_y^T D_y) A = 1 \) という条件を課すことでフィットを放物線、双曲線、楕円曲線に制限する。ここで行列 \( Dx \) と \( Dy \) は、設計行列 \( D \) の x および y に関する偏導関数である。行列は、集合内の各点に対して以下を適用して 1 行ずつ形成される:

\begin{align*} D(i,:)&=\left\{x_i^2, x_i y_i, y_i^2, x_i, y_i, 1\right\} & D_x(i,:)&=\left\{2 x_i,y_i,0,1,0,0\right\} & D_y(i,:)&=\left\{0,x_i,2 y_i,0,1,0\right\} \end{align*}

AMS 法はコスト関数を最小化する

\begin{equation*} \epsilon ^2=\frac{ A^T D^T D A }{ A^T (D_x^T D_x + D_y^T D_y) A^T } \end{equation*}

最小コストは一般化固有値問題を解くことで求められる。

\begin{equation*} D^T D A = \lambda \left( D_x^T D_x + D_y^T D_y\right) A \end{equation*}

引数
pointsstd::vector<> または Mat に格納された入力の2D点集合
覚え書き
入力点の型は Point2i または Point2f であり、少なくとも 5 点が必要である。
getClosestEllipsePoints 関数を用いて楕円フィッティングの誤差を計算できる。

◆ fitEllipseDirect()

RotatedRect cv::fitEllipseDirect ( InputArray points)
Python:
cv.fitEllipseDirect(points) -> retval

#include <opencv2/geometry/2d.hpp>

2D 点の集合の周りに楕円をフィッティングする。

この関数は、2D点集合に適合する楕円を計算する。楕円が内接する回転矩形を返す。[219] による Direct least square (Direct) 法が使用される。

楕円の場合、この基底集合は \( \chi= \left(x^2, x y, y^2, x, y, 1\right) \) であり、これは 6 つの自由係数 \( A^T=\left\{A_{\text{xx}},A_{\text{xy}},A_{\text{yy}},A_x,A_y,A_0\right\} \) の集合である。しかし、楕円を指定するために必要なのは 5 つの数値だけである。すなわち、長軸と短軸の長さ \( (a,b) \)、位置 \( (x_0,y_0) \)、および向き \( \theta \) である。これは、基底集合が楕円関数だけでなく、直線、二次関数、放物線関数、双曲線関数も可能なフィットとして含むためである。Direct 法は、\( 4 A_{xx} A_{yy}- A_{xy}^2 > 0 \) を保証することでフィットを楕円に限定する。課される条件は \( 4 A_{xx} A_{yy}- A_{xy}^2=1 \) であり、これは不等式を満たし、また係数は任意にスケーリング可能であるため過度に制限的ではない。

\begin{equation*} \epsilon ^2= A^T D^T D A \quad \text{with} \quad A^T C A =1 \quad \text{and} \quad C=\left(\begin{matrix} 0 & 0 & 2 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 & 0 & 0 \\ 2 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \end{matrix} \right) \end{equation*}

最小コストは一般化固有値問題を解くことで求められる。

\begin{equation*} D^T D A = \lambda \left( C\right) A \end{equation*}

このシステムは正の固有値 \( \lambda\) を 1 つだけ生成し、それが固有ベクトル \(\mathbf{u}\) とともに解として選ばれる。これらを用いて係数を求める

\begin{equation*} A = \sqrt{\frac{1}{\mathbf{u}^T C \mathbf{u}}} \mathbf{u} \end{equation*}

スケーリング係数は \(A^T C A =1\) を保証する。

引数
pointsstd::vector<> または Mat に格納された入力の2D点集合
覚え書き
入力点の型は Point2i または Point2f であり、少なくとも 5 点が必要である。
getClosestEllipsePoints 関数を用いて楕円フィッティングの誤差を計算できる。

◆ fitLine()

void cv::fitLine ( InputArray points,
OutputArray line,
int distType,
double param,
double reps,
double aeps )
Python:
cv.fitLine(points, distType, param, reps, aeps[, line]) -> line

#include <opencv2/geometry/2d.hpp>

2D または 3D の点集合に直線をフィッティングする。

関数 fitLine は、\(\sum_i \rho(r_i)\) を最小化することで 2D または 3D の点集合に直線をフィッティングする。ここで \(r_i\) は \(i^{th}\) 点と直線との間の距離であり、\(\rho(r)\) は距離関数で、以下のいずれかである:

  • DIST_L2

    \[\rho (r) = r^2/2 \quad \text{(the simplest and the fastest least-squares method)}\]

  • DIST_L1

    \[\rho (r) = r\]

  • DIST_L12

    \[\rho (r) = 2 \cdot ( \sqrt{1 + \frac{r^2}{2}} - 1)\]

  • DIST_FAIR

    \[\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\]

  • DIST_WELSCH

    \[\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\]

  • DIST_HUBER

    \[\rho (r) = \fork{r^2/2}{if \(r < C\)}{C \cdot (r-C/2)}{otherwise} \quad \text{where} \quad C=1.345\]

このアルゴリズムは、重み付き最小二乗アルゴリズムを用いて反復的に直線をフィッティングする M 推定量 ( https://en.wikipedia.org/wiki/M-estimator ) の手法に基づいている。各反復の後、重み \(w_i\) は \(\rho(r_i)\) に反比例するように調整される。

引数
pointsstd::vector<> または Mat に格納された2Dまたは3D点の入力ベクトル。
line出力される直線の引数。2次元フィッティングの場合、4要素のベクトル(Vec4f など)であり、(vx, vy, x0, y0) となる。ここで (vx, vy) は直線に平行な正規化ベクトル、(x0, y0) は直線上の点である。3次元フィッティングの場合、6要素のベクトル(Vec6f など)であり、(vx, vy, vz, x0, y0, z0) となる。ここで (vx, vy, vz) は直線に平行な正規化ベクトル、(x0, y0, z0) は直線上の点である。
distTypeM推定量で使用する距離。DistanceTypes を参照
param一部の距離種別における数値パラメータ ( C )。0の場合、最適な値が選択される。
reps半径(座標原点と直線との距離)に対する十分な精度。
aeps角度に対する十分な精度。reps と aeps には 0.01 が適切なデフォルト値である。

◆ getAffineTransform() [1/2]

Mat cv::getAffineTransform ( const Point2f src[],
const Point2f dst[] )
Python:
cv.getAffineTransform(src, dst) -> retval

#include <opencv2/geometry/2d.hpp>

対応する3組の点からアフィン変換を計算する。

この関数は次を満たすようにアフィン変換の \(2 \times 3\) 行列を計算する:

\[\begin{bmatrix} x'_i \\ y'_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\]

ここで

\[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2\]

引数
srcソース画像における三角形の頂点座標。
dstデスティネーション画像における対応する三角形の頂点座標。
参照
warpAffine, transform

◆ getAffineTransform() [2/2]

Mat cv::getAffineTransform ( InputArray src,
InputArray dst )
Python:
cv.getAffineTransform(src, dst) -> retval

◆ getClosestEllipsePoints()

void cv::getClosestEllipsePoints ( const RotatedRect & ellipse_params,
InputArray points,
OutputArray closest_pts )
Python:
cv.getClosestEllipsePoints(ellipse_params, points[, closest_pts]) -> closest_pts

#include <opencv2/geometry/2d.hpp>

各 2D 点について、指定された楕円上に位置する最近傍の 2D 点を計算する。

この関数は、2D 点のベクトルに対して、指定された楕円上の最近傍の 2D 位置を計算するもので、[53] のコードに基づいている。この関数は、例えば楕円フィッティングの誤差を計算するために使用できる。

引数
ellipse_params楕円の引数
points入力2次元点
closest_pts各2次元点に対応する、与えられた楕円上にある最近接の2次元点
覚え書き
入力点の型は Point2i または Point2f である
参照
fitEllipse, fitEllipseAMS, fitEllipseDirect

◆ getEdge()

int cv::Subdiv2D::getEdge ( int edge,
int nextEdgeType ) const
Python:
cv.Subdiv2D.getEdge(edge, nextEdgeType) -> retval

#include <opencv2/geometry/2d.hpp>

与えられたエッジに関連するエッジのいずれかを返す。

引数
edge細分割エッジのID。
nextEdgeType返す関連エッジのいずれかを指定する引数。可能な値は次のとおり:
  • NEXT_AROUND_ORG エッジ始点まわりの次のエッジ ( e が入力エッジのとき、下図の eOnext )
  • NEXT_AROUND_DST エッジ頂点まわりの次のエッジ ( eDnext )
  • PREV_AROUND_ORG エッジ始点まわりの前のエッジ (eRnext の反転)
  • PREV_AROUND_DST エッジ終点まわりの前のエッジ (eLnext の反転)
  • NEXT_AROUND_LEFT 左の面まわりの次のエッジ ( eLnext )
  • NEXT_AROUND_RIGHT 右の面まわりの次のエッジ ( eRnext )
  • PREV_AROUND_LEFT 左の面まわりの前のエッジ (eOnext の反転)
  • PREV_AROUND_RIGHT 右の面まわりの前のエッジ (eDnext の反転)
sample output
戻り値
入力エッジに関連するエッジID。

◆ getEdgeList()

void cv::Subdiv2D::getEdgeList ( std::vector< Vec4f > & edgeList) const
Python:
cv.Subdiv2D.getEdgeList() -> edgeList

#include <opencv2/geometry/2d.hpp>

すべてのエッジのリストを返す。

引数
edgeList出力ベクトル。

この関数は各エッジを4つの数値からなるベクトルとして返す。各2つの値がエッジの頂点の一方を表す。すなわち org_x = v[0], org_y = v[1], dst_x = v[2], dst_y = v[3]。

◆ getLeadingEdgeList()

void cv::Subdiv2D::getLeadingEdgeList ( std::vector< int > & leadingEdgeList) const
Python:
cv.Subdiv2D.getLeadingEdgeList() -> leadingEdgeList

#include <opencv2/geometry/2d.hpp>

各三角形に接続された先頭エッジIDのリストを返す。

引数
leadingEdgeList出力ベクトル。

この関数は各三角形に対して1つのエッジIDを返す。

◆ getPerspectiveTransform() [1/2]

Mat cv::getPerspectiveTransform ( const Point2f src[],
const Point2f dst[],
int solveMethod = DECOMP_LU )
Python:
cv.getPerspectiveTransform(src, dst[, solveMethod]) -> retval

#include <opencv2/geometry/2d.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ getPerspectiveTransform() [2/2]

Mat cv::getPerspectiveTransform ( InputArray src,
InputArray dst,
int solveMethod = DECOMP_LU )
Python:
cv.getPerspectiveTransform(src, dst[, solveMethod]) -> retval

#include <opencv2/geometry/2d.hpp>

対応する4組の点から透視変換を計算する。

この関数は次を満たすように透視変換の \(3 \times 3\) 行列を計算する:

\[\begin{bmatrix} t_i x'_i \\ t_i y'_i \\ t_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\]

ここで

\[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2,3\]

引数
srcソース画像における四角形の頂点座標。
dstデスティネーション画像における対応する四角形の頂点座標。
solveMethodcv::solve に渡されるメソッド (DecompTypes)
参照
findHomography, warpPerspective, perspectiveTransform

◆ getRotationMatrix2D()

Mat cv::getRotationMatrix2D ( Point2f center,
double angle,
double scale )
inline
Python:
cv.getRotationMatrix2D(center, angle, scale) -> retval

#include <opencv2/geometry/2d.hpp>

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

この関数は次の行列を計算する:

\[\begin{bmatrix} \alpha & \beta & (1- \alpha ) \cdot \texttt{center.x} - \beta \cdot \texttt{center.y} \\ - \beta & \alpha & \beta \cdot \texttt{center.x} + (1- \alpha ) \cdot \texttt{center.y} \end{bmatrix}\]

ここで

\[\begin{array}{l} \alpha = \texttt{scale} \cdot \cos \texttt{angle} , \\ \beta = \texttt{scale} \cdot \sin \texttt{angle} \end{array}\]

この変換は回転中心をそれ自身に写す。これが目的でない場合は、シフト量を調整する。

引数
centerソース画像における回転の中心。
angle回転角度(度単位)。正の値は反時計回りの回転を意味する(座標原点は左上隅にあると仮定する)。
scale等方的なスケール係数。
参照
getAffineTransform, warpAffine, transform
この関数の呼び出しグラフ:

◆ getRotationMatrix2D_()

Matx23d cv::getRotationMatrix2D_ ( Point2f center,
double angle,
double scale )

◆ getTriangleList()

void cv::Subdiv2D::getTriangleList ( std::vector< Vec6f > & triangleList) const
Python:
cv.Subdiv2D.getTriangleList() -> triangleList

#include <opencv2/geometry/2d.hpp>

すべての三角形のリストを返す。

引数
triangleList出力ベクトル。

この関数は各三角形を6つの数値からなるベクトルとして返す。各2つの値が三角形の頂点の一方を表す。すなわち p1_x = v[0], p1_y = v[1], p2_x = v[2], p2_y = v[3], p3_x = v[4], p3_y = v[5]。

◆ getVertex()

Point2f cv::Subdiv2D::getVertex ( int vertex,
int * firstEdge = 0 ) const
Python:
cv.Subdiv2D.getVertex(vertex) -> retval, firstEdge

#include <opencv2/geometry/2d.hpp>

頂点IDから頂点の位置を返す。

引数
vertex頂点ID。
firstEdge省略可能。頂点に接続された最初のエッジID。
戻り値
頂点 (x,y)

◆ getVoronoiFacetList()

void cv::Subdiv2D::getVoronoiFacetList ( const std::vector< int > & idx,
std::vector< std::vector< Point2f > > & facetList,
std::vector< Point2f > & facetCenters )
Python:
cv.Subdiv2D.getVoronoiFacetList(idx) -> facetList, facetCenters

#include <opencv2/geometry/2d.hpp>

すべてのボロノイ図のファセットのリストを返す。

引数
idx対象とする頂点IDのベクトル。すべての頂点を対象とする場合は空のベクトルを渡せばよい。
facetListボロノイ面の出力ベクトル。
facetCentersボロノイ面の中心点の出力ベクトル。

◆ HuMoments() [1/2]

void cv::HuMoments ( const Moments & m,
OutputArray hu )
Python:
cv.HuMoments(m[, hu]) -> hu

#include <opencv2/geometry/2d.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ HuMoments() [2/2]

void cv::HuMoments ( const Moments & moments,
double hu[7] )
Python:
cv.HuMoments(m[, hu]) -> hu

#include <opencv2/geometry/2d.hpp>

7 つの Hu 不変量を計算する。

この関数は、7つの Hu 不変量([134] で導入された。https://en.wikipedia.org/wiki/Image_moment も参照)を計算する。これらは次のように定義される:

\[\begin{array}{l} hu[0]= \eta _{20}+ \eta _{02} \\ hu[1]=( \eta _{20}- \eta _{02})^{2}+4 \eta _{11}^{2} \\ hu[2]=( \eta _{30}-3 \eta _{12})^{2}+ (3 \eta _{21}- \eta _{03})^{2} \\ hu[3]=( \eta _{30}+ \eta _{12})^{2}+ ( \eta _{21}+ \eta _{03})^{2} \\ hu[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}] \\ hu[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}) \\ hu[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}\]

ここで \(\eta_{ji}\) は \(\texttt{Moments::nu}_{ji}\) を表す。

これらの値は、7 番目を除いて画像のスケール、回転、反転に対して不変であることが証明されている。7 番目の符号は反転によって変化する。この不変性は無限の画像解像度を仮定して証明されている。ラスタ画像の場合、元画像と変換後画像で計算された Hu 不変量は少し異なる。

引数
momentsmoments で計算された入力モーメント。
hu出力される Hu 不変量。
参照
matchShapes

◆ initDelaunay() [1/2]

void cv::Subdiv2D::initDelaunay ( Rect rect)
Python:
cv.Subdiv2D.initDelaunay(rect) -> None
cv.Subdiv2D.initDelaunay2f(rect) -> None

#include <opencv2/geometry/2d.hpp>

新しい空のドロネー分割を作成する。

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

引数
rect細分割に追加されるすべての2D点を含む矩形。

◆ initDelaunay() [2/2]

void cv::Subdiv2D::initDelaunay ( Rect2f rect)
Python:
cv.Subdiv2D.initDelaunay(rect) -> None
cv.Subdiv2D.initDelaunay2f(rect) -> None

#include <opencv2/geometry/2d.hpp>

新しい空のドロネー分割を作成する。

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

引数
rect細分割に追加されるすべての2D点を含む矩形。

◆ insert() [1/2]

void cv::Subdiv2D::insert ( const std::vector< Point2f > & ptvec)
Python:
cv.Subdiv2D.insert(pt) -> retval
cv.Subdiv2D.insert(ptvec) -> None

#include <opencv2/geometry/2d.hpp>

ドロネー三角形分割に複数の点を挿入する。

引数
ptvec挿入する点群。

この関数は点のベクトルを分割に挿入し、それに応じて分割のトポロジーを変更する。

◆ insert() [2/2]

int cv::Subdiv2D::insert ( Point2f pt)
Python:
cv.Subdiv2D.insert(pt) -> retval
cv.Subdiv2D.insert(ptvec) -> None

#include <opencv2/geometry/2d.hpp>

ドロネー三角形分割に単一の点を挿入する。

引数
pt挿入する点。

この関数は単一の点を分割に挿入し、それに応じて分割のトポロジーを変更する。同じ座標の点がすでに存在する場合、新しい点は追加されない。

戻り値
点のID。
覚え書き
点が指定された矩形 rect の三角形分割の外側にある場合、実行時エラーが発生する。

◆ intersectConvexConvex()

float cv::intersectConvexConvex ( InputArray p1,
InputArray p2,
OutputArray p12,
bool handleNested = true )
Python:
cv.intersectConvexConvex(p1, p2[, p12[, handleNested]]) -> retval, p12

#include <opencv2/geometry/2d.hpp>

2 つの凸多角形の交差を求める。

引数
p11つ目の多角形
p22つ目の多角形
p12交差領域を表す出力多角形
handleNestedtrue の場合、一方の多角形が他方に完全に内包されているときに交差が検出される。false の場合、交差は検出されない。多角形が辺を共有している場合、または一方の多角形の頂点が他方の辺上にある場合、それらは入れ子とは見なされず、handleNested の値にかかわらず交差が検出される。
戻り値
交差する多角形の面積。アルゴリズムが収束しなかった場合 (例えば入力が非凸の場合) は負になることがある。
覚え書き
intersectConvexConvex は両方の多角形が凸であることを確認しないため、凸でない場合は無効な結果を返す。

◆ invertAffineTransform()

void cv::invertAffineTransform ( InputArray M,
OutputArray iM )
Python:
cv.invertAffineTransform(M[, iM]) -> iM

#include <opencv2/geometry/2d.hpp>

アフィン変換を反転する。

この関数は \(2 \times 3\) 行列 M で表されるアフィン変換の逆変換を計算する:

\[\begin{bmatrix} a_{11} & a_{12} & b_1 \\ a_{21} & a_{22} & b_2 \end{bmatrix}\]

結果も M と同じ型の \(2 \times 3\) 行列である。

引数
M元のアフィン変換。
iM出力される逆アフィン変換。

◆ isContourConvex()

bool cv::isContourConvex ( InputArray contour)
Python:
cv.isContourConvex(contour) -> retval

#include <opencv2/geometry/2d.hpp>

輪郭の凸性をテストする。

この関数は、入力された輪郭が凸であるかどうかをテストする。輪郭は単純である、すなわち自己交差がないものでなければならない。そうでない場合、関数の出力は未定義である。

引数
contourstd::vector<> または Mat に格納された2D点の入力ベクトル

◆ isfree() [1/2]

bool cv::Subdiv2D::QuadEdge::isfree ( ) const

◆ isfree() [2/2]

bool cv::Subdiv2D::Vertex::isfree ( ) const

◆ isRightOf()

int cv::Subdiv2D::isRightOf ( Point2f pt,
int edge ) const
protected

◆ isvirtual()

bool cv::Subdiv2D::Vertex::isvirtual ( ) const

◆ locate()

int cv::Subdiv2D::locate ( Point2f pt,
int & edge,
int & vertex )
Python:
cv.Subdiv2D.locate(pt) -> retval, edge, vertex

#include <opencv2/geometry/2d.hpp>

ドロネー三角形分割内における点の位置を返す。

引数
pt位置を特定する点。
edgeその点が属する、またはその点の右に位置する出力エッジ。
vertex入力点と一致する、省略可能な出力頂点。

この関数は入力点を分割内で位置特定し、三角形のエッジまたは頂点の1つを返す。

戻り値
an integer which specify one of the following five cases for point location:
  • 点はいずれかのファセット内に入る。この関数は PTLOC_INSIDE を返し、edge にはそのファセットのエッジの一つが格納される。
  • 点はエッジ上に乗る。この関数は PTLOC_ON_EDGE を返し、edge にはこのエッジが格納される。
  • 点は細分割の頂点の一つと一致する。この関数は PTLOC_VERTEX を返し、vertex にはその頂点へのポインタが格納される。
  • 点は細分割の参照矩形の外側にある。この関数は PTLOC_OUTSIDE_RECT を返し、ポインタは一切設定されない。
  • 入力引数の一つが無効である。実行時エラーが発生するか、silent または「parent」のエラー処理モードが選択されている場合は PTLOC_ERROR が返される。

◆ matchShapes()

double cv::matchShapes ( InputArray contour1,
InputArray contour2,
int method,
double parameter )
Python:
cv.matchShapes(contour1, contour2, method, parameter) -> retval

#include <opencv2/geometry/2d.hpp>

2 つの形状を比較する。

この関数は 2 つの形状を比較する。実装された 3 つのメソッドはすべて Hu 不変量 (HuMoments を参照) を使用する

引数
contour11つ目の輪郭またはグレースケール画像。
contour22つ目の輪郭またはグレースケール画像。
method比較手法。ShapeMatchModes を参照
parameter手法固有の引数(現在はサポートされていない)。

◆ minAreaRect()

RotatedRect cv::minAreaRect ( InputArray points)
Python:
cv.minAreaRect(points) -> retval

#include <opencv2/geometry/2d.hpp>

入力された 2D 点集合を囲む最小面積の回転矩形を求める。

この関数は、指定した点集合に対する最小面積の(回転している可能性のある)バウンディング矩形を計算して返す。回転角は、始点と終点を結ぶ線(最大の \(y\) を持つコーナーに対して最大のインデックスを持つ時計回り順に基づく)と水平軸との間の角度を表す。この角度は常に \([-90, 0)\) の範囲に収まる。なぜなら、オブジェクトが矩形角を超えて回転すると、角度を測るために次のエッジが使用されるためである。オブジェクトが回転すると、始点と終点は変化する。データがそれを含む Mat 要素の境界に近い場合、返される RotatedRect に負のインデックスが含まれる可能性があることに、開発者は留意すべきである。

引数
pointsstd::vector<> または Mat に格納された2D点の入力ベクトル

◆ minEnclosingCircle()

void cv::minEnclosingCircle ( InputArray points,
Point2f & center,
float & radius )
Python:
cv.minEnclosingCircle(points) -> center, radius

#include <opencv2/geometry/2d.hpp>

2D 点集合を囲む最小面積の円を求める。

この関数は、反復アルゴリズムを用いて 2D 点集合の最小包含円を求める。

引数
pointsstd::vector<> または Mat に格納された2D点の入力ベクトル
center出力される円の中心。
radius出力される円の半径。

◆ minEnclosingConvexPolygon()

double cv::minEnclosingConvexPolygon ( InputArray points,
OutputArray polygon,
int k )
Python:
cv.minEnclosingConvexPolygon(points, k[, polygon]) -> retval, polygon

#include <opencv2/geometry/2d.hpp>

2D 点集合を囲む最小面積の凸多角形を求め、その面積を返す。

この関数は、与えられた 2D 点集合を受け取り、k 個の頂点を持ち面積が最小となる包含多角形を求める。点集合と引数 k を入力として受け取り、最小包含多角形の面積を返す。

実装は Aggarwal、Chang、Yap による論文 [2] に基づいている。彼らは、n 個の頂点を持つ 2D 凸多角形 (k < n) を囲む k 個の頂点を持つ最小凸多角形を求めるための \(\theta(n²log(n)log(k))\) アルゴリズムを提供している。minEnclosingConvexPolygon 関数は 2D 点集合を入力として受け取るため、2D 点集合の凸包を計算する追加の前処理ステップが必要となる。convexHull 関数の計算量は \(O(n log(n))\) であり、\(\theta(n²log(n)log(k))\) より小さい。したがって、関数全体の計算量は \(O(n²log(n)log(k))\) となる。

引数
pointsstd::vector<> または Mat に格納された2D点の入力ベクトル
polygon包含多角形の頂点を定義する2次元点の出力ベクトル
k出力多角形の頂点数

◆ minEnclosingTriangle()

double cv::minEnclosingTriangle ( InputArray points,
OutputArray triangle )
Python:
cv.minEnclosingTriangle(points[, triangle]) -> retval, triangle

#include <opencv2/geometry/2d.hpp>

2D 点集合を囲む最小面積の三角形を求め、その面積を返す。

この関数は、与えられた 2D 点集合を囲む最小面積の三角形を求め、その面積を返す。与えられた 2D 点集合に対する出力を下の画像に示す。2D 点は赤* で、囲む三角形は 黄色 で描かれている。

Sample output of the minimum enclosing triangle function

このアルゴリズムの実装は、O'Rourke の [218] と Klee および Laskowski の [152] の論文に基づく。O'Rourke は、n 個の頂点を持つ2D凸多角形の最小外接三角形を求める \(\theta(n)\) アルゴリズムを提供している。minEnclosingTriangle 関数は2D点集合を入力として取るため、2D点集合の凸包を計算する追加の前処理ステップが必要となる。convexHull 関数の計算量は \(O(n log(n))\) であり、これは \(\theta(n)\) より大きい。したがって、関数全体の計算量は \(O(n log(n))\) となる。

引数
pointsビット深度 CV_32S または CV_32F の2D点の入力ベクトル。std::vector<> または Mat に格納される
triangle三角形の頂点を定義する3つの2次元点の出力ベクトル。OutputArray のビット深度は CV_32F でなければならない。

◆ moments()

Moments cv::moments ( InputArray array,
bool binaryImage = false )
Python:
cv.moments(array[, binaryImage]) -> retval

#include <opencv2/geometry/2d.hpp>

多角形またはラスタライズされた形状の 3 次までのすべてのモーメントを計算する。

この関数は、ベクトル形状またはラスタライズされた形状の 3 次までのモーメントを計算する。結果は構造体 cv::Moments に返される。

引数
arrayシングルチャンネルのラスター画像(CV_8U, CV_16U, CV_16S, CV_32F, CV_64F)、または2D点(Point もしくは Point2f)の配列( \(1 \times N\) または \(N \times 1\) )。
binaryImagetrue の場合、すべての非ゼロの画像ピクセルが 1 として扱われる。この引数は画像に対してのみ使用される。
戻り値
モーメント。
覚え書き
Python バインディングからの輪郭モーメント計算にのみ適用される: 入力配列の numpy 型は np.int32 または np.float32 のいずれかでなければならないことに注意する。
輪郭ベースのモーメントの場合、0 次のモーメント m00 は輪郭の面積を表す。

入力された輪郭が退化している場合 (例えば、単一の点であるか、すべての点が共線である場合)、面積はゼロとなり、したがって m00 == 0 となる。

この場合、重心座標 (m10/m00, m01/m00) は未定義であり、呼び出し側が明示的に処理しなければならない。

一般的な回避策は、cv::boundingRect() を用いるか、入力点を平均することで中心を計算することである。

参照
contourArea, arcLength

◆ newEdge()

int cv::Subdiv2D::newEdge ( )
protected

◆ newPoint()

int cv::Subdiv2D::newPoint ( Point2f pt,
bool isvirtual,
int firstEdge = 0 )
protected

◆ nextEdge()

int cv::Subdiv2D::nextEdge ( int edge) const
Python:
cv.Subdiv2D.nextEdge(edge) -> retval

#include <opencv2/geometry/2d.hpp>

エッジの起点の周りの次のエッジを返す。

引数
edge細分割エッジのID。
戻り値
エッジの起点の周りの次のエッジIDを表す整数(e が入力エッジの場合、上図の eOnext)。

◆ pointPolygonTest()

double cv::pointPolygonTest ( InputArray contour,
Point2f pt,
bool measureDist )
Python:
cv.pointPolygonTest(contour, pt, measureDist) -> retval

#include <opencv2/geometry/2d.hpp>

点が輪郭内にあるかどうかのテストを実行する。

この関数は、点が輪郭の内側、外側、またはエッジ上にある (もしくは頂点と一致する) かを判定する。それぞれ正 (内側)、負 (外側)、ゼロ (エッジ上) の値を返す。measureDist=false の場合、戻り値はそれぞれ +1、-1、0 となる。そうでない場合、戻り値は点と最も近い輪郭エッジとの間の符号付き距離となる。

各画像ピクセルを輪郭に対してテストした関数の出力例を以下に示す:

sample output
引数
contour入力輪郭。
pt輪郭に対して判定される点。
measureDisttrue の場合、関数は点から最も近い輪郭エッジまでの符号付き距離を推定する。そうでない場合、関数は点が輪郭の内側にあるかどうかのみを判定する。

◆ rotatedRectangleIntersection()

int cv::rotatedRectangleIntersection ( const RotatedRect & rect1,
const RotatedRect & rect2,
OutputArray intersectingRegion )
Python:
cv.rotatedRectangleIntersection(rect1, rect2[, intersectingRegion]) -> retval, intersectingRegion

#include <opencv2/geometry/2d.hpp>

2 つの回転矩形の間に交差があるかどうかを調べる。

交差がある場合は、交差領域の頂点も返される。

以下に交差の構成例をいくつか示す。ハッチングされたパターンが交差領域を示し、赤い頂点が関数によって返される。

intersection examples
引数
rect11つ目の矩形
rect22つ目の矩形
intersectingRegion交差領域の頂点の出力配列。最大で8個の頂点を返す。std::vector<cv::Point2f> として、または型 CV_32FC2 の Mx1 の cv::Mat として格納される。
戻り値
RectanglesIntersectTypes のいずれか

◆ rotateEdge()

int cv::Subdiv2D::rotateEdge ( int edge,
int rotate ) const
Python:
cv.Subdiv2D.rotateEdge(edge, rotate) -> retval

#include <opencv2/geometry/2d.hpp>

同じ quad-edge の別のエッジを返す。

引数
edge細分割エッジのID。
rotate入力エッジと同じクワッドエッジのうち、返すエッジを指定する引数。可能な値は次のとおり:
  • 0 - 入力エッジ ( e が入力エッジのとき、下図の e )
  • 1 - 回転エッジ ( eRot )
  • 2 - 反転エッジ (e の反転 (緑色))
  • 3 - 反転した回転エッジ (eRot の反転 (緑色))
戻り値
入力エッジと同じ quad-edge のエッジIDの1つ。

◆ setEdgePoints()

void cv::Subdiv2D::setEdgePoints ( int edge,
int orgPt,
int dstPt )
protected

◆ splice()

void cv::Subdiv2D::splice ( int edgeA,
int edgeB )
protected

◆ swapEdges()

void cv::Subdiv2D::swapEdges ( int edge)
protected

◆ symEdge()

int cv::Subdiv2D::symEdge ( int edge) const
Python:
cv.Subdiv2D.symEdge(edge) -> retval

変数詳解

◆ bottomRight

Point2f cv::Subdiv2D::bottomRight
protected

バウンディング矩形の右下隅。

◆ firstEdge

int cv::Subdiv2D::Vertex::firstEdge

◆ freePoint

int cv::Subdiv2D::freePoint
protected

◆ freeQEdge

int cv::Subdiv2D::freeQEdge
protected

◆ next

int cv::Subdiv2D::QuadEdge::next[4]

◆ pt [1/2]

int cv::Subdiv2D::QuadEdge::pt[4]

◆ pt [2/2]

Point2f cv::Subdiv2D::Vertex::pt

◆ qedges

std::vector<QuadEdge> cv::Subdiv2D::qedges
protected

すべてのエッジ。

◆ recentEdge

int cv::Subdiv2D::recentEdge
protected

◆ topLeft

Point2f cv::Subdiv2D::topLeft
protected

バウンディング矩形の左上隅。

◆ type

int cv::Subdiv2D::Vertex::type

◆ validGeometry

bool cv::Subdiv2D::validGeometry
protected

◆ vtx

std::vector<Vertex> cv::Subdiv2D::vtx
protected

すべての頂点。