我已经在这个主题上挖掘了将近一个星期,但还没有找到任何可靠的解决方案 . 有趣的是,没有人发布过关于如何使用OpenCV校准和校正立体相机以便计算深度的解决方案,从这里到那里(this用于校准和this用于校正,所发布的代码虽然没有完全集成)我已经拿出以下代码快照,但它没有纠正图像OK !!
import numpy as np
import cv2
import glob
# termination criteria
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)
# Arrays to store object points and image points from all the images.
objpoints = {} # 3d point in real world space
imgpoints = {} # 2d points in image plane.
# calibrate stereo
for side in ['left', 'right']:
counter = 0
images = glob.glob('images/%s*.jpg' %side)
objpoints[side] = [];
imgpoints[side] = [];
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Find the chess board corners
ret, corners = cv2.findChessboardCorners(gray, (9,6),None)
# If found, add object points, image points (after refining them)
if ret == True:
objpoints[side].append(objp)
cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints[side].append(corners)
counter += 1
assert counter == len(images), "missed chessboard!!"
stereocalib_criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 100, 1e-5)
stereocalib_flags = cv2.CALIB_FIX_ASPECT_RATIO | cv2.CALIB_ZERO_TANGENT_DIST | cv2.CALIB_SAME_FOCAL_LENGTH | cv2.CALIB_RATIONAL_MODEL | cv2.CALIB_FIX_K3 | cv2.CALIB_FIX_K4 | cv2.CALIB_FIX_K5
retval,cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F = cv2.stereoCalibrate(objpoints['left'], imgpoints['left'], imgpoints['right'], (640, 480), criteria = stereocalib_criteria, flags = stereocalib_flags)
rectify_scale = 0.1 # 0=full crop, 1=no crop
R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, (640, 480), R, T, alpha = rectify_scale)
left_maps = cv2.initUndistortRectifyMap(cameraMatrix1, distCoeffs1, R1, P1, (640, 480), cv2.CV_16SC2)
right_maps = cv2.initUndistortRectifyMap(cameraMatrix2, distCoeffs2, R2, P2, (640, 480), cv2.CV_16SC2)
# Assuming you have left01.jpg and right01.jpg that you want to rectify
lFrame = cv2.imread('images/left01.jpg')
rFrame = cv2.imread('images/right01.jpg')
left_img_remap = cv2.remap(lFrame, left_maps[0], left_maps[1], cv2.INTER_LANCZOS4)
right_img_remap = cv2.remap(rFrame, right_maps[0], right_maps[1], cv2.INTER_LANCZOS4)
for line in range(0, int(right_img_remap.shape[0] / 20)):
left_img_remap[line * 20, :] = (0, 0, 255)
right_img_remap[line * 20, :] = (0, 0, 255)
cv2.imshow('winname', np.hstack([left_img_remap, right_img_remap]))
cv2.waitKey(0)
exit(0)
以上输出是
如你所见,图像没有得到纠正!!
问题:
- 代码有什么问题?
1 回答
我找不到导致错误答案的错误是什么,但是为了它的 Value ,我找到了一个可以纠正的解决方案!
我遇到了StereoVision库并考虑到它的文档级别较低,我设法获取/写入以下快照,校准和纠正OK .
以下是我在问题中发布的相同图像的整改结果 .
虽然用于计算视差图需要调整其参数(工具由包提供)但它可以完成工作:)