如何从LogPolar变换获得比例和旋转角度

flo*_*ree 11 c++ opencv

我正在尝试使用LogPolar变换从两个图像中获取比例和旋转角度.下面是两个300x300样本图像.第一个矩形是100x100,第二个矩形是150x150,旋转45度.

在此输入图像描述 在此输入图像描述

算法:

  1. 将两个图像转换为LogPolar.
  2. 使用相位相关找到平移位移.
  3. 将平移移位转换为缩放和旋转角度(如何执行此操作?).

我的代码:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

int main()
{
    cv::Mat a = cv::imread("rect1.png", 0);
    cv::Mat b = cv::imread("rect2.png", 0);
    if (a.empty() || b.empty())
        return -1;

    cv::imshow("a", a);
    cv::imshow("b", b);

    cv::Mat pa = cv::Mat::zeros(a.size(), CV_8UC1);
    cv::Mat pb = cv::Mat::zeros(b.size(), CV_8UC1);
    IplImage ipl_a = a, ipl_pa = pa;
    IplImage ipl_b = b, ipl_pb = pb;
    cvLogPolar(&ipl_a, &ipl_pa, cvPoint2D32f(a.cols >> 1, a.rows >> 1), 40);
    cvLogPolar(&ipl_b, &ipl_pb, cvPoint2D32f(b.cols >> 1, b.rows >> 1), 40);

    cv::imshow("logpolar a", pa);
    cv::imshow("logpolar b", pb);

    cv::Mat pa_64f, pb_64f;
    pa.convertTo(pa_64f, CV_64F);
    pb.convertTo(pb_64f, CV_64F);

    cv::Point2d pt = cv::phaseCorrelate(pa_64f, pb_64f);

    std::cout << "Shift = " << pt 
              << "Rotation = " << cv::format("%.2f", pt.y*180/(a.cols >> 1)) 
              << std::endl;

    cv::waitKey(0);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对数极地图像:

在此输入图像描述 在此输入图像描述

对于上面的样本图像,平移是(16.2986, 36.9105).我已成功获得旋转角度,即44.29.但我在计算比例时遇到了困难.如何转换给定的平移位以获得比例?

Oli*_*ver 2

您有两个图像f1f2 ,其中f1(m, n) = f2(m/a , n/a)f1按因子 a 缩放

\n\n

采用对数表示法,相当于f1(log m, log n) = f2(logm \xe2\x88\x92 log a, log n \xe2\x88\x92 log a)其中log a是相位相关图像中的偏移。

\n\n

比较BS Reddy、BN Chatterji:一种基于 FFT 的平移、旋转和比例不变图像配准技术,IEEE Transactions On Image Treatment Vol. 1。5\n没有。8、IEEE,1996

\n\n

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.185.4387&rep=rep1&type=pdf

\n

  • 顺便说一下,在您的代码中您还计算了平移位移。您必须在第二步中使用角度和比例校正图像作为输入来执行此操作。 (2认同)