一、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-hk/n/360742.html