我试图通过使用带有两个摄像头的 OpenCV 2.3.1 来确定两个对象之间的距离,但无法计算对象的 objectPoints(OCV 2.3.1、MSVC++、Windows 7)。我认为这是因为在计算视差之前没有对图像点进行校正。
一、我首先要做的事情
步骤 1. 单独校准每个相机
int numSquares = numCornersHor * numCornersVer;
Size board_sz = Size(numCornersHor, numCornersVer);
Mat cameraMatrix = Mat(3, 3, CV_32FC1);
Mat distCoeffs;
vector<Mat> rvecs, tvecs;
cameraMatrix.ptr<float>(0)[0] = 1;
cameraMatrix.ptr<float>(1)[1] = 1;
calibrateCamera(object_points,
image_points,
image.size(),
cameraMatrix, distCoeffs,
rvecs, tvecs);
步骤 2. 一起校准相机
int numCornersHor = 4;
int numCornersVer = 3;
const float squareSize = 1.75;
Size imageSize = Size(numCornersHor, numCornersVer);
int numSquares = numCornersHor * numCornersVer;
for(int i = 0; i < pairs; i++ )
{
for( int j = 0; j < imageSize.height; j++ )
{
for( int k = 0; k < imageSize.width; k++ )
{
objectPoints[i].push_back(Point3f(j*squareSize, k*squareSize, 0));
}
}
}
Mat R, T, E, F;
rms = 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_ASPECT_RATIO +
CV_CALIB_ZERO_TANGENT_DIST +
CV_CALIB_SAME_FOCAL_LENGTH +
CV_CALIB_RATIONAL_MODEL +
CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5
);
步骤 3. 创建整改数据
stereoRectify(
cameraMatrix[0], cameraMatrix[1],
distCoeffs[0], distCoeffs[1],
imageSize,
R, T,
RC1, RC2, //RC1: Rotation matrix Camera 1
PC1, PC2,
Q,
CALIB_ZERO_DISPARITY,
1,
imageSize);
二.我相信什么
目标:
我正在尝试对来自相机 1 的图像和来自相机 2 的图像中的一个对象的图像点进行反扭曲和校正(我执行此过程两次:一次是在粘土鸽子位于发射器上时,一次是在粘土鸽子解体前的一帧)
方法:
我相信我不需要先使用 initUn DistorifyMap 然后再使用 Remap,而可以只使用 un DistorPoints。我认为 unactorPoints 可以消除兴趣点的扭曲并对其进行纠正。
三.我接下来做什么
如果我的信念不正确,你可以忽略这一点。
undistortPoints(launcherC1, launcherC1Undistorted, cameraMatrixC1, distCoeffsC1, R1, P1);
undistortPoints(launcherC2, launcherC2Undistorted, cameraMatrixC2, distCoeffsC2, R2, P2);
undistortPoints(clayPigeonC1, clayPigeonC1Undistorted, cameraMatrix1, distCoeffs1, R1, P1);
undistortPoints(clayPigeonC2, clayPigeonC2Undistorted, cameraMatrix2, distCoeffs2, R2, P2);
unactorPoints(launcherC1、launcherC1Un Distored、...clayPigeonC2、clayPigeonC2Unactored)的输入和输出数组是 Point2f 对象的向量。
四.信念与现实之间的差异
运行所有 unactorPoints 函数后,
- launcherC1Undisorted.y 不等于 launcherC2Un Disorted.y
- clayPigeonC1Un Distorted.y 不等于clayPigeonC2Un Distorted.y。
它们的差异高达 30%。
五、问题
- Q1 除了不扭曲它们之外,unactorPoints 还可以纠正点吗?
- Q1.1_是的。校正后 y 的值是否应该相等?
- Q1.1.1_yes 你能从我包含的代码中看出我做错了什么,这样他们就不会这样做吗?
- Q1_no 如果 unactorPoints 没有纠正这些点,那么我该如何纠正它们?