全能編程開發工程師必知必會——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/zh-hant/n/360742.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JVRNC的頭像JVRNC
上一篇 2025-02-24 00:33
下一篇 2025-02-24 00:33

相關推薦

發表回復

登錄後才能評論