【发布时间】:2020-07-21 23:09:51
【问题描述】:
我一直在努力使用带有 c++ 的 openCV 完成正确的校准。 下面我已经包含了我的代码 sn-p 用于它的计算,如果你能指出我做错了什么,或者我可以如何改进它,将不胜感激。
// Initialize and reset calibration params
void InitCaliberation()
{
//numBoards = 0;
numCornersHor = horizontalCorners;
numCornersVer = verticalCorners;
numSquares = horizontalCorners * verticalCorners;
board_sz = Size(horizontalCorners, verticalCorners);
frame_sz = Size(frameWidth, frameHeight);
sqSizeInmm = sqSizemm; //25 mm
object_points.clear();
image_points.clear();
corners.clear();
finishedCalberation = false;
}
//Process frames
bool CheckCheckerboardFrame(Mat image, bool debug=false)
{
vector<Point3f> obj;
Mat grayImage;
cvtColor(image, grayImage, COLOR_BGR2GRAY);
for (int j = 0; j < numSquares; j++)
obj.push_back(Point3f(sqSizeInmm * j / numCornersHor, sqSizeInmm * j%numCornersHor, 0.0f));
bool found = findChessboardCorners(grayImage, board_sz, corners, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_FILTER_QUADS);
if (found)
{
//sub-pixel accurate location
cornerSubPix(grayImage, corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::MAX_ITER | TermCriteria::EPS, 30, 0.1));
if(debug)
drawChessboardCorners(image, board_sz, corners, found);
else {
image_points.push_back(corners);
object_points.push_back(obj);
}
}
return found;
}
// Calculate params
void FinishCaliberation()
{
calibrateCamera(object_points, image_points, frame_sz, intrinsic, distCoeffs, R, T);
finishedCalberation = true;
cout <<"\nIntrinsic: "<< intrinsic.size<<endl;
for (int i = 0; i < intrinsic.rows; i++)
{
for (int j = 0; j < intrinsic.cols; j++)
cout << intrinsic.at<float>(i, j) << " ";
cout << endl;
}
cout << "\nDist coeff: " << distCoeffs.size << endl;
for (int i = 0; i < distCoeffs.rows; i++)
{
for (int j = 0; j < distCoeffs.cols; j++)
cout << distCoeffs.at<float>(i, j) << " ";
cout << endl;
}
//cout<<
}
以下是我使用 openCV 得到的输出。
这是预期的输出。我已经从 matlab 计算了这个校准。
我不想匹配结果!但想了解为什么 Fy 和 Cx 值为 0,以及为什么 intrinsic.at(0,1) 非零?我在这里做错了什么?
这是校准过程的最小代码:http://collabedit.com/3vay2 如果有人感兴趣的话。
【问题讨论】:
-
您的 matlab 脚本和 C++ 代码存在逻辑错误。您可以在调试器中运行这两个代码并比较值。
-
@ThomasSablik 这里的逻辑错误是什么?
-
我不知道,但你的调试器会告诉你。这是一个 C++ 问题。我在看代码。您将
intrinsic.at<float>(0,1)设为非零,因为您在其中写入了非零。找到您将值写入此变量的位置。 -
尝试输入
double而不是float。 OpenCV 对那些小矩阵和镜头畸变值使用双精度,但您将内存区域解释为浮点数。 -
@Micka 你是生命的救星。非常感谢:)
标签: c++ opencv camera-calibration