全能编程开发工程师必知必会——Point2f

一、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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JVRNCJVRNC
上一篇 2025-02-24 00:33
下一篇 2025-02-24 00:33

相关推荐

发表回复

登录后才能评论