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!
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. –
@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. –
J'ai cliqué sur la coche, vous l'avez mérité :-) –