2016-09-11 2 views
1

Je suis en train de calibrer ma caméra suite à un tutoriel. Je comprends tout le processus de recherche du paramètre intrinsèque et des coefficients de distorsion de la caméra à l'aide de l'échiquier. Qu'est-ce que je ne comprends pas, pourquoi après cela, nous appelons le getOptimalNewCameraMatrix? Surtout avec le paramètre alpha. J'ai déjà lu la documentation, mais peut-être parce que je ne connais pas le calibrage de la caméra, je ne peux vraiment pas le comprendre.Que fait le getOptimalNewCameraMatrix dans OpenCV?

Donc, ceci est l'image originale. Ci-dessous sont des exemples des images non déformées de l'image ci-dessus (en utilisant undistort d'OpenCV).

Pour celui-ci, je ne désistors pas l'image directement en utilisant les coefficients intrinsèques de caméra et de distorsion obtenus. Directly undistorted image

Quant à celui-ci, j'appelle le getOptimalNewCameraMatrix avec alpha=0 (à gauche) et alpha=1 (à droite) avant de undistort il. Distorted image with alpha

D'après ce que je peux voir, le getOptimalNewCameraMatrix préserve l'image originale sans perdre l'information? J'espère que quelqu'un peut interpréter ce que cette fonction fait vraiment.

Et si je veux construire un modèle 3D avec Structure from Motion (SfM) avec des images de cet appareil photo, dois-je d'abord appeler le getOptimalNewCameraMatrix?

Merci.

Répondre

1

Vous devrez perdre quelques pixels si vous voulez avoir une image de la même forme que l'image originale.

La description du paramètre "alpha" des OpenCV documents indique ...

paramètre de mise à l'échelle libre entre 0 (lorsque tous les pixels de l'image sans distorsion sont valables) et 1 (quand tout l'image source pixels sont conservés dans l'image non déformée)

pour moi, cela signifie que, avec une valeur de 0, tous les pixels vont se transformer géométriquement être inclus. La distorsion radiale et tangentielle sera supprimée mais votre image ne sera pas géométriquement correcte.

getOptimalNewCameraMatrix est utilisé pour utiliser différentes résolutions de la même caméra avec le même calibrage.

J'obtiens les meilleurs résultats quand j'utilise getOptimalNewCameraMatrix et ensuite j'applique un recadrage pour la région d'intérêt qui est aussi retournée.

Voici un extrait de python que j'utilise à cette fin.

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) 
mapx, mapy = cv2.initUndistortRectifyMap(mtx, dist, None, newcameramtx, dim, 5) 
image = cv2.remap(image, mapx, mapy, cv2.INTER_LINEAR) 

x, y, w, h = roi 
image = image[y:y + h, x:x + w] 

Cela devrait prendre votre dernière image (celle de coussin d'épingle à droite) et vous donner l'image la plus utilisable.

Je subdivisait également la méthode undistort dans ses deux parties que vous pouvez continuer à appeler simplement remap sur les nouvelles images reçues de la caméra à condition qu'ils soient la même résolution