19,468
社区成员
发帖
与我相关
我的任务
分享
C++: int decomposeHomographyMat(InputArray H, InputArray K, OutputArrayOfArrays rotations, OutputArrayOfArrays translations, OutputArrayOfArrays normals)
Parameters:
H – The input homography matrix between two images.
K – The input intrinsic camera calibration matrix.
rotations – Array of rotation matrices.
translations – Array of translation matrices.
normals – Array of plane normal matrices.
但是opencv3看不懂啊,,也基本没例子。
想改成opencv2的代码也是搞不懂
static void calcRTfromHomo(Mat H, double t[3], double rodrot[3]){
double r[9];
Mat _r(3, 3, CV_64F,r); //rotation matrix
double intrinsic[9]={1, 0, 0, 0, 1, 0, 0, 0, 1};
Mat _M(3, 3, CV_64F, intrinsic); //intrinsic matrix, of no use in this implementation, reserved for future use
double ones[]={1,1,1};
Mat _ones (3, 1, CV_64F, ones);
Mat _rodrot(3, 1, CV_64F, rodrot);
//for SVD
Mat U(3, 3, CV_64F);
Mat W(3, 3, CV_64F);
Mat V(3, 3, CV_64F);
Mat invM(3, 3, CV_64F);
// three columns of Homography matrix
Mat h1(3, 1, CV_64F);
Mat h2(3, 1, CV_64F);
Mat h3(3, 1, CV_64F);
// three columns of rotation matrix
Mat r1(3, 1, CV_64F);
Mat r2(3, 1, CV_64F);
Mat r3(3, 1, CV_64F);
// translation vector
Mat _t(3, 1, CV_64F, t);
h1=H.col(0);
h2=H.col(1);
h3=H.col(2);
r1=_r.col(0);
r2=_r.col(1);
r3=_r.col(2);
invM=_M.inv();
multiply(invM,h1,r1);
multiply(invM,h2,r2);
multiply(invM,h3,_t);
normalize(r1,r1);
multiply(r2, _ones, r2, 1/norm(r1));
multiply(_t, _ones, _t, 1/norm(r1));
r3=r1.cross(r2);
SVD::compute(_r, W, U, V, SVD::FULL_UV);
_r=U.mul(V);
multiply(U, V, _r);
Rodrigues(_r, _rodrot);
}
int calcRTfromHomo(CvMat* H, double t[3], double rodrot[3]){
double r[9];
CvMat _r = cvMat(3, 3, CV_64F, r); //rotation matrix
double intrinsic[9]={1, 0, 0, 0, 1, 0, 0, 0, 1};
CvMat _M = cvMat(3, 3, CV_64F, intrinsic); //intrinsic matrix, of no use in this implementation, reserved for future use
double ones[]={1,1,1};
CvMat _ones = cvMat(3, 1, CV_64F, ones);
// double rodrot[3];
CvMat _rodrot = cvMat(3, 1, CV_64F, rodrot);
//for SVD
CvMat* U = cvCreateMat(3, 3, CV_64F);
CvMat* W = cvCreateMat(3, 3, CV_64F);
CvMat* V = cvCreateMat(3, 3, CV_64F);
CvMat* invM = cvCreateMat(3, 3, CV_64F);
// three columns of Homography matrix
CvMat* h1 = cvCreateMat(3, 1, CV_64F);
CvMat* h2 = cvCreateMat(3, 1, CV_64F);
CvMat* h3 = cvCreateMat(3, 1, CV_64F);
// three columns of rotation matrix
CvMat* r1 = cvCreateMat(3, 1, CV_64F);
CvMat* r2 = cvCreateMat(3, 1, CV_64F);
CvMat* r3 = cvCreateMat(3, 1, CV_64F);
// translation vector
CvMat _t = cvMat(3, 1, CV_64F, t);
cvGetCol(H,h1,0);
cvGetCol(H,h2,1);
cvGetCol(H,h3,2);
cvGetCol(&_r,r1,0);
cvGetCol(&_r,r2,1);
cvGetCol(&_r,r3,2);
cvInvert(&_M, invM);
cvMatMul(invM,h1,r1);
cvMatMul(invM,h2,r2);
cvMatMul(invM,h3,&_t);
cvNormalize(r1, r1);
cvMul(r2,&_ones,r2,1/cvNorm(r1));
cvMul(&_t,&_ones, &_t,1/cvNorm(r1) );
cvCrossProduct(r1, r2, r3);
cvSVD(&_r, W, U, V, CV_SVD_V_T);
cvMatMul(U,V,&_r);
cvRodrigues2(&_r, &_rodrot, NULL);
return 1;
}
但是代码是opencv1.0的
我想改成opencv2.4的,不知道怎么该这些函数
求帮忙
[/quote]
笨点的方式是查文档,一般opencv2里面函数没有cv打头,你这个算法写好了能否拿出来分享一下int calcRTfromHomo(CvMat* H, double t[3], double rodrot[3]){
double r[9];
CvMat _r = cvMat(3, 3, CV_64F, r); //rotation matrix
double intrinsic[9]={1, 0, 0, 0, 1, 0, 0, 0, 1};
CvMat _M = cvMat(3, 3, CV_64F, intrinsic); //intrinsic matrix, of no use in this implementation, reserved for future use
double ones[]={1,1,1};
CvMat _ones = cvMat(3, 1, CV_64F, ones);
// double rodrot[3];
CvMat _rodrot = cvMat(3, 1, CV_64F, rodrot);
//for SVD
CvMat* U = cvCreateMat(3, 3, CV_64F);
CvMat* W = cvCreateMat(3, 3, CV_64F);
CvMat* V = cvCreateMat(3, 3, CV_64F);
CvMat* invM = cvCreateMat(3, 3, CV_64F);
// three columns of Homography matrix
CvMat* h1 = cvCreateMat(3, 1, CV_64F);
CvMat* h2 = cvCreateMat(3, 1, CV_64F);
CvMat* h3 = cvCreateMat(3, 1, CV_64F);
// three columns of rotation matrix
CvMat* r1 = cvCreateMat(3, 1, CV_64F);
CvMat* r2 = cvCreateMat(3, 1, CV_64F);
CvMat* r3 = cvCreateMat(3, 1, CV_64F);
// translation vector
CvMat _t = cvMat(3, 1, CV_64F, t);
cvGetCol(H,h1,0);
cvGetCol(H,h2,1);
cvGetCol(H,h3,2);
cvGetCol(&_r,r1,0);
cvGetCol(&_r,r2,1);
cvGetCol(&_r,r3,2);
cvInvert(&_M, invM);
cvMatMul(invM,h1,r1);
cvMatMul(invM,h2,r2);
cvMatMul(invM,h3,&_t);
cvNormalize(r1, r1);
cvMul(r2,&_ones,r2,1/cvNorm(r1));
cvMul(&_t,&_ones, &_t,1/cvNorm(r1) );
cvCrossProduct(r1, r2, r3);
cvSVD(&_r, W, U, V, CV_SVD_V_T);
cvMatMul(U,V,&_r);
cvRodrigues2(&_r, &_rodrot, NULL);
return 1;
}
但是代码是opencv1.0的
我想改成opencv2.4的,不知道怎么该这些函数
求帮忙
cvFindContours( pSrcImage, storage, &contour, sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);//这函数可选参数还有不少
for(; contour; contour = contour->h_next) //如果contour不为空,表示找到一个以上轮廓,这样写法只显示一个轮廓
//如改为for(; contour; contour = contour->h_next) 就可以同时显示多个轮廓
{
End_Rage2D = cvMinAreaRect2(contour); //代入cvMinAreaRect2这个函数得到最小包围矩形 这里已得出被测物体的角度,宽度,高度,和中点坐标点存放在CvBox2D类型的结构体中,主要工作基本结束。
std::cout <<" angle:\n"<<(float)End_Rage2D.angle << std::endl; //被测物体旋转角度
}
用findcontour找完后
CvBox2D 这个结构的属性就有个角度,具体我没有深入看