相位相关 - 错误的旋转角度

时间:2017-11-30 12:25:18

标签: opencv detection object-detection

我试图找到两个简单椭圆图像之间的角度:

enter image description here

enter image description here

相对角度约为20度。

logPolar图像(对于比例幅度= 10)

enter image description here

enter image description here

但是openCV函数phaseCorrelate()给出了错误的结果:72.9

以下是代码:

    cv::Mat image1 = cv::imread("ellipse1.png");
    cv::Mat image2 = cv::imread("ellipse2.png");

    cv::cvtColor(image1, image1, CV_RGB2GRAY);
    cv::cvtColor(image2, image2, CV_RGB2GRAY);

    cv::Mat logImage1 = cv::Mat::zeros(image1.size(), CV_8UC1);
    cv::Mat logImage2 = cv::Mat::zeros(image2.size(), CV_8UC1);

    double magnitude = 10;
    cv::logPolar(image1, logImage1, cv::Point2f(image1.cols / 2.0, image1.rows / 2.0), magnitude, cv::INTER_CUBIC);
    cv::logPolar(image2, logImage2, cv::Point2f(image2.cols / 2.0, image2.rows / 2.0), magnitude, cv::INTER_CUBIC);


    logImage1.convertTo(logImage1, CV_64F);
    logImage2.convertTo(logImage2, CV_64F);

    cv::Point2d rotScale = cv::phaseCorrelate(logImage1, logImage2);

    double rotation = rotScale.y * 180 / (logImage2.cols >> 1);
    double scale = exp(rotScale.x / magnitude);

因此,旋转的结果是72.9而不是~20度。

我做错了什么?还是我忽略了一些重要的事情? 此外,logPolar()函数中有一个参数“scale magnitude”,它强烈影响旋转角度评估的结果。有没有可能估计这个参数的“好”值?

我认为结果是错误的,因为phaseCorrelate()函数在傅立叶域中提取错误的峰值。

提前谢谢。

0 个答案:

没有答案