2016-10-17 3 views
0


J'essaie d'utiliser cvCalibrateCamera2, mais j'obtiens l'erreur que la matrice de rotation est mal définie:
cvCalibrateCamera2 - comment définir correctement la matrice de rotation?

...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

J'ai déjà essayé toutes les possibilités de cette information mais je reçois toujours cette erreur.

Mon code:

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); 

Je pensais que la matrice de rotation utilisée dans cvCalibrateCamera2 doit être 1x3 (alors je veux utiliser la fonction Rodrigues pour obtenir la matrice 3x3), mais il ne fonctionne pas comme toute autre combinaison mentionnée en erreur

Des idées?

Et j'utilise OpenCV 2.4.0 (peut-être il y a bug dans cette méthode, mais pour certaines raisons je ne peux pas utiliser la version ultérieure de OpenCV)

Répondre

0

Je pense que la déclaration est claire. Je ne suis pas confiant avec C# mais je sais que cela nécessite une forte initialisation. Le problème dans la ligne

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

est que tempR devrait avoir un 1x3 de ligne pour tous les objets N indiquent que vous utilisez. En ce sens, la déclaration devient clair

...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

Vous devez créer un tempR comme ça (plus ou moins, je ne sais pas comment calculer N en C#)

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

Essayez d'extraire N de dimensions de object.point.size. Si cela ne fonctionne pas, essayez image.point.size

+0

Tout d'abord, c'est C++. Pourquoi pensez-vous que c'est C#? Deuxièmement, comment obtenir une matrice de rotation de caméra 3x3 et un vecteur de traduction 1x3 si j'ai n = 50 vues, donc après avoir utilisé cvCalibrateCamera2, j'obtiens une matrice de 50x3 (matrice de rotation) et une matrice de traduction 50x3? –

+0

@never_ever: oui. En supposant que vous calibrez un mono-caméra de manière classique avec un damier (cela ne me semble pas être un calibrage stéréo, puisque vous n'utilisez pas stereocalibrate() ou quelque chose comme ça), le seul objet de rotation-translation que vous pouvez obtenir sont la transformation relative du plan d'image au (ou plusieurs) plan (s) d'échiquier (ou vice versa). Pensiez-vous quelque chose de différent? (A propos de C++ c'est mon erreur, désolé, j'ai commencé à utiliser openCV avec python) – marcoresk