gpt4 book ai didi

opencv - OpenCV 的 undistortPoints 是否也可以纠正它们?

转载 作者:太空宇宙 更新时间:2023-11-03 21:54:55 29 4
gpt4 key购买 nike

我试图通过使用带有两个摄像头的 OpenCV 2.3.1 来确定两个对象之间的距离,但无法计算对象的对象点(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
);

第三步.创建整改数据

  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 的图像中的一个物体的图像点进行不失真和校正(我做了两次这个过程:一次是在飞碟在发射器上时,一次是在飞碟解体之前的一帧)

方法:我相信我不需要先使用 initUndistortRectifyMap 然后再映射,而是可以只使用 undistortPoints。我认为 undistortPoints 不扭曲兴趣点并纠正它们。

III.我接下来做什么

如果我的信念不正确,您可以忽略这一点。

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);

undistortPoints (launcherC1, launcherC1Undistorted, ... clayPigeonC2, clayPigeonC2Undistorted) 的输入和输出数组是 Point2f 对象的向量。

IV.信仰与现实之间的差异

运行完所有undistortPoints函数后,

  1. launcherC1Undisorted.y 不等于 launcherC2Undistorted.y
  2. clayPigeonC1Undistorted.y 不等于 clayPigeonC2Undistorted.y。

它们的差异高达 30%。

V.问题

  1. Q1 除了去扭曲它们之外,undistortPoints 是否也校正点?
  2. Q1.1_是的。 y 的值在校正后是否应该相等?
  3. Q1.1.1_yes 您能否从代码中看出我包含了我做错的地方以致于他们没有包含?
  4. Q1_no 如果 undistortPoints 没有纠正这些点,那么我该如何纠正它们?

最佳答案

  1. undistortPoints 无法校正点,因为您从未给它校正所需的参数 - 即相机与其他相机的位姿关系。
  2. 当你以正确的方式进行校正时,stereoCalibrate + initUndistortRectifyMap + remap,然后是 - 对应点的 y 值将相同.

关于opencv - OpenCV 的 undistortPoints 是否也可以纠正它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10449588/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com