我正在寻找一种方法来使用 opencv 仅计算两个图像之间的平移和缩放。我只遇到了一个刚性变换实现,它将比例信息与旋转捆绑在一起,我对此不感兴趣。
你会建议我怎么做?
请注意,在下面的代码中,两个完全相等的角度实际上不是角度 2 = 2 * 角度。我不知道为什么:
cv::Mat rigid_mat = cv::estimateRigidTransform(prevMatGray, thisMatGray, false);
float tx = rigid_mat.at<float>(0,2);
float ty = rigid_mat.at<float>(1,2);
float a = rigid_mat.at<float>(0,0);
float b = rigid_mat.at<float>(0,1);
float c = rigid_mat.at<float>(1,0);
float d = rigid_mat.at<float>(1,1);
float sX = [BTImageProcessing sign:a] * sqrtf(powf(a,2) + powf(b,2));
float sY = [BTImageProcessing sign:d] * sqrt(powf(c,2) + powf(d,2));
float alpha = atan2f(c, d);
float alpha2 = atan2f(-b, a);
+ (int)sign:(float)num{
return num > 0 ? 1 : -1;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用estimateRigidTransform()
计算[A|b]
两个 2D 点集之间的最佳仿射变换(2x3 浮点矩阵)。接下来,您应该将变换矩阵分解为缩放和平移,就像这里的(sx, sy, xc, yc) 并且不关心旋转。