我正在尝试使用 OpenCV 的 estimateAffine3D() 函数来获得 3D 中两组共面点之间的仿射变换。如果我保持一个变量不变,我会发现该变量的转换部分存在一个常数错误。
我的测试代码是:
std::vector<cv::Point3f> first, second;
std::vector<uchar> inliers;
cv::Mat aff(3,4,CV_64F);
for (int i = 0; i <6; i++)
{
first.push_back(cv::Point3f(i,i%3,1));
second.push_back(cv::Point3f(i,i%3,1));
}
int ret = cv::estimateAffine3D(first, second, aff, inliers);
std::cout << aff << std::endl;
我期望的输出是:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
编辑:我的期望是不正确的。对于恒定 z 坐标的情况,矩阵不会分解为 [R|t]。
但我得到的(为了便于阅读而四舍五入)是:
[1 0 0 0]
[0 1 0 0]
[0 0 0.5 0.5]
有没有办法解决这种行为?有没有在二维点集上做同样的功能?