Я пытаюсь получить некоторую калибровку камеры, но эта ошибка возникает, и пока нет объяснения. Более конкретно, мой алгоритм вылетает в cv2.calibrateCamera (). Я уверен, что матрица, переданная этой функции в качестве аргументов, имеет правильную форму и правильный тип.
Вот мой код:
'''
import cv2
import numpy as np
### zmienne wykorzystywane w algorytmie
ilosc_wykonan = 0
ilosc_pomiarow = 1 # dla mniejszych szablonow - 15, dla wiekszych - 10
szerokosc = 8 # szerokosc szachownicy liczona w polach
wysokosc = 8 # analogicznie do szerokosci
nr_klatki = 0
ilosc_naroznikow = (szerokosc - 1)*(wysokosc - 1) # ilosc wewnetrznych naroznikow szachownicy
szachownica = (wysokosc -1, szerokosc - 1)
znaleziono_narozniki = False
###
wszystkie_wspolrzedne = np.zeros([0,1,2],dtype = np.float32) # macierz zawierajaca wszystkie obliczone wsporzedne funkcja findChessboardCorners dla podanej ilosci_pomiarow; Zapisane pomiar za pomiarem
wszystkie_punkty = np.zeros([ilosc_naroznikow*ilosc_pomiarow,3],dtype=np.float32) # rozklad punktow szachownicy (indexy naroznikow: schemat: (X,Y,Z)->(1,1,0)-(2,1,0)-(3,1,0)-(1,2,0)-(2,2,0)-(3,2,0)-(1,3,0)-(2,3,0)-(3,3,0) dla szacohwnicy 4x4)
### tworzenie macierzy z punktami naroznikow do pozniejszego obliczania macierzy wewn. i wektora dystorsji
y=0
x=0
i=0
n=0
while(True):
while(True):
wszystkie_punkty[i+n,0] = x
wszystkie_punkty[i+n,1] = y
wszystkie_punkty[i+n,2] = 0
x += 1
if x == szerokosc - 1:
x = 0
y += 1
if i == ilosc_naroznikow-1:
break
i += 1
i = 0
x = 0
y = 1
n += ilosc_naroznikow
if n == ilosc_pomiarow*ilosc_naroznikow :
break
###
wszystkie_punkty = wszystkie_punkty.reshape((ilosc_naroznikow*ilosc_pomiarow, 1, wszystkie_punkty.shape[1]))
#wszystkie_wspolrzedne = wszystkie_wspolrzedne.reshape((ilosc_naroznikow, 1, wszystkie_wspolrzedne.shape[1]))
print('wszystkie_wspolrzedne SHAPE = ', wszystkie_wspolrzedne.shape)
print('wszystkie_punkty SHAPE = ', wszystkie_punkty.shape)
### wartosci do wyliczenia
macierz_wewnetrzna = np.zeros((3,3))
wektor_dystorsji = np.zeros((1,5))
###
cap = cv2.VideoCapture(0) # pobranie obrazu z kamery o indexie 0
if not (cap.isOpened()): # sprawdzenie czy poprawnie pobrano obraz
print('Could not open video device')
while(True):
# Capture frame-by-frame
while(znaleziono_narozniki == False):
ret, frame = cap.read() # zapisanie klatki do wykonania operacji
drawning_corners = frame # zachowanie kolorowego obrazu do pozniejszego oznaczenia na nim znalezionych naroznikow
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
height, width, channels = frame.shape
img_size = height * width
ret, thresh = cv2.threshold(gray,150,250,0) # obraz binarny
cv2.imshow('THRESHOLDED IMAGE', thresh)
c = cv2.waitKey(700)
if c == 27: # wcisniecie ESC (ASCII 27) spowoduje wylaczenie aplikacji
break
nr_klatki+=1
print(nr_klatki,' ' ,sep=' ', end='', flush=True ) # timer do zmiany pozycji szachownicy
if nr_klatki == 10:
znaleziono_narozniki, wspolrzedne = cv2.findChessboardCorners(thresh,szachownica,flags=cv2.CALIB_CB_ADAPTIVE_THRESH )
cv2.cornerSubPix(thresh, wspolrzedne, (11,11), (-1,-1),(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
nr_klatki = 0
if znaleziono_narozniki == False:
print('Nie wszystkie narozniki zostaly znalezione!!\nSprobuj innego ustawienia.')
print('wspolrzedne SHAPE = ', wspolrzedne.shape)
wszystkie_wspolrzedne = np.append(wszystkie_wspolrzedne,wspolrzedne,axis=0)
znalezionych_naroznikow = np.size(wspolrzedne)
cv2.drawChessboardCorners(drawning_corners,szachownica,wspolrzedne,znaleziono_narozniki)
cv2.imshow('CORNERS',drawning_corners)
ilosc_wykonan += 1
print('Zakonczono [', ilosc_wykonan, '] pomiar')
znaleziono_narozniki = False
if ilosc_wykonan == ilosc_pomiarow:
print('Wykonano wszystkie pomiary.')
break
if cv2.waitKey(1) & 0xFF == ord('q'): #WYMUSZONE WYLACZENIE PROGRAMU KLAWISZEM "q"
break
print('wszystkie_wspolrzedne = \n',wszystkie_wspolrzedne)
print('wszystkie_punkty = \n', wszystkie_punkty)
cv2.calibrateCamera(wszystkie_punkty,wszystkie_wspolrzedne,(height,width),macierz_wewnetrzna,wektor_dystorsji,flags=cv2.CALIB_FIX_ASPECT_RATIO | cv2.CALIB_FIX_PRINCIPAL_POINT)
print('Macierz wewnetrzna = \n',macierz_wewnetrzna)
print('Wektor dystorsji = \n',wektor_dystorsji)
print('\n\n\t---Zakonczono dzialanie programu---')
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
my imagePoints shape:
[[[316.4966 304.12164]]
[[319.2651 320.90222]]
[[321.81418 338.4704 ]]
.....
[[196.51253 406.96317]]
[[197.16621 428.1537 ]]]
objectPoints shape:
[[[1. 1. 0.]]
[[2. 1. 0.]]
[[3. 1. 0.]]
........
[[5. 7. 0.]]
[[6. 7. 0.]]
[[7. 7. 0.]]]
'''
Я делаю вычисления с USB-камеры, потому что это позволяет мне сделать несколько расчетов на разных углах шахматной доски. Мне действительно нужна твоя помощь!