Pynote

Python、機械学習、画像処理について

OpenCV - cv::Point 点を表すクラス

試した環境

2次元上の点を表すクラス。

template<typename _Tp> class Point_<_Tp>
typedef Point_<int> Point2i    // (1)
typedef Point2i Point          // (2)
typedef Point_<int64> Point2l  // (3)
typedef Point_<float> Point2f  // (4)
typedef Point_<double> Point2d // (5)

(1) int 型の点
(2) int 型の点
(3) int64 型の点
(4) float 型の点
(5) double 型の点

要素

x, y で値にアクセスする。

cv::Point a{1, 2};
std::cout << a.x << ", " << a.y << std::endl; // 1, 2
コンストラクタ
Point_<_Tp>::Point_()                                 // (1)
Point_<_Tp>::Point_(_Tp _x, _Tp _y)                   // (2)
Point_<_Tp>::Point_(const cv::Point_ &pt)             // (3)
Point_<_Tp>::Point_(const cv::Size_<_Tp> &sz)         // (4)
Point_<_Tp>::Point_(const cv::Vec<_Tp, 2> &v)         // (5)
Point_<_Tp> &Point_<_Tp>::operator=(const Point_ &pt) // (6)

(1) (0, 0) を表す点。
(2) (x, y) を表す点。
(3) コピーコンストラクタ。 pt と同じ点。
(4) cv::Size_ の (width, height) を (x、y) とした点。
(5) cv::Vec の (x、y) を (x、y) とした点。
(6) 代入演算子。pt と同じ点。

cv::Point a{};                // (1)
cv::Point b{1, 2};            // (2)
cv::Point c{b};               // (3)
cv::Point d{cv::Size(1, 2)};  // (4)
cv::Point e{cv::Vec2i(1, 2)}; // (5)
演算子
Point_<_Tp> &operator+=(Point_<_Tp> &a, const Point_<_Tp> &b) // (1)
Point_<_Tp> &operator-=(Point_<_Tp> &a, const Point_<_Tp> &b) // (2)
Point_<_Tp> &operator*=(Point_<_Tp> &a, int b)                // (3)
Point_<_Tp> &operator*=(Point_<_Tp> &a, float b)              // (4)
Point_<_Tp> &operator*=(Point_<_Tp> &a, double b)             // (5)
Point_<_Tp> &operator/=(Point_<_Tp> &a, int b)                // (6)
Point_<_Tp> &operator/=(Point_<_Tp> &a, float b)              // (7)
Point_<_Tp> &operator/=(Point_<_Tp> &a, double b)             // (8)

(1) point1 += point2
(2) point1 -= point2
(3) point1 *= int
(4) point1 *= float
(5) point1 *= double
(6) point1 /= int
(7) point1 /= float
(8) point1 /= double

(4), (5), (7), (8) は cv::Point (cv::Point2i) の場合、int 型にキャストされた結果になるので注意。

cv::Point a{1, 2}
a /= 2 // (0, 1)
bool operator==(const Point_<_Tp> &a, const Point_<_Tp> &b) // (9)
bool operator!=(const Point_<_Tp> &a, const Point_<_Tp> &b) // (10)

(9) point1 == point2
(10) point1 != point2

Point_<_Tp> operator+(const Point_<_Tp> &a, const Point_<_Tp> &b)      // (11)
Point_<_Tp> operator-(const Point_<_Tp> &a, const Point_<_Tp> &b)      // (12)
Point_<_Tp> operator-(const Point_<_Tp> &a)                            // (13)
Point_<_Tp> operator*(const Point_<_Tp> &a, int b)                     // (14)
Point_<_Tp> operator*(int a, const Point_<_Tp> &b)                     // (15)
Point_<_Tp> operator*(const Point_<_Tp> &a, float b)                   // (16)
Point_<_Tp> operator*(float a, const Point_<_Tp> &b)                   // (17)
Point_<_Tp> operator*(const Point_<_Tp> &a, double b)                  // (18)
Point_<_Tp> operator*(double a, const Point_<_Tp> &b)                  // (19)
Point_<_Tp> operator*(const Matx<_Tp, 2, 2> &a, const Point_<_Tp> &b)  // (20)
Point3_<_Tp> operator*(const Matx<_Tp, 3, 3> &a, const Point_<_Tp> &b) // (21)
Point_<_Tp> operator/(const Point_<_Tp> &a, int b)                     // (22)
Point_<_Tp> operator/(const Point_<_Tp> &a, float b)                   // (23)
Point_<_Tp> operator/(const Point_<_Tp> &a, double b)                  // (24)

(11) point1 + point2
(12) point1 - point2
(13) -point1
(14) point1 * int
(15) point1 * float
(16) point1 * double
(17) int * point1
(18) float * point1
(19) double * point1
(20) 2x2 matrix * point1
(21) 3x3 matrix * point1 (point1 の第3成分を1として計算する)
(22) point1 / int
(23) point2 / float
(24) point3 / double

(15), (16), (23), (24) は cv::Point (cv::Point2i) の場合、int 型にキャストされた結果になるので注意。

Point_<_Tp>::operator Point_<_Tp2>() const // (25)
Point_<_Tp>::operator Vec<_Tp, 2>() const // (26)

(25) Point2i, Point2f, Point2d 間のキャスト
(26) Vec2i, Vec2f, Vec2d と Point2i, Point2f, Point2d 間のキャスト

計算
_Tp Point_<_Tp>::dot(const Point_ &pt) const      // (1)
double Point_<_Tp>::ddot(const Point_ &pt) const  // (2)
double Point_<_Tp>::cross(const Point_ &pt) const // (3)
inside(const Rect_<_Tp> &r) const                 // (4)
double norm(const Point_<_Tp>& pt)                // (5)

(1) 内積
(2) 内積
(3) クロス積
(4) 長方形の内部に点が含まれるかどうか
(5) L2 ノルム

例:

cv::Point a{2, 3};
cv::Point b{4, 1};

// (1)
std::cout << a.cross(b) << std::endl; // -10

// (2)
// _Tp dot(const cv::Point_<_Tp> &pt) const
std::cout << a.dot(b) << std::endl; // 11

// (3)
std::cout << a.ddot(b) << std::endl; // 11

// (5)
std::cout << cv::norm(a) << std::endl; // 3.60555
3次元上の点を表すクラス。
template<typename _Tp> class cv::Point3_<_Tp>
typedef Point3i Point // (1)
typedef Point_<float> Point3f // (2)
typedef Point_<double> Point3d // (3)

(1) int 型の点
(2) float 型の点
(3) double 型の点

要素

x, y, z で値にアクセスする。

cv::Point3i a{1, 2, 3};
std::cout << a.x << ", " << a.y << ", " << a.z << std::endl; // 1, 2, 3

その他の点は基本的に2次元の場合と同じであるので省略する。