(相机校准)如何让我的循环读取图像只等待 10 秒,如果没有任何移动到下一张图像?
(Camera Calibration) How to make my loop to read images wait only for 10 seconds and if there is nothing move to the next image?
我正在编写代码以使用 openCV 在 Python 中校准相机。我正在使用 30 张图像进行校准。这个想法是循环从图像开始,如果它没有检测到某些东西,请等待一段时间并转到下一张图像。
我的objective是让循环等待每张图片只等待15秒(例如)如果没有结果,则传递到下一张图片.
感谢您的帮助。
这是代码。
# -*- coding: utf-8 -*-
import numpy as np
import cv2
import glob
import math
import pickle
import matplotlib.pyplot as plt
import time
# Calcul de la distance
def _pdist(p1, p2):
"""
Distance bwt two points. p1 = (x, y), p2 = (x, y)
"""
return math.sqrt(math.pow(p1[0] - p2[0], 2) + math.pow(p1[1] - p2[1], 2))
print "Initializing"
# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# Définir le nombre de bords qu'on a dans le damier (dans notre cas 13*13)
n_rows = 13
n_cols = 13
n_cols_and_rows = (n_cols, n_rows)
n_rows_and_cols = (n_rows, n_cols)
# Prépar les points objet (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((n_rows * n_cols, 3), np.float32)
objp[:, :2] = np.mgrid[0:n_rows, 0:n_cols].T.reshape(-1, 2)
# Préparer deux tableaux pour sauvegarder les points objet et points images de totues les images trouvées.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.
# Les photos du damier qu'on a pris pour le test
mypath = "/home/stagiaire/Bureau/New_Calibrage/RGB/"
# mypath="/home/stagiaire/Bureau/DATA_new//Photos_damiers_test/GRE/"
# mypath="/home/stagiaire/Bureau/DATA_new/Photos_damiers_test/NIR/"
# mypath="/home/stagiaire/Bureau/DATA_new/Photos_damiers_test/RED/"
# mypath="/home/stagiaire/Bureau/DATA new/Photos_damiers_test/REG/"
# mypath="/home/stagiaire/Bureau/DATA_new/Photos_damiers_test/RGB/"
print "Getting images from " + mypath
images = glob.glob(mypath + '*.JPG')
print "images is: " + str(images)
criteria_calibrator = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
criteria = criteria_calibrator
for idx, fname in enumerate(images):
print "\nImage " + fname
if time.sleep(10):
break
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Trouver les bords
ret, corners = cv2.findChessboardCorners(gray, n_rows_and_cols, None)
# Si trouvés, on ajoute les points obj et les points images
if ret == True:
print " found " + str(len(corners)) + " corners."
objpoints.append(objp)
# cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) didnt work, I couldnt make it work copying the calibrator code
imgpoints.append(corners)
# Dessiner et afficher les bords sur la photo originale
cv2.drawChessboardCorners(img, n_rows_and_cols, corners, ret)
cv2.imshow('img', img)
cv2.waitKey(500)
# Afficher combien de points image et points objet on a trouvé
print "objpoints len: " + str(len(objpoints))
print "imgpoints len: " + str(len(imgpoints))
# Trouver la matrice de la caméra et l'enregistrer dans le dossier du data (photos du test)
try:
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
datathings = (ret, mtx, dist, rvecs, tvecs)
outf = open(mypath + "calibration_return_values_rows_and_cols.pickle", "rb")
pickle.dump(datathings, outf)
fieldnames = ["ret", "mtx", "dist", "rvecs", "tvecs"]
for fieldname, data in zip(fieldnames, datathings):
print fieldname + ": "
print data
print "ret, mtx, dist, rvecs, tvecs:"
print (ret, mtx, dist, rvecs, tvecs)
except:
print "Failed getting cv2.calibrateCamera"
pass
# cv2.destroyAllWindows()
# Calibration
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
img = cv2.imread('/home/stagiaire/Bureau/New_Calibrage/GRE/IMG_700101_000255_0000_RGB.JPG')
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
# undistortion
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
# crop l'image
x, y, w, h = roi
dst = dst[y:y + h, x:x + w]
cv2.imwrite('Desktop/imagecalibre.png', dst)
# Affichage l'image originale au coté de l'image calibrée
plt.subplot(221), plt.imshow(img), plt.title('image originale')
plt.subplot(222), plt.imshow(dst), plt.title('image calibree')
plt.show()
# Calcul de l'erreur
mean_error = 0
for i in xrange(len(objpoints)):
imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
tot_error = error
print "total error: ", mean_error / len(objpoints)
这是我想改变循环的部分,我试过类似 time.sleep() 但它不起作用。
for idx, fname in enumerate(images):
print "\nImage " + fname
if time.sleep(10):
break
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Trouver les bords
ret, corners = cv2.findChessboardCorners(gray, n_rows_and_cols, None)
# Si trouvés, on ajoute les points obj et les points images
if ret == True:
print " found " + str(len(corners)) + " corners."
objpoints.append(objp)
# cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) didnt work, I couldnt make it work copying the calibrator code
imgpoints.append(corners)
尝试移除
if time.sleep(10):
break
并改变
cv2.waitKey(500)
到
cv2.waitKey(10000) # waits 10 seconds (10000 ms) for a pressed key
这是 cv2.waitKey
的 link
--- 编辑 ---
也许你可以这样试试:
for idx, fname in enumerate(images):
print "\nImage " + fname
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Trouver les bords
ret, corners = cv2.findChessboardCorners(gray, n_rows_and_cols, None)
# Si trouvés, on ajoute les points obj et les points images
if ret == True:
print " found " + str(len(corners)) + " corners."
objpoints.append(objp)
# cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) didnt work, I couldnt make it work copying the calibrator code
imgpoints.append(corners)
# Dessiner et afficher les bords sur la photo originale
cv2.drawChessboardCorners(img, n_rows_and_cols, corners, ret)
cv2.imshow('img', img)
cv2.waitKey(0)
else:
print " no corners found"
我正在编写代码以使用 openCV 在 Python 中校准相机。我正在使用 30 张图像进行校准。这个想法是循环从图像开始,如果它没有检测到某些东西,请等待一段时间并转到下一张图像。
我的objective是让循环等待每张图片只等待15秒(例如)如果没有结果,则传递到下一张图片.
感谢您的帮助。
这是代码。
# -*- coding: utf-8 -*-
import numpy as np
import cv2
import glob
import math
import pickle
import matplotlib.pyplot as plt
import time
# Calcul de la distance
def _pdist(p1, p2):
"""
Distance bwt two points. p1 = (x, y), p2 = (x, y)
"""
return math.sqrt(math.pow(p1[0] - p2[0], 2) + math.pow(p1[1] - p2[1], 2))
print "Initializing"
# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# Définir le nombre de bords qu'on a dans le damier (dans notre cas 13*13)
n_rows = 13
n_cols = 13
n_cols_and_rows = (n_cols, n_rows)
n_rows_and_cols = (n_rows, n_cols)
# Prépar les points objet (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((n_rows * n_cols, 3), np.float32)
objp[:, :2] = np.mgrid[0:n_rows, 0:n_cols].T.reshape(-1, 2)
# Préparer deux tableaux pour sauvegarder les points objet et points images de totues les images trouvées.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.
# Les photos du damier qu'on a pris pour le test
mypath = "/home/stagiaire/Bureau/New_Calibrage/RGB/"
# mypath="/home/stagiaire/Bureau/DATA_new//Photos_damiers_test/GRE/"
# mypath="/home/stagiaire/Bureau/DATA_new/Photos_damiers_test/NIR/"
# mypath="/home/stagiaire/Bureau/DATA_new/Photos_damiers_test/RED/"
# mypath="/home/stagiaire/Bureau/DATA new/Photos_damiers_test/REG/"
# mypath="/home/stagiaire/Bureau/DATA_new/Photos_damiers_test/RGB/"
print "Getting images from " + mypath
images = glob.glob(mypath + '*.JPG')
print "images is: " + str(images)
criteria_calibrator = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
criteria = criteria_calibrator
for idx, fname in enumerate(images):
print "\nImage " + fname
if time.sleep(10):
break
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Trouver les bords
ret, corners = cv2.findChessboardCorners(gray, n_rows_and_cols, None)
# Si trouvés, on ajoute les points obj et les points images
if ret == True:
print " found " + str(len(corners)) + " corners."
objpoints.append(objp)
# cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) didnt work, I couldnt make it work copying the calibrator code
imgpoints.append(corners)
# Dessiner et afficher les bords sur la photo originale
cv2.drawChessboardCorners(img, n_rows_and_cols, corners, ret)
cv2.imshow('img', img)
cv2.waitKey(500)
# Afficher combien de points image et points objet on a trouvé
print "objpoints len: " + str(len(objpoints))
print "imgpoints len: " + str(len(imgpoints))
# Trouver la matrice de la caméra et l'enregistrer dans le dossier du data (photos du test)
try:
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
datathings = (ret, mtx, dist, rvecs, tvecs)
outf = open(mypath + "calibration_return_values_rows_and_cols.pickle", "rb")
pickle.dump(datathings, outf)
fieldnames = ["ret", "mtx", "dist", "rvecs", "tvecs"]
for fieldname, data in zip(fieldnames, datathings):
print fieldname + ": "
print data
print "ret, mtx, dist, rvecs, tvecs:"
print (ret, mtx, dist, rvecs, tvecs)
except:
print "Failed getting cv2.calibrateCamera"
pass
# cv2.destroyAllWindows()
# Calibration
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
img = cv2.imread('/home/stagiaire/Bureau/New_Calibrage/GRE/IMG_700101_000255_0000_RGB.JPG')
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
# undistortion
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
# crop l'image
x, y, w, h = roi
dst = dst[y:y + h, x:x + w]
cv2.imwrite('Desktop/imagecalibre.png', dst)
# Affichage l'image originale au coté de l'image calibrée
plt.subplot(221), plt.imshow(img), plt.title('image originale')
plt.subplot(222), plt.imshow(dst), plt.title('image calibree')
plt.show()
# Calcul de l'erreur
mean_error = 0
for i in xrange(len(objpoints)):
imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
tot_error = error
print "total error: ", mean_error / len(objpoints)
这是我想改变循环的部分,我试过类似 time.sleep() 但它不起作用。
for idx, fname in enumerate(images):
print "\nImage " + fname
if time.sleep(10):
break
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Trouver les bords
ret, corners = cv2.findChessboardCorners(gray, n_rows_and_cols, None)
# Si trouvés, on ajoute les points obj et les points images
if ret == True:
print " found " + str(len(corners)) + " corners."
objpoints.append(objp)
# cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) didnt work, I couldnt make it work copying the calibrator code
imgpoints.append(corners)
尝试移除
if time.sleep(10):
break
并改变
cv2.waitKey(500)
到
cv2.waitKey(10000) # waits 10 seconds (10000 ms) for a pressed key
这是 cv2.waitKey
的 link--- 编辑 ---
也许你可以这样试试:
for idx, fname in enumerate(images):
print "\nImage " + fname
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Trouver les bords
ret, corners = cv2.findChessboardCorners(gray, n_rows_and_cols, None)
# Si trouvés, on ajoute les points obj et les points images
if ret == True:
print " found " + str(len(corners)) + " corners."
objpoints.append(objp)
# cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) didnt work, I couldnt make it work copying the calibrator code
imgpoints.append(corners)
# Dessiner et afficher les bords sur la photo originale
cv2.drawChessboardCorners(img, n_rows_and_cols, corners, ret)
cv2.imshow('img', img)
cv2.waitKey(0)
else:
print " no corners found"