寻找两组点之间的2D旋转

时间:2019-08-25 12:57:18

标签: c++ opencv image-processing rotation

我正在做一个项目,但我一心执着。我从同一物体的轮廓中提取了两组点,但是以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;

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

0 个答案:

没有答案