Added Affine3<T>::rvec()
This commit is contained in:
parent
9f1f5aed53
commit
ace71cef3f
@ -97,6 +97,9 @@ namespace cv
|
|||||||
Mat3 linear() const;
|
Mat3 linear() const;
|
||||||
Vec3 translation() const;
|
Vec3 translation() const;
|
||||||
|
|
||||||
|
//Rodrigues vector
|
||||||
|
Vec3 rvec() const;
|
||||||
|
|
||||||
Affine3 inv(int method = cv::DECOMP_SVD) const;
|
Affine3 inv(int method = cv::DECOMP_SVD) const;
|
||||||
|
|
||||||
// a.rotate(R) is equivalent to Affine(R, 0) * a;
|
// a.rotate(R) is equivalent to Affine(R, 0) * a;
|
||||||
@ -300,6 +303,55 @@ typename cv::Affine3<T>::Vec3 cv::Affine3<T>::translation() const
|
|||||||
return Vec3(matrix.val[3], matrix.val[7], matrix.val[11]);
|
return Vec3(matrix.val[3], matrix.val[7], matrix.val[11]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T> inline
|
||||||
|
typename cv::Affine3<T>::Vec3 cv::Affine3<T>::rvec() const
|
||||||
|
{
|
||||||
|
cv::Vec3d w;
|
||||||
|
cv::Matx33d u, vt, R = rotation();
|
||||||
|
cv::SVD::compute(R, w, u, vt, cv::SVD::FULL_UV + cv::SVD::MODIFY_A);
|
||||||
|
R = u * vt;
|
||||||
|
|
||||||
|
double rx = R.val[7] - R.val[5];
|
||||||
|
double ry = R.val[2] - R.val[6];
|
||||||
|
double rz = R.val[3] - R.val[1];
|
||||||
|
|
||||||
|
double s = std::sqrt((rx*rx + ry*ry + rz*rz)*0.25);
|
||||||
|
double c = (R.val[0] + R.val[4] + R.val[8] - 1) * 0.5;
|
||||||
|
c = c > 1.0 ? 1.0 : c < -1.0 ? -1.0 : c;
|
||||||
|
double theta = acos(c);
|
||||||
|
|
||||||
|
if( s < 1e-5 )
|
||||||
|
{
|
||||||
|
if( c > 0 )
|
||||||
|
rx = ry = rz = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double t;
|
||||||
|
t = (R.val[0] + 1) * 0.5;
|
||||||
|
rx = std::sqrt(std::max(t, 0.0));
|
||||||
|
t = (R.val[4] + 1) * 0.5;
|
||||||
|
ry = std::sqrt(std::max(t, 0.0)) * (R.val[1] < 0 ? -1.0 : 1.0);
|
||||||
|
t = (R.val[8] + 1) * 0.5;
|
||||||
|
rz = std::sqrt(std::max(t, 0.0)) * (R.val[2] < 0 ? -1.0 : 1.0);
|
||||||
|
|
||||||
|
if( fabs(rx) < fabs(ry) && fabs(rx) < fabs(rz) && (R.val[5] > 0) != (ry*rz > 0) )
|
||||||
|
rz = -rz;
|
||||||
|
theta /= std::sqrt(rx*rx + ry*ry + rz*rz);
|
||||||
|
rx *= theta;
|
||||||
|
ry *= theta;
|
||||||
|
rz *= theta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double vth = 1/(2*s);
|
||||||
|
vth *= theta;
|
||||||
|
rx *= vth; ry *= vth; rz *= vth;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cv::Vec3d(rx, ry, rz);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T> inline
|
template<typename T> inline
|
||||||
cv::Affine3<T> cv::Affine3<T>::inv(int method) const
|
cv::Affine3<T> cv::Affine3<T>::inv(int method) const
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user