这里给出验证例子和结果, 在C++ , open cv实现
Mat dcm2q(Mat R)
{
CV_Assert(R.rows == 3 && R.cols == 3);
Mat q(4, 1, CV_64FC1);
// x,y,z,w的格式存储
q.at<double>(3, 0) = -0.5*sqrt(1 + R.at<double>(0, 0) + R.at<double>(1, 1) + R.at<double>(2, 2));
q.at<double>(0, 0) = 0.25*(R.at<double>(1, 2) - R.at<double>(2, 1)) / q.at<double>(3, 0);
q.at<double>(1, 0) = 0.25*(R.at<double>(2, 0) - R.at<double>(0, 2)) / q.at<double>(3, 0);
q.at<double>(2, 0) = 0.25*(R.at<double>(0, 1) - R.at<double>(1, 0)) / q.at<double>(3, 0);
return q;
}
Mat qt2h(double *xd)
{
Mat X(7, 1, CV_64FC1,xd);
Mat Q(4, 1, CV_64FC1);
Mat T(3, 1, CV_64FC1);
X(Rect(0, 0, 1, 3)).copyTo(T);
X(Rect(0, 3, 1, 4)).copyTo(Q);
// cout << Q << endl << endl;
Mat R = q2dcm(Q);
Mat H(4, 4, CV_64FC1);
R.copyTo(H(Rect(0, 0, 3, 3)));
T.cop