2017-04-25 101 views
0

我試圖做使用打開Cv2的的Python 2.7一個multipectral攝像機標定,以及代碼與我從3單色有照片運作良好傳感器(RED,NIR和GRE)和RGB。只有在代碼中無效的圖片纔是來自REG傳感器的圖片(紅色綠色)。攝像機標定

代碼讀取圖片將它們轉換爲灰色然後發現拐角子像素,最後一個producres相機校準矩陣

我已經建立了多個打印的代碼中的每個部分,這樣我就知道這是不工作的具體部分,所以我知道這是不是在cv2.findChessboardCorners線工作的REG情況。

ret, Bords_Trouves = cv2.findChessboardCorners(Images_en_gris, Lignes_et_Collones, None) 

所以我的問題是:

有什麼理由不代碼工作?或者這是REG傳感器圖片的問題,我將不得不嘗試其他方法將它們轉換爲灰色?或者是什麼 ?

這裏是所有代碼:

# -*- coding: utf-8 -*- 
import numpy as np 
import cv2 
import glob 
import math 
import pickle 
import matplotlib.pyplot as plt 


critere = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_COUNT, 10, 0.01) 

Lignes = 13 
Collones = 13 
Collones_et_Lignes = (Collones, Lignes) 
Lignes_et_Collones = (Lignes, Collones) 

Points_Reels = np.zeros((Lignes*Collones, 3), np.float32) 
Points_Reels[:, :2] = np.mgrid[0:Lignes, 0:Collones].T.reshape(-1, 2) 

# Préparer deux tableaux pour sauvegarder les points objet et points images de totues les images trouvées. 
Tableau_points_reels = [] 
Tableau_points_imaginaires = [] 

# Les photos du damier qu'on a pris pour le test 
Source = "C:/Users/Mourad/Desktop/Calib1804/REG/" 
Mes_Images = glob.glob(Source + '*.TIF') 

print "les images ont bien étaient récupérées." if Mes_Images else "PROBLEME: images non récupérés !! " 

for leo, fname in enumerate(Mes_Images): 
    print("Image : " + fname) 
    #if leo > 10: 
    # break 
    image_originale = cv2.imread(fname) 

    Images_en_gris = cv2.cvtColor(image_originale, cv2.COLOR_BGR2GRAY) 

    print "les images ont bien étaient transformés en gris." if Images_en_gris.all() else "PROBLEME: images non transformés en gris!! " 

    ret, Bords_Trouves = cv2.findChessboardCorners(Images_en_gris, Lignes_et_Collones, None) 

    print str(len(Bords_Trouves)) + " Bords trouvés" if ret else "PROBLEME: Bords Non trouvés !!" 

    Tableau_points_reels.append(Points_Reels) 

    PL = (11, 11) 

    Plus_de_precision = cv2.cornerSubPix(Images_en_gris, Bords_Trouves[1], PL, (-1, -1), critere) 


    print "Sub pixels trouvées" if Plus_de_precision else "PROBLEME: Pas de sub pixels trouvées" 

    Tableau_points_imaginaires.append(Bords_Trouves) 

    # far = cv2.drawChessboardCorners(image_originale, Lignes_et_Collones, Bords_Trouves, ret) 

    #cv2.imshow("Bords trouvées déssinés sur l'image originale", image_originale) 
    #cv2.waitKey(500) 
    #() 
print "Nombre de points réels trouvés: " + str(len(Tableau_points_reels)) 
print "Nombres de points imaginaires trouvés: " + str(len(Tableau_points_imaginaires)) 

h, w = Images_en_gris.shape[:2] 

derik, matrice, distortion, vecteur_de_rotation, vecteur_de_translation = cv2.calibrateCamera(Tableau_points_reels, Tableau_points_imaginaires, (w, h), None, None, flags=cv2.CALIB_RATIONAL_MODEL) 

print "La matrice de calibration est: " 
print matrice 
print "La distortion est egale a: " 
print distortion 
print "Le vecteur de rotation est egal a: " 
print vecteur_de_rotation 
print "Le vecteur de translation est egal a: " 
print vecteur_de_translation 

print "\n La matrice de calibration trouvée et données récupérés" if derik else "PROBLEME: Pas de calibration" 

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(matrice, distortion, (w, h), 1, (w, h)) 

# undistortion 
Image_calibree = cv2.undistort(image_originale, matrice, distortion, None, newcameramtx) 

fgh = cv2.imread("C:/Users/Mourad/Desktop/Calib1804/RGB/IMG_700101_000800_0000_RGB.JPG") 

h, w = fgh.shape[:2] 

x, y, w, h = roi 
Image_calibree = Image_calibree[y:y+h, x:x+w] 
cv2.imwrite('Desktop/imagecalibre.png', Image_calibree) 

plt.subplot(121), plt.imshow(fgh), plt.title('image originale') 
plt.subplot(122), plt.imshow(Image_calibree), plt.title('image calibree') 
plt.show() 

Erreur_totale = 0 
for i in xrange(len(Tableau_points_reels)): 
    imgpoints2, _ = cv2.projectPoints(Tableau_points_reels[i], vecteur_de_rotation[i], vecteur_de_translation[i], matrice, distortion) 
    Erreur = cv2.norm(Tableau_points_imaginaires[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2) 
    Erreur_totale += Erreur 
    print "Erreur totale: ", Erreur_totale/len(Tableau_points_reels) 

cv2.destroyAllWindows() 

回答

0

如果同一段代碼來自其他傳感器工作了圖像必須有什麼問題你交給cv2.findChessboardCorners的圖片。

嘗試在進入函數之前使用cv2.imshow可視化圖像。顏色轉換可能是錯誤的,因爲cv2.COLOR_BGR2GRAY將3通道圖像轉換爲灰度,但如果我理解了您的格式,則應該有兩個通道。

cv2.findChessboardCorners還應該使用彩色圖像,所以最簡單的解決方案可能只是跳過顏色轉換,如果這是弄亂你的圖像。