c++ - 查找两组点之间的 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;
我想至少得到两组点之间的旋转角度。当我使用我的代码时,我会得到奇怪的结果和转换,这会弄乱我的分数集。
解决方案
推荐阅读
- python - 在 matplotlib 图中添加两个标记并沿折线图移动它们
- python - 从 xml 中查找信息并使用 python 将其转换为表
- node.js - 构建一个完整的多平台(安卓和网络)聊天应用程序
- angular - 如何使用单元测试覆盖 rxjs 订阅方法?
- ruby-on-rails - Rails 5 忽略了我在 prod 中的操作邮件配置,需要提示/指针
- docker - docker compose build 未传递 compose 文件中定义的构建参数
- css - 侧边栏背景没有完全到底部
- spring-boot - JUnit导致在intelliJ中运行应用程序的问题
- html - 带有@keywords 的第二个动画不适用于 div
- python - 更改窗口大小时如何更快地加载背景图像?