OpenCV All the matrices must have the same data type

在使用zed进行双目测距的时候,自己用zed提供的相机参数构造内参和畸变参数矩阵,没有用OpenCV的双目校正函数,在使用

stereoRectify(cameraMatrix[0], distCoeffs[0],
		cameraMatrix[1], distCoeffs[1],
		imageSize, R, T, R1, R2, P1, P2, Q,
		CALIB_ZERO_DISPARITY, 1, imageSize, &validRoi[0], &validRoi[1]);

的时候,运行程序报错:All the matrices must have the same data type

查看了OpenCV源码,在C:\allKindOfLibs\opencv-3.1.0\modules\calib3d\src\calibration.cpp的273行,是一个罗德里格斯公式,将旋转向量转换为旋转矩阵。在这个函数的上面

CV_IMPL void cvComposeRT( const CvMat* _rvec1, const CvMat* _tvec1,

             const CvMat* _rvec2, const CvMat* _tvec2,
             CvMat* _rvec3, CvMat* _tvec3,
             CvMat* dr3dr1, CvMat* dr3dt1,
             CvMat* dr3dr2, CvMat* dr3dt2,
             CvMat* dt3dr1, CvMat* dt3dt1,
             CvMat* dt3dr2, CvMat* dt3dt2 )

是计算R,T矩阵的。

发现这个函数里面,计算的时候,数据类型是double,而我自己定义的时候用的是float,所以报了这个错误。

修改了自己定义的相机内参矩阵(row3 col3)和畸变参数矩阵(row1 col5(k1,k2 p1 p2 k3))一般,只取k1,k2

Mat R1, R2, P1, P2, R,T,Q;
	R = (Mat_<double>(3, 3) << 0, 0, 0, 0, 0, 0, 0, 0, 0);
	T = (Mat_ <double > (3, 1) << 0.12, 0, 0);
	R1 = (Mat_<double>(3, 3) << 0, 0, 0, 0, 0, 0, 0, 0, 0);
	R2 = (Mat_<double>(3, 3) << 0, 0, 0, 0, 0, 0, 0, 0, 0);
	P1 = (Mat_ <double > (3, 4) << 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
	P2 = (Mat_ < double > (3, 4) << 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
	Q = (Mat_ < double > (4, 4) << 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
	Rect validRoi[2];
	Mat cameraMatrix[2];
	Mat distCoeffs[2];
	cameraMatrix[0] = (Mat_<double>(3, 3) << 1397, 0, 1053.53, 0, 1397, 663.661, 0, 0, 1);
	cameraMatrix[1] = (Mat_<double>(3, 3) << 1403.42, 0, 1082.5, 0, 1403.42, 610.597, 0, 0, 1);
	distCoeffs[0] = (Mat_<double>(1, 5) << -0.170728, 0.0237634, 0, 0, 0);
	distCoeffs[1] = (Mat_<double>(1, 5) << -0.171119, 0.0238599, 0, 0, 0);
目的是得到Q矩阵,用来恢复实际的距离。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值