OpenCV(cv::logPolar()、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 是一个简单但常用的结构体,用于表示二维空间中的点,适用于各种几何操作和坐标表示。
posted @   做梦当财神  阅读(273)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示