我尝试使用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)
答案 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