首页 > 解决方案 > 查找两组点之间的 2D 旋转

问题描述

我正在做一个项目,但我被一件事困住了。我有两组从同一对象的轮廓中提取但以 2D 旋转的点,我需要找到这些点之间的最佳旋转变换(或只是旋转角度)。

我所做的是我重新调整了一个轮廓,以便我有两个相同大小的轮廓,并且我使这两个轮廓具有相同的质心。然后我要做的是从第一组点中选择 3 个随机点,从第二组点中选择 3 个点(某种 RANSAC,我在其中绘制 N 次随机点),我需要找到围绕它们的旋转变换一组的质心到另一组。我尝试使用 Kabsch 算法,但我不确定我是否正确实施它,因为它无法正常工作。这是我的代码:

这是我的 Kabsch 代码:

// P,Q - sets of points of contours
cv::Mat Pt;
transpose(P, Pt); 

cv::Mat H = Pt * Q; 
cv::Mat Ht;
transpose(H,Ht); 
cv::Mat invH = H.inv(); 

cv::Mat HtH = Ht * H; 
cv::Mat sqrtH(HtH.size(), CV_32F); 

for (int i=0;i<2;i++)
    for (int j = 0; j < 2; j++)
    {
        sqrtH.at<float>(j, i) = sqrt(HtH.at<float>(j,i));
    }

// Final transform
cv::Mat R = sqrtH * invH;

我想至少得到两组点之间的旋转角度。当我使用我的代码时,我会得到奇怪的结果和转换,这会弄乱我的分数集。

标签: c++opencvimage-processingrotation

解决方案


推荐阅读