ошибка калибровки стереокамеры - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь выполнить стереокалибровку двух USB-камер, чтобы выполнить карту глубины, но я попадаю на эту ошибку, и я не знаю, как ее решить. Буду очень благодарен тому, кто сможет помочь.

 File "C:/Users/gaetano/stereoCalib.py", line 85, in <module>
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, 
gray.shape[::-1], None, None)

error: OpenCV(3.4.1) D:\Build\OpenCV\opencv- 
3.4.1\modules\calib3d\src\calibration.cpp:3384: error: (-215) nimages > 0 in 
function cv::calibrateCamera

(this error should have been solved using the following code) 



#before here i have collect picture from both the camera, than 
#grey conversion
i=0
while i < img_counter:
img = cv2.imread('colorRight_' + str(i) + '.jpg')
img2 = cv2.imread('colorLeft_' + str(i) + '.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

cv2.imwrite('greyRight_' + str(i) + '.jpg',gray)
cv2.imwrite('greyLeft_' + str(i) + '.jpg',gray2)
i += 1 



nx = 9
ny = 6
chess_imagesL = glob.glob('greyLeft_*.jpg')
chess_imagesR = glob.glob('greyRight_*.jpg')
for i in range(len(chess_imagesL)):
# Read in the image
chess_board_imageL = mpimg.imread(chess_imagesL[i])
chess_board_imageR = mpimg.imread(chess_imagesR[i])
# Convert to grayscale
# gray = cv2.cvtColor(chess_board_image, cv2.COLOR_RGB2GRAY)
# Find the chessboard corners
ret, cornersL = cv2.findChessboardCorners(chess_board_imageL, (nx, ny), 
None)
ret2, cornersR = cv2.findChessboardCorners(chess_board_imageR, (nx, ny), 
None)
# If found, draw corners
if ret == True:
    # Draw and display the corners
    cv2.drawChessboardCorners(chess_board_imageL, (nx, ny), cornersL, ret)
    cv2.drawChessboardCorners(chess_board_imageR, (nx, ny), cornersR, ret2)
    result_nameL = 'boardL'+str(i)+'.png'
    result_nameR = 'boardR'+str(i)+'.png'
    cv2.imwrite(result_nameL, chess_board_imageL)
    cv2.imwrite(result_nameR, chess_board_imageR)

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

## prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*9,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)

objpointsL=[]
objpointsR=[]
imgpointsL=[]
imgpointsR=[]  


for i in range(len(chess_imagesL)):
# Read in the image
chess_board_imageL = mpimg.imread(chess_imagesL[i])
chess_board_imageR = mpimg.imread(chess_imagesR[i])

ret, cornersL = cv2.findChessboardCorners(chess_board_imageL, (nx, ny), 
None)
ret2, cornersR = cv2.findChessboardCorners(chess_board_imageR, (nx, ny), 
None)
# If found, draw corners
if ret == True:
    objpointsL.append(objp)
    objpointsR.append(objp)

    corners2L = cv2.cornerSubPix(gray,cornersL,(11,11),(-1,-1),criteria)
    corners2R = cv2.cornerSubPix(gray,cornersR,(11,11),(-1,-1),criteria)

    imgpointsL.append(corners2L)
    imgpointsR.append(corners2R)



    cv2.drawChessboardCorners(chess_board_imageL, (nx, ny), corners2L, ret)
    cv2.drawChessboardCorners(chess_board_imageR, (nx, ny), corners2R, ret2)
    result_nameL = 'boardL'+str(i)+'.png'
    result_nameR = 'boardR'+str(i)+'.png'
    cv2.imwrite(result_nameL, chess_board_imageL)
    cv2.imwrite(result_nameR, chess_board_imageR)

часть, которая создает проблемы

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpointsL, imgpointsL, 
gray.shape[::-1], None, None)
ret2, mtx2, dist2, rvecs2, tvecs2 = cv2.calibrateCamera(objpointsR, 
imgpointsR, gray2.shape[::-1], None, None)
R = []
T = []
E = []
F = []
flags = cv2.CALIB_FIX_INTRINSIC
ret, mtx, dist, mtx2, dist2, R, T, E, F = cv2.stereoCalibrate(objpointsL, 
imgpointsL ,imgpointsR, mtx, dist, mtx2, dist2, gray.shape[::-1], None, 
None, None, None,flags = flags,
criteria = (cv2.TERM_CRITERIA_EPS, 30, 1e-6))

ОБНОВИТЬ ошибку в cv2.solvePnP

используя код, который вы предложили, похоже, калибровка камеры работает. но у меня есть проблема на следующем шаге, стереокамера калибровки

Файл "C: /Users/gaetano/Desktop/sonido/CALIPROVA2.py", строка 157, в ret, R, T = cv2.solvePnP (objpointsL, imgpointsL, mtx, dist, R, T, 0,0)

TypeError: objectPoints не является ни пустым массивом, ни скалярным

R = []
T = []
E = []
F = []
flags = cv2.CALIB_FIX_INTRINSIC

