2017-04-13 9 views
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

시도

if time.sleep(10): 
    break 

을 제거하고 여기에 cv2.waitKey

에 대한 링크가의

cv2.waitKey(500) 

cv2.waitKey(10000) # waits 10 seconds (10000 ms) for a pressed key 

을 변경하려면

--- 편집 ---

어쩌면 당신이이 같은 시도 할 수 있습니다 :

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" 
+0

난 그냥 그것을 밖으로 시도하고, 어떤 일을하지 않았다, 당신에게 선생님 감사합니다! 코드가 여전히 실행 중이고 첫 번째 그림에서 차단 중입니다. –

+0

1.'cv2.waitKey'는 _image window_에서 누른 키를 기다리고 _terminal_에서는 기다리지 않습니다. 2. 키를 누르지 않으면 10 초마다 자동으로 다음 사진으로 이동합니까? 또는 첫 번째 그림이 영원히 거기에서 차단됩니까? – ANARKIA

+0

그림이 뒤쪽에서 처리 중이며 표시되지 않습니다. 코드가 뭔가를 감지하면 표시됩니다. 제 경우에는 아무것도 감지하지 못하는 경우를 말하고 있습니다. 처리가 백그라운드에 있으며 15 초 안에 무언가를 감지하지 못하면 다음 사진으로 직접 이동해야합니다. –