0
파이썬에 openCV을 사용하여 카메라를 보정하는 코드를 작성 중입니다. 교정을 위해 30 개의 이미지를 사용하고 있습니다. 아이디어는 루프가 이미지로 시작하고 무언가를 감지하지 못하면 언젠가 기다렸다가 다음 이미지로 이동한다는 것입니다.(카메라 보정) 이미지를 읽도록 내 루프를 만드는 방법은 10 초 동안 만 대기하고 다음 이미지로 이동하지 않을 경우 어떻게합니까?
내 목표는 (예 : 012 초) 동안 각 이미지에 대해 루프가 대기하도록하고 결과가없는 경우 다음 이미지로 전달합니다.
도움 주셔서 감사합니다.
다음은 코드입니다.
# -*- 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)
난 그냥 그것을 밖으로 시도하고, 어떤 일을하지 않았다, 당신에게 선생님 감사합니다! 코드가 여전히 실행 중이고 첫 번째 그림에서 차단 중입니다. –
1.'cv2.waitKey'는 _image window_에서 누른 키를 기다리고 _terminal_에서는 기다리지 않습니다. 2. 키를 누르지 않으면 10 초마다 자동으로 다음 사진으로 이동합니까? 또는 첫 번째 그림이 영원히 거기에서 차단됩니까? – ANARKIA
그림이 뒤쪽에서 처리 중이며 표시되지 않습니다. 코드가 뭔가를 감지하면 표시됩니다. 제 경우에는 아무것도 감지하지 못하는 경우를 말하고 있습니다. 처리가 백그라운드에 있으며 15 초 안에 무언가를 감지하지 못하면 다음 사진으로 직접 이동해야합니다. –