나는 cvCalibrateCamera2을 사용하려고하지만 난 회전 매트릭스가 제대로 정의되지 않는다는 오류가 발생합니다 :
cvCalibrateCamera2 - 회전 행렬을 올바르게 정의하는 방법?
...calibration.cpp:1495: error: (-5) the output array of rotation vectors must be 3-channel 1xn or nx1 array or 1-channel nx3 or nx9 array, where n is the number of views
는 이미 그 정보의 모든 가능성을 시도하지만, 난 여전히이 오류가 발생합니다.
내 코드 : 나는 cvCalibrateCamera2에 사용되는 회전 행렬은 (그때는 3 × 3 행렬을 얻을 로드리게스 기능을 사용하려면) 1 ×해야하지만이 언급 된 모든 다른 조합으로 작동하지 않는 것을 생각
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);
문제있는.
아이디어가 있으십니까?
은 내가 OpenCV의 2.4.0 (아마도 거기 방법 버그이지만, 몇 가지 이유로 내가 OpenCV의 이후 버전을 사용할 수 없습니다)
우선 C++입니다. 왜 이것이 C#이라고 생각하니? 둘째로, nx = 50 뷰가있는 경우 3x3 카메라 회전 행렬 및 1x3 변환 벡터를 얻는 방법으로 cvCalibrateCamera2를 사용한 후 50x3 행렬 (회전 행렬)과 50x3 변환 행렬을 얻습니다. –
@never_ever : 예. 스테레오 보정 기능 (또는 이와 유사한 것을 사용하지 않기 때문에)을 얻을 수있는 유일한 회전 - 이동 객체 인 체커 보드로 고전적인 방식으로 모노 카메라를 보정한다고 가정하면 (스테레오 교정으로 보이지 않습니다. 이미지 평면에서 (많은) 바둑판 평면 (또는 그 반대)으로의 상대적인 변환입니다. 뭔가 다른 걸 기대 했니? (C++에 관해서는 제 실수입니다. 죄송합니다. 저는 openCV를 파이썬과 함께 사용하기 시작했습니다) – marcoresk