cvCalibrateCamera2 - 如何正确定义旋转矩阵?

时间:2016-10-17 20:11:21

标签: opencv camera-calibration rotational-matrices


我尝试使用cvCalibrateCamera2,但是我得到的错误是旋转矩阵没有正确定义:

  

... calibration.cpp:1495:错误:( - 5)旋转矢量的输出数组必须是3通道1xn或nx1数组或1通道nx3或nx9数组,其中n是视图数< / p>

我已经尝试过该信息的所有可能性,但我仍然遇到此错误。

我的代码:

CvMat *object_points = cvCreateMat((int)pp.object_points.size(), 1, CV_32FC3);
CvMat *image_points = cvCreateMat((int)pp.image_points.size(), 1, CV_32FC2);
const CvMat point_counts = cvMat((int)pp.point_counts.size(), 1, CV_32SC1, &pp.point_counts[0]);

for (size_t i=0; i<pp.object_points.size(); i++) 
{
  object_points->data.fl[i*3+0] = (float)pp.object_points[i].x;
  object_points->data.fl[i*3+1] = (float)pp.object_points[i].y;
  object_points->data.fl[i*3+2] = (float)pp.object_points[i].z;
  image_points->data.fl[i*2+0]  = (float)pp.image_points[i].x;
  image_points->data.fl[i*2+1]  = (float)pp.image_points[i].y;
}

CvMat* tempR = cvCreateMat(1, 3, CV_32F);

cvCalibrateCamera2(object_points, image_points, &point_counts,
                   cvSize(pp.width, pp.height), camera->m_calib_K,
                   camera->m_calib_D, tempR, &tempData->m_calib_T,
                   CV_CALIB_USE_INTRINSIC_GUESS)

// camera->calib_T is defined as:
// double m_calib_T_data[3];
// cvMat(3, 1, CV_64F, camera->m_calib_T_data);

我认为cvCalibrateCamera2中使用的旋转矩阵应该是1x3(然后我想使用Rodrigues函数来获得3x3矩阵)但它不能像错误中提到的任何其他组合一样工作。

有什么想法吗?

我使用opencv 2.4.0(也许这个方法有bug,但由于某些原因我不能使用更高版本的opencv)

1 个答案:

答案 0 :(得分:0)

我认为这句话很清楚。我对C#没有信心,但我知道它需要强大的初始化。 行中的问题

CvMat* tempR = cvCreateMat(1, 3, CV_32F);

tempR对于您使用的每个N对象点都应该有一行1x3。从这个意义上讲,陈述变得清晰

  

... calibration.cpp:1495:错误:( - 5)输出旋转数组   向量必须是3通道1xn或nx1阵列或1通道nx3或nx9   数组,其中n是视图数

你必须创建一个这样的tempR(或多或少,我不知道如何在C#中计算N

CvMat* tempR = cvCreateMat(N, 3, CV_32F);

尝试从object.point.size的维度中提取N.如果它不起作用,请尝试image.point.size

相关问题