将投影矩阵P利用QR分解分解出摄像机内外参数(Opencv)

来源:互联网 发布:淘宝开店最少几件商品 编辑:程序博客网 时间:2024/06/07 16:02



将投影矩阵P利用QR分解分解出摄像机内外参数(Opencv)

/***************************************************************
    将投影矩阵P利用QR分解分解出摄像机内外参数
****************************************************************
输入:
P:投影矩阵,3*4
输出:
K:内参数矩阵,3*3
R:旋转矩阵,3*3
T:平移向量,3*1
程序设计:Wenbin WANG
设计时间:2009/06/21
参考文献:蔡涛,《单目视觉三维重建方法与应用研究》,2004,pp36

说明:本程序中的qrHouse可以在本博客中找到相应的Opencv代码,本程序已经经过验证是正确的
****************************************************************/
void KRT_From_P_QR(CvMat* P, CvMat* K, CvMat* R, CvMat* T)
{
int i,j;

//第一步
CvMat* H = cvCreateMat(3,3,CV_64FC1);
CvMat* h = cvCreateMat(3,1,CV_64FC1);
for (i = 0; i < 3; i++)
{
   for (j = 0; j < 3; j++)
   {
    cvmSet(H,i,j,cvmGet(P,i,j));
   }
   cvmSet(h,i,0,cvmGet(P,i,3));
}

//第二步
CvMat* Hinv = cvCreateMat(3,3,CV_64FC1);
cvInvert(H,Hinv,CV_SVD);
CvMat* Qd   = cvCreateMat(H->rows,H->cols,CV_64FC1);
CvMat* Rd   = cvCreateMat(H->rows,H->rows,CV_64FC1);

cvReleaseMat(&H);
qrHouse(Hinv,Qd,Rd);
cvInvert(Rd,K,CV_SVD);
cvTranspose(Qd,R);
cvReleaseMat(&Hinv);
cvReleaseMat(&Qd);

//第三步:
double s1[9] = {-1,0,0,0,1,0,0,0,-1};
double s2[9] = {-1,0,0,0,-1,0,0,0,1};
double s3[9] = {1,0,0,0,-1,0,0,0,-1};
double s4[9] = {1,0,0,0,1,0,0,0,1};

CvMat* Rn = cvCreateMat(3,3,CV_64FC1);
CvMat* Kn = cvCreateMat(3,3,CV_64FC1);
CvMat* S1 = cvCreateMat(3,3,CV_64FC1);
CvMat* S2 = cvCreateMat(3,3,CV_64FC1);
CvMat* S3 = cvCreateMat(3,3,CV_64FC1);
CvMat* S4 = cvCreateMat(3,3,CV_64FC1);
cvInitMatHeader(S1,3,3,CV_64FC1,s1);
cvInitMatHeader(S2,3,3,CV_64FC1,s2);
cvInitMatHeader(S3,3,3,CV_64FC1,s3);
cvInitMatHeader(S4,3,3,CV_64FC1,s4);

double a = cvmGet(K,0,0);
double b = cvmGet(K,1,1);
double c = cvmGet(K,2,2);

CvMat* t0 = cvCreateMat(3,3,CV_64FC1);

if ((a>0 && b<0 && c>0) || (a<0 && b>0 && c<0))
{
   cvMatMul(K,S1,Kn);
   cvMatMul(S1,R,Rn);
   cvMatMul(S1,Rd,t0);
}
else if ((a>0 && b>0 && c<0) || (a<0 && b<0 && c>0))
{
   cvMatMul(K,S2,Kn);
   cvMatMul(S2,R,Rn);
   cvMatMul(S2,Rd,t0);
}
else if ((a>0 && b<0 && c<0) || (a<0 && b>0 && c>0))
{
   cvMatMul(K,S3,Kn);
   cvMatMul(S3,R,Rn);
   cvMatMul(S2,Rd,t0);
}
else if ((a>0 && b>0 && c>0) || (a<0 && b<0 && c<0))
{
   cvMatMul(K,S4,Kn);
   cvMatMul(S4,R,Rn);
   cvMatMul(S2,Rd,t0);
}

cvMatMul(t0,h,T);

cvReleaseMat(&t0);
cvReleaseMat(&S1);
cvReleaseMat(&S2);
cvReleaseMat(&S3);
cvReleaseMat(&S4);
cvReleaseMat(&Rd);
cvReleaseMat(&h);

for (i = 0; i < 3; i++)
{
   for (j = 0; j < 3; j++)
   {
    cvmSet(K,i,j,cvmGet(Kn,i,j)/cvmGet(Kn,2,2));
   }
}
cvReleaseMat(&Kn);
cvCopy(Rn,R);
cvReleaseMat(&Rn);
}

