2017-09-15 7 views
2

J'utilise la fonction openCV pour détecter un échiquier, mais aucun échiquier n'est détecté.étalonnage de la caméra - impossible de détecter l'échiquier

L'image que je me sers:

enter image description here

const Size chessboardDimensions = Size(4,8); 
int main (int argv, char ** argc) 
{ 
     frame = imread("/home/Georges/Desktop/a.jpg"); 
     cvtColor(frame, frame, CV_BGR2GRAY); 
     int found = findChessboardCorners(frame, chessboardDimensions, foundPoints, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE); 

} 

trouvé est toujours égal à 0. Quelqu'un pourrait-il me expliquer pourquoi?

+0

trouvé devrait être un bool pas un int, il vous indique si le modèle a été trouvé (je pense qu'il retournera les coins trouvé même si elle retourne false). Dans votre cas, la taille est incorrecte, donc il ne peut pas trouver le motif. – api55

+0

@ api55 Salut, je voudrais poster ma question ici comme un commentaire parce que j'ai vu que OP utilise une image qui est la même que celle que j'ai utilisée. Comme le sujet de ma question est très précis, j'ai peur que cela ne retienne pas beaucoup d'attention. https://stackoverflow.com/questions/46225943/how-to-correctly-calibrate-my-camera-with-a-wide-angle-lens-using-opencv/ Une idée sur le problème auquel je suis confronté? – privetDruzia

Répondre

4
const Size chessboardDimensions = Size(4,8); 

Dans cette taille d'expression devrait être

Size(5,8) 

Parce que vous devez compter les coins carrés intérieurs.

Edit:

Comme mentionné dans les commentaires, int found devrait être bool. Parce que la fonction renvoie si les coins sont trouvés ou non.

Et comme suggestion d'ajouter l'option de vérification rapide à votre fonction sinon la fonction peut laggy:

bool found = findChessboardCorners(frame, chessboardDimensions, foundPoints, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE | CALIB_CB_FAST_CHECK); 

Et il est bon de vérifier si tous les points trouvés correctement. Dans certains cas, tous les points ne peuvent pas être détectés et dans d'autres applications, cette situation donne une erreur. Parce que la sortie de cette fonction sera entrée d'un autre. Alors, ajoutez une expression continue à votre boucle:

if(found == 0 || foundPoints.size() != chessboardDimensions.area()) 
    continue; 
+0

Une telle faute de frappe! Je vais accepter votre réponse dans quelques minutes. – LandonZeKepitelOfGreytBritn