一、Point2f是什么
Point2f是OpenCV提供的二维坐标点类,用来表示平面上的点,其中f表示该点的坐标为浮点数类型。Point2f由x和y两个成员变量组成,可以通过x和y来访问该点的横纵坐标值。
class Point2f { public: Point2f(); Point2f(float _x, float _y); //... float x, y; };
Point2f类的定义如上所示,在OpenCV中可以通过#include 头文件引入Point2f类。
通过Point2f类可以描述平面直角坐标系中任意点的位置,方便在二维图像的处理中进行坐标相关的操作。
二、Point2f的常见操作
1. 坐标点的创建与初始化
在使用Point2f之前,需要对坐标点进行创建和初始化:
Point2f pt1; //默认构造函数创建坐标点 Point2f pt2(3.5f, 5.2f); //以浮点数形式创建坐标点
其中pt1使用默认构造函数创建坐标点(0, 0),pt2以浮点数形式显式地创建了坐标点(3.5, 5.2)。
2. 坐标点的运算操作
Point2f支持一系列的运算操作,如加减乘除、取反、比较等,以下是一些常见的运算操作:
Point2f pt1(2.3f, 4.5f); Point2f pt2(1.5f, 2.0f); Point2f pt3 = pt1 + pt2; //Point2f的加法运算 Point2f pt4 = -pt2; //取反操作 float dot = pt1.dot(pt2); //点积运算 float normsqr = pt1.dot(pt1); //向量模长的平方 bool b = pt1 == pt2; //比较两个点是否相等
3. 坐标点与图像的转换操作
在图像处理过程中,经常需要将坐标点转换为像素坐标或从像素坐标转换为实际坐标。OpenCV提供了一些函数来实现这一转换。
从像素坐标到实际坐标的转换:
Point2f pixelPt(100, 200); //像素坐标 float fx = 500.0f; //图像水平方向的focal length float fy = 500.0f; //图像垂直方向的focal length float cx = 320.0f; //图像水平方向的光心坐标 float cy = 240.0f; //图像垂直方向的光心坐标 Point2f realPt; //实际坐标 realPt.x = (pixelPt.x - cx) / fx; realPt.y = (pixelPt.y - cy) / fy;
从实际坐标到像素坐标的转换:
Point2f realPt(3.4f, 5.3f); //实际坐标 float fx = 500.0f; //图像水平方向的focal length float fy = 500.0f; //图像垂直方向的focal length float cx = 320.0f; //图像水平方向的光心坐标 float cy = 240.0f; //图像垂直方向的光心坐标 Point2f pixelPt; //像素坐标 pixelPt.x = fx * realPt.x + cx; pixelPt.y = fy * realPt.y + cy;
三、Point2f的应用实例
1. 计算线段长度
给定两个二维坐标点pt1和pt2,计算它们构成线段的长度。
#include #include using namespace cv; float distance(const Point2f& pt1, const Point2f& pt2) { float dx = pt1.x - pt2.x; float dy = pt1.y - pt2.y; return std::sqrt(dx*dx + dy*dy); } int main() { Point2f pt1(3.2f, 5.1f); Point2f pt2(1.9f, 2.8f); float len = distance(pt1, pt2); return 0; }
2. 计算三角形面积
给定三个二维坐标点pt1、pt2和pt3,计算它们构成的三角形的面积。
#include #include using namespace cv; float area(const Point2f& pt1, const Point2f& pt2, const Point2f& pt3) { float a = distance(pt1, pt2); float b = distance(pt2, pt3); float c = distance(pt3, pt1); float s = (a + b + c) / 2; return std::sqrt(s * (s - a) * (s - b) * (s - c)); } int main() { Point2f pt1(3.2f, 5.1f); Point2f pt2(1.9f, 2.8f); Point2f pt3(4.1f, 2.3f); float ar = area(pt1, pt2, pt3); return 0; }
3. 在图像中画点
给定一个Mat类型的图像对象img和一个二维坐标点pt,将该点在图像上画出来。
#include #include #include using namespace cv; int main() { Mat img(480, 640, CV_8UC3, Scalar(0,0,0)); //创建一张黑色图像 Point2f pt(320, 240); //坐标点 circle(img, pt, 5, Scalar(0, 0, 255), 2); //在图像上画点 imshow("image", img); waitKey(0); return 0; }
运行上述代码后,会在中心位置(320, 240)画一个红色的小点。
四、总结
Point2f是OpenCV提供的用于表示平面上二维坐标点的类,通过该类可以方便地进行二维坐标相关的计算和处理,如坐标点的创建和初始化、坐标点的运算操作以及坐标点与图像的转换操作等。在图像处理和计算机视觉等领域具有广泛的应用。以上所述只是Point2f的基本应用,要深入了解该类的更多功能和应用,需要进一步学习。
原创文章,作者:JVRNC,如若转载,请注明出处:https://www.506064.com/n/360742.html