2015-04-07 2 views
0

Pour mon projet de thèse, je dois déterminer les paramètres de distorsion K d'une caméra. J'ai décidé d'utiliser python et opencv pour le faire. Donc vous pouvez voir que je suis un débutant avec Python et Opencv. J'utilise ce code standard:Calibration de l'appareil photo opencv python erreur imshow: (-215) size.width> 0 && size.height> 0

import numpy as np 
import cv2 
import glob 


#termination criteria 
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 70, 0.001) 

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

#Arrays to store objects points and real image points from all the images. 
objpoints = [] #3D point in real world space 
imgpoints = [] #2D points in image plane 

images = glob.glob('C:/tmp/pixelgrootte/*.jpg') 
counter = int(x=1) 

for fname in images: 
    img = cv2.imread(fname) 
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 


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

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

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

     # Draw and display the corners 
     img = cv2.drawChessboardCorners(img, (5,7), corners2,ret) 
     cv2.imshow('img',img) 
     cv2.waitKey(500) 
     counter += 1 
    else: 
     print("No corners found on Picture " + str(counter)) 
     counter += 1 


cv2.destroyAllWindows() 

#Calibration 
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None) 
print("Camera Matrix: " + str(mtx)) 
print("Distortion Factors: " + str(dist)) 

Quand je lance ce script, c'est l'erreur que je reçois:

No corners found on Picture 1 
Traceback (most recent call last): 
    File "C:\Users\Lode\Documents\School\2014-2015\Thesis\Camera\Camera Calibration.py", line 37, in <module> 
cv2.imshow('img',img) 
error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:261: error: (-215) size.width>0 && size.height>0 in function cv::imshow 

Comme vous pouvez le voir, j'utilisé ce code standard: https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html#calibration. Les seules différences sont le compteur (je l'ai utilisé auparavant pour que je puisse facilement déterminer si une certaine architecture était suffisamment claire), la taille des carrés (= 7cm) et la forme du damier (= carrés 8hor et 6vert). Ma première supposition était que la fonction imshow ne fonctionnait pas mais ce n'est pas le cas. Quand je lance ce script, tout fonctionne très bien:

import numpy as np 
import cv2 
import glob 

images = glob.glob('C:/tmp/pixelgrootte/*.jpg') 

for fname in images: 
    img = cv2.imread(fname) 
    cv2.imshow('img',img) 
    cv2.waitKey(500) 

cv2.destroyAllWindows() 

Alors j'ai décidé d'exécuter le débogueur. Le débogueur a montré que img, imgpoints et corners2 étaient vides. Alors peut-être que la fonction cornerSubPix ne fonctionne pas dans mon cas? Mais je n'ai vraiment aucune idée de pourquoi cela ne fonctionnerait pas.

Une partie étrange de ce code est qu'il a fonctionné parfaitement il y a deux semaines, mais depuis lors, j'ai réinstallé mon ordinateur parce qu'il était lent. Maintenant, j'ai installé les versions actuelles:

Windows 7 N 32bit professionnel

Python 2.7.9

Numpy 1.9.2

OpenCV 2.4.11

Donc je suppose que J'ai une partie du logiciel nécessaire pour exécuter ce script non installé mais je n'arrive pas à comprendre ce que c'est.

J'ai déjà fait quelques recherches sur ce sujet mais je n'ai pas trouvé de solution sur ce forum qui convenait à mon problème. Cela ressemble à une erreur commune mais je n'arrive pas à comprendre ce qui cause cette erreur.

Y at-il quelqu'un qui peut m'aider avec ça? Je serais très reconnaissant!

Répondre

0

L'erreur provient de cette ligne:

img = cv2.drawChessboardCorners(img, (5,7), corners2,ret) 

Selon les docs, cv2.drawChessboardCorners retours None. Donc, ne pas rebondir img.

drawChessboardCorners Le premier paramètre est l'image de destination (encore une fois, à partir des docs), à laquelle elle rendra les coins d'échiquier détectés.

Le didacticiel auquel vous liez est destiné à opembv version 3.x, comme mentionné dans this github issue, où l'auteur rencontre le même problème que vous. Le code de travail (testé avec l'opencv 2.3.1.7, qui mentionne ses __version__ est $Rev: 4557 $) est fourni en this SO answer.

+0

Merci beaucoup pour votre aide.Je me sens un peu stupide en ce moment parce que ce problème a déjà été résolu. Mais encore, merci d'avoir répondu si vite. –

+0

@Lode, vous ne pouviez pas savoir: pour autant que je l'ai trouvé, aucun post sur stackoverflow ne mentionne qu'il s'agit d'un problème de version. J'ai seulement découvert à ce sujet moi-même après avoir essayé de comprendre ce que la façon correcte était alors parce que les fonctions de Python ne changent généralement pas les paramètres qui lui sont passés (sauf si explicitement mentionné dans les docs). Vous n'avez pas besoin de modifier cette réponse (l'autre auquel je suis lié pourrait être plus méritant), mais vous pourriez peut-être envisager de cliquer sur la coche pour marquer votre question comme résolue. –

+0

J'ai cliqué sur la coche, vous l'avez mérité :-) –