Количество точек в представлении № 0 <4 в функции 'cvCalibrateCamera2Internal' ошибка cv2 - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь получить некоторую калибровку камеры, но эта ошибка возникает, и пока нет объяснения. Более конкретно, мой алгоритм вылетает в 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-камеры, потому что это позволяет мне сделать несколько расчетов на разных углах шахматной доски. Мне действительно нужна твоя помощь!

...