ret, mtx, dist, mtx2, dist2, R, T, E, F = cv2.stereoCalibrate(objpointsL, 
imgpointsL ,imgpointsR, mtxL, distL, mtxR, distR,
grayL.shape[::-1], None, None, None, None,
flags = flags,
criteria = (cv2.TERM_CRITERIA_EPS, 30, 1e-6))



ret, R, T = cv2.solvePnP(objpointsL,imgpointsL,mtx,dist,R,T,0,0)
print(R)
print(T)

изменение размера

ошибка при изменении размера
SystemError: новый формат getargs, но аргумент не является кортежем

print(roi1)
print(roi2)
# crop the image
x, y, w, h = roi1
dst = dst[y:y + h, x:x + w]
#
dst2 = dst2[y:y + h, x:x + w]
dst = cv2.resize(dst, 0, dst, 2, 2, interpolation = cv2.INTER_LINEAR)

1 Ответ

0 голосов
/ 03 мая 2018

Итак, ошибка говорит:

ошибка: OpenCV (3.4.1) D: \ Постройте \ OpenCV \ OpenCV-3.4.1 \ Modules \ calib3d \ SRC \ calibration.cpp: 3384: ошибка: (-215) изображений> 0 в функции cv :: calibrateCamera

Это означает, что вы передаете пустые переменные списка как точки объекта или как точки изображения.

В вашем коде у вас есть:

objpoints=[]
imgpoints=[]

, которые затем используются только в строке:

#objpoints.append(objp)

и в строке:

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

Это означает, что оба пусты! внутри этих двух списков ничего нет, которые затем используются в функции. В следующей строке:

ret2, mtx2, dist2, rvecs2, tvecs2 = cv2.calibrateCamera(objpoints, imgpoints2, gray2.shape[::-1], None, None)

Здесь вы используете imgpoints2, который существует и имеет точку, но у него нет целей (потому что он закомментирован), и вы получите похожую ошибку.

Решение:

Вы должны решить, чего именно вы хотите достичь здесь. Если это 2 калибровки, то, возможно, функция, которая принимает кадр в качестве входного и выполняет весь процесс, будет лучше. Таким образом, вы уверены, что переменные названы правильно.

Если функция вам не подходит, то вы всегда можете сделать то же самое, что вы сделали для imgpoints2 до imgpoints, и переменную можно будет использовать. Кроме того, убедитесь, что objpoints.append(objp) не закомментировано, чтобы функция снова заработала.

Просто для полноты, вот что я имею в виду под функцией:

def getObjPoints():
  objp = np.zeros((6*7,3), np.float32)
  objp[:,:2]=np.mgrid[0:7,0:6].T.reshape(-1,2)
  return objp

def calibrateCamWithFrame( frame ):
  objpoints=[getObjPoints]
  imgpoints=[]
  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  ret, corners = cv2.findChessboardCorners(gray,(7,6),None)
  # if no corners where found return None
  if !ret:
    return None
  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
  corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
  imgpoints.append(corners)
  frameWithCorners=cv2.drawChessboardCorners(frame,(7,6), corners, ret)
  cv2.imshow('img',frameWithCorners)
  cv2.waitKey(500)
  return cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

Тогда со стороны вы просто позвоните:

ret, mtx, dist, rvecs, tvecs = calibrateCamWithFrame(frame)
ret2, mtx2, dist2, rvecs2, tvecs2 = calibrateCamWithFrame(frame2)

UPDATE

Так как вы хотели откалибровать 2 камеры и внесли соответствующие изменения в код, чтобы идентифицировать его, тогда решение состоит в том, чтобы прочитать изображение, найти углы и добавить данные в основной цикл. Что-то вроде:

nx = 9
ny = 6
imgpointsL = []
imgpointsR = []
objpointsL = []
objpointsR = []
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

for i in range(img_counter):
  grayR = cv2.imread('colorRight_' + str(i) + '.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE )
  grayL = cv2.imread('colorLeft_' + str(i) + '.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE )

  retR, cornersR = cv2.findChessboardCorners(grayR, (nx, ny), None)
  if retR:
     cornersR = cv2.cornerSubPix(gray, cornersR, (11,11), (-1,-1), criteria)
     imgpointsR.append(cornersR)
     objpointsR.append(objp)

  retL, cornersL = cv2.findChessboardCorners(grayL, (nx, ny), None)

  if retL:
     cornersL = cv2.cornerSubPix(gray, cornersL, (11,11), (-1,-1), criteria)
     imgpointsL.append(cornersR)
     objpointsL.append(objp)

И теперь вы можете откалибровать каждую камеру, обратите внимание, что я использую imgpoints и objpoints для каждой камеры ... Таким образом, вы уверены, что размеры совпадают, так как не обязательно, чтобы все изображения в одной камере правильно находили углы.

Затем вы можете откалибровать, убедившись, что у вас есть изображения:

  if len(imgpointsL) >0:
    retL, mtxL, distL, rvecsL, tvecsL = cv2.calibrateCamera(objpointsL, imgpointsL,grayL.shape[::-1], None, None)

  if len(imgpointsL) >0:
    retR, mtxR, distR, rvecsR, tvecsR = cv2.calibrateCamera(objpointsR, imgpointsR,grayR.shape[::-1], None, None)
...