OpenCV(logPolar()、Point2f())

做梦当财神發表於2024-08-18

目錄
  • 1. cv::logPolar()
    • 函式原型:
    • 引數說明:
    • 用途和示例:
  • 2. cv::Point2f
    • 類定義:
    • 屬性:
    • 主要建構函式:
    • 用途和示例:
  • 總結:



1. cv::logPolar()

cv::logPolar() 是 OpenCV 中用於進行對數極座標變換(Log-Polar Transformation)的函式。對數極座標變換將影像的空間座標轉換為極座標,並對徑向分量取對數。這種變換通常用於旋轉不變性分析和縮放不變性分析,尤其在影像匹配和物體識別任務中非常有用。

函式原型:

void logPolar(
    InputArray src,
    OutputArray dst,
    Point2f center,
    double M,
    int flags
);

引數說明:

  • src: 輸入影像,必須是單通道或多通道的 8 位或浮點影像。
  • dst: 輸出影像,與輸入影像有相同的大小和型別。
  • center: 極座標變換的中心點,通常是影像的中心(例如:cv::Point2f(src.cols / 2.0, src.rows / 2.0))。
  • M: 縮放係數,通常設定為影像高度或寬度的最大值除以2(M = src.cols / log(src.cols / 2.0)M = src.rows / log(src.rows / 2.0)),以確保影像變換後的內容充滿整個輸出影像。
  • flags: 插值標誌,可以選擇以下選項之一:
    • INTER_LINEAR:線性插值(預設)
    • INTER_NEAREST:最鄰近插值
    • WARP_FILL_OUTLIERS:如果輸出影像大小不夠大,影像邊緣會被填充
    • WARP_INVERSE_MAP:用來進行逆向對映,即從輸出影像回到原影像

用途和示例:

cv::logPolar() 通常用於生成尺度和旋轉不變的影像表示。下面是一個使用 cv::logPolar() 的簡單示例:

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat src = cv::imread("example.jpg", cv::IMREAD_GRAYSCALE);
    cv::Mat dst;
    
    cv::Point2f center(src.cols / 2.0, src.rows / 2.0);
    double M = src.cols / log(src.cols / 2.0);
    
    cv::logPolar(src, dst, center, M, cv::INTER_LINEAR);

    cv::imshow("Original Image", src);
    cv::imshow("Log-Polar Image", dst);
    cv::waitKey(0);

    return 0;
}

2. cv::Point2f

cv::Point2f 是 OpenCV 中的一個結構體,用於表示二維點座標,座標的型別為浮點數(float)。該類在影像處理和計算機視覺中非常常用,用於儲存影像上的點座標。

類定義:

template<typename _Tp> class Point_
{
public:
    _Tp x, y;
    // constructors
    Point_();
    Point_(_Tp _x, _Tp _y);
    Point_(const Point_& pt);
    template<typename _Tp2> explicit Point_(const Point_<_Tp2>& pt);
    
    // other member functions
    // ...
};

typedef Point_<float> Point2f;

屬性:

  • x: 點的 x 座標(橫座標)
  • y: 點的 y 座標(縱座標)

主要建構函式:

  • Point2f():預設建構函式,初始化點為 (0, 0)。
  • Point2f(float _x, float _y):構造一個座標為 (x, y) 的點。
  • Point2f(const Point2f& pt):複製建構函式。

用途和示例:

cv::Point2f 通常用於表示影像上的特定點,如特徵點或輪廓點。以下是一個使用 cv::Point2f 的簡單示例:

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    cv::Point2f point1(10.5f, 20.0f);
    cv::Point2f point2(30.0f, 40.5f);
    
    // 列印點的座標
    std::cout << "Point 1: (" << point1.x << ", " << point1.y << ")" << std::endl;
    std::cout << "Point 2: (" << point2.x << ", " << point2.y << ")" << std::endl;
    
    // 計算兩點之間的距離
    float distance = cv::norm(point1 - point2);
    std::cout << "Distance between points: " << distance << std::endl;

    return 0;
}

總結:

  • cv::logPolar() 用於將影像進行對數極座標變換,適合影像縮放和旋轉不變性分析。
  • cv::Point2f 是一個簡單但常用的結構體,用於表示二維空間中的點,適用於各種幾何操作和座標表示。

相關文章