opencv类简单分析: Point

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012819339/article/details/82217276

定义

point的定义其实只是一个别名,如下,它最终是由Point_模板得来的

typedef Point_<int> Point2i;
typedef Point_<int64> Point2l;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point2i Point

下面简单分析下Point_模板
1. Point_是一个由坐标’ x ‘和’ y ‘指定的2D点的模板类
2. 类的实例可以与C结构体、CvPoint、CvPoint2D32f互换,还有一个转换操作符将点坐标转换为指定类型,从浮点坐标到整数坐标的转换是通过四舍五入来完成的,通常,转换对每个坐标使用这个操作
3. 除了上述声明中列出的类成员外,还对点执行以下操作:

    pt1 = pt2 + pt3;
    pt1 = pt2 - pt3;
    pt1 = pt2 * a;
    pt1 = a * pt2;
    pt1 = pt2 / a;
    pt1 += pt2;
    pt1 -= pt2;
    pt1 *= a;
    pt1 /= a;
    double value = norm(pt); // L2 norm
    pt1 == pt2;
    pt1 != pt2;

template<typename _Tp> class Point_
{
public:
    typedef _Tp value_type;

    //默认构造函数
    Point_();
    Point_(_Tp _x, _Tp _y);
    Point_(const Point_& pt);
    Point_(const Size_<_Tp>& sz);
    Point_(const Vec<_Tp, 2>& v);

    Point_& operator = (const Point_& pt);
    //转换成其它数据类型
    template<typename _Tp2> operator Point_<_Tp2>() const;

    //转换成老式的C结构体
    operator Vec<_Tp, 2>() const;

    //点积
    _Tp dot(const Point_& pt) const;
    //用双精度算术计算的点积
    double ddot(const Point_& pt) const;
    //叉积/向量积
    double cross(const Point_& pt) const;
    //检查点是否在指定的矩形内
    bool inside(const Rect_<_Tp>& r) const;
    _Tp x; //点的x坐标
    _Tp y; //点的y坐标
};

用法例子:

...

int main(int argc, char *argv[]){

    Point2f a(0.3f, 0.2f), b(0.1f, 0.4f);
    Point pt = (a + b)*10.f;
    cout << "pt: "<< pt.x << ", " << pt.y << endl;

    double aa = a.ddot(b);  // 0.3 x 0.1 + 0.2 x 0.4 = 0.03 + 0.08 = 0.11
    double bb = a.cross(b); //暂未弄清计算公式

    cout << "aa: "<< aa << endl;
    cout << "bb: "<< bb << endl;
    return 0;
}

输出结果:

pt: 4, 6
aa: 0.11
bb: 0.1

猜你喜欢

转载自blog.csdn.net/u012819339/article/details/82217276