我有两个水平设置的相机(彼此靠近)。我离开了摄像机cam1和右摄像机cam2。
首先我校准相机(我想校准50对图像):
我的问题:
我的代码:
Mat cameraMatrix[2], distCoeffs[2];
distCoeffs[0] = Mat(4, 1, CV_64F);
distCoeffs[1] = Mat(4, 1, CV_64F);
vector<Mat> rvec1, rvec2, tvec1, tvec2;
double rms1 = cv::calibrateCamera(objectPoints, imagePoints[0], imageSize, cameraMatrix[0], distCoeffs[0],rvec1, tvec1, CALIB_FIX_K3, TermCriteria(
TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON));
double rms2 = cv::calibrateCamera(objectPoints, imagePoints[1], imageSize, cameraMatrix[1], distCoeffs[1],rvec2, tvec2, CALIB_FIX_K3, TermCriteria(
TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON));
qDebug()<<"Rms1: "<<rms1;
qDebug()<<"Rms2: "<<rms2;
Mat R, T, E, F;
double rms = cv::stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imageSize, R, T, E, F,
TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
CV_CALIB_FIX_INTRINSIC+
CV_CALIB_SAME_FOCAL_LENGTH);
答案 0 :(得分:0)
我有类似的问题。我的问题是我正在阅读左图像和右图像,假设两者都已分类。这是Python中代码的一部分 我通过在第二行使用“已排序”来修复。
images = glob.glob(path_left)
for fname in sorted(images):
img = cv2.imread(fname)
gray1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Find the chess board corners
ret, corners1 = cv2.findChessboardCorners(gray1, (n, m), None)
# If found, add object points, image points (after refining them)
if ret == True:
i = i + 1
print("Cam1. Chess pattern was detected")
objpoints1.append(objp)
cv2.cornerSubPix(gray1, corners1, (5, 5), (-1, -1), criteria)
imgpoints1.append(corners1)
cv2.drawChessboardCorners(img, (n, m), corners1, ret)
cv2.imshow('img', img)
cv2.waitKey(100)
答案 1 :(得分:0)
唯一重要的原因是摄像机/图像集的顺序是从stereoCalibrate
函数获得的旋转和平移。首先放入函数中的图像集将作为基础。因此,您得到的旋转和平移就是第二台摄像机如何从第一台摄像机平移和旋转。当然,您可以反转结果,这与切换图像集相同。当然,只有两组中的图像相互对应(它们的顺序)时,这种情况才会成立。
这有点棘手,但是有几个原因导致您收到此大RMS错误。
findChessboardCorners
应该返回false,因为它不会检测到棋盘。因此,您可以自动(=在线)忽略这些“简单的”图像。当然,即使那个摄像机是有效的,您也必须丢弃第二台摄像机的图像,以保持两组正确的顺序。如果您想要强大的在线版本,恐怕您将获得第二种选择,因为它可以帮助您消除模糊的图像,由于光照条件而导致的错误检测等。您只需要仔细设置阈值(您将剪切多少张图像作为离群值),以免丢弃有效数据。
在该领域我不确定,但是我想说您可以计算出其中的5个并仅使用4个coz,就好像您切断了泰勒级数的更高阶。但是我不能保证这是真的。