void main()
{
//用Matlab仿真的真实图像实验的投影矩阵
double P0[12]={
0.00191854517446,-0.00174998332538,0.00009670477631,-0.63861687292509,
0.00015184786215,0.00005945815592,0.00252273614700,-0.76951593410321,
   -0.00000042931672,-0.00000093480944,0.00000027152848,-0.00075721579556
};

CvMat* P = cvCreateMat(3,4,CV_64FC1);
cvInitMatHeader(P,3,4,CV_64FC1,P0);
CvMat* K = cvCreateMat(3,3,CV_64FC1);
CvMat* R = cvCreateMat(3,3,CV_64FC1);
CvMat* T = cvCreateMat(3,1,CV_64FC1);

KRT_From_P_QR(P,K,R,T);

//输出求解出的内外参数矩阵
int i,j;
cout<<"K:"<<endl;
for (i = 0; i < 3; i++)
{
   for (j = 0; j < 3; j++)
   {
    cout<<cvmGet(K,i,j)<<" ";
   }
   cout<<endl;
}
cout<<endl;
cout<<"R:"<<endl;
for (i = 0; i < 3; i++)
{
   for (j = 0; j < 3; j++)
   {
    cout<<cvmGet(R,i,j)<<" ";
   }
   cout<<endl;
}
cout<<endl;
cout<<"T:"<<endl;
for (i = 0; i < 3; i++)
{
   for (j = 0; j < 1; j++)
   {
    cout<<cvmGet(T,i,j)<<" ";
   }
   cout<<endl;
}

cvReleaseMat(&P);
cvReleaseMat(&K);
cvReleaseMat(&R);
cvReleaseMat(&T);
}

#计算机视觉
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7个月婴儿睡眠少怎么办 孩子好动注意力不集中怎么办 学生在课堂上爱讲话怎么办? 幼儿园老师圢小孩脸怎么办 宝宝上幼儿园坐不住怎么办 宝宝在幼儿园总是坐不住怎么办 早教课上宝宝坐不住怎么办? 孩子在幼儿园上课坐不住怎么办 小孩不会写拼音a怎么办 小朋友上课注意力不集中怎么办 一年级孩子上课爱说话怎么办 一年级小孩不听老师话怎么办 大班幼儿规则意识差怎么办 幼儿大班《打雷了怎么办》的教案 小孩上课不听讲到处乱跑怎么办 小孩子经常咬人好动怎么办 6个月宝宝好动怎么办 新生调皮被幼儿园退学怎么办 孩子在幼儿园太调皮怎么办 幼儿上课注意力不集中怎么办 幼儿上课一半要离开怎么办 八个月宝宝消化不良拉肚子怎么办 8个月的宝宝拉肚子怎么办 孕8个月拉稀怎么办 孩子调皮好动爱说话怎么办 宝宝8个月不会爬怎么办 怀孕8个月不想要了怎么办 8个月宝宝发烧怎么办 八个月的小孩发烧怎么办 孩子8个月发烧38怎么办 8个宝宝发烧38度怎么办 怀孕八个月不想要怎么办 怀孕八个月不想要了怎么办 八个月宝宝拉肚子拉水怎么办 八个月的宝宝拉肚子怎么办 八个月发烧38度怎么办 孩子特别调皮好动该怎么办 孩子有好动症该怎么办 在幼儿园好动的孩子该怎么办 18个月宝宝上火怎么办 打孩子越打上瘾怎么办