我正在做一个项目,但我一心执着。我从同一物体的轮廓中提取了两组点,但是以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;
我想至少获得两组点之间的旋转角度。当我使用代码时,会得到奇怪的结果和转换,这弄乱了我的观点。