2016-05-18 4 views
0

Je travaille sur un programme d'étalonnage de caméra utilisant l'exemple OpenCV/Python (de: OpenCV Tutorials) comme guide.Étalonnage de la caméra avec OpenCV - Comment ajuster la taille du carré de l'échiquier?

Question: Comment adapter ce code par exemple pour tenir compte de la taille d'un carré sur un damier en particulier? Ma compréhension du processus d'étalonnage de la caméra est que cette information doit en quelque sorte être utilisé autrement les valeurs données par:

cv2.calibrateCamera() 

sera incorrect.

Voici la partie de mon code qui lit dans les fichiers image et parcourt le processus d'étalonnage pour produire la matrice de la caméra et d'autres valeurs.

#import cv2 
#import numpy as np 
#import glob 

""" 
Corner Finding 
""" 
# termination criteria 
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) 

# Prepare object points, like (0,0,0), (1,0,0), ....,(6,5,0) 
objp = np.zeros((5*5,3), np.float32) 
objp[:,:2] = np.mgrid[0:5,0:5].T.reshape(-1,2) 

# Arrays to store object points and image points from all images 
objpoints = [] 
imgpoints = [] 

counting = 0 

# Import Images 
images = glob.glob('dir/sub dir/Images/*') 

for fname in images: 

    img = cv2.imread(fname)  # Read images 
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Convert to grayscale 



    # Find the chess board corners 
    ret, corners = cv2.findChessboardCorners(gray, (5,5), None) 

    # if found, add object points, image points (after refining them) 
    if ret == True: 
     objpoints.append(objp) 

     cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria) 
     imgpoints.append(corners) 

     #Draw and display corners 
     cv2.drawChessboardCorners(img, (5,5), corners, ret) 
     counting += 1 

     print str(counting) + ' Viable Image(s)' 

     cv2.imshow('img', img) 
     cv2.waitKey(500) 

cv2.destroyAllWindows()   


# Calibrate Camera  
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)  
+0

Les points sont vos points d'échiquier dans l'espace 3D. ils sont probablement (0,0), (0,1), (1,1), (1,0); (2,0); Dans cet exemple, la taille du carré (et la longueur du bord) est de 1. Il suffit de redimensionner ces positions pour obtenir une autre taille carrée – Micka

+0

@Micka Donc, si mon échiquier a des carrés d'une moyenne de 25,3 mm, ces valeurs devraient) (0,0,0253): ....? –

+0

exactement. Ou '(0, 25.3)' si vous préférez que votre unité de coordonnées 3D (et de caméra intrinsèque) soit '[mm]'. – Micka

Répondre

0

Ici, si vous avez votre taille carrée prendre 30 mm multiplier cette valeur avec objp[:,:2]. Comme cette

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)*30 # 30 mm size of square 

Comme objp[:,:2] est un ensemble de points de coins checkboard donnés en (0,0), (0,1), (0,2) .... (8,5). (0,0) le point est le coin supérieur gauche du carré le plus haut et (8,5) le coin inférieur droit le plus bas. Dans ce cas, ces points n'ont pas d'unité mais si on multiplie ces valeurs par la taille carrée (par exemple 30 mm), celles-ci deviendront (0,0), (0,30), ..... (240,150) sont les unités du monde réel. Votre vecteur de traduction sera en mm units dans ce cas.

+0

Les points (0,0) .. (8,5) sont de la forme (lignes, colonnes) ou (x, y)? Je pense qu'ils sont de la forme (ligne, colonne) mais je ne suis pas sûr –