立体相机校准错误
stereo camera calibration error
我正在尝试对 2 个 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 不是 numpy 数组,也不是标量
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)
所以错误说:
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
这意味着您将空列表变量作为对象点或图像点传递。
在你的代码中你有:
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
,它存在并且有点,但是它没有objpoints(因为它被注释掉了),你会得到类似的错误。
解决方案:
你必须决定你到底想在这里实现什么。如果它是 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)
更新
既然你想要标定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)
我正在尝试对 2 个 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 不是 numpy 数组,也不是标量
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)
所以错误说:
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
这意味着您将空列表变量作为对象点或图像点传递。
在你的代码中你有:
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
,它存在并且有点,但是它没有objpoints(因为它被注释掉了),你会得到类似的错误。
解决方案:
你必须决定你到底想在这里实现什么。如果它是 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)
更新
既然你想要标定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)