校准摄像机以确定内在参数 我一直在努力用C++实现OpenCV的正确校准。 下面是我的计算代码片段,如果您能指出我做错了什么,或者我如何改进它,我将不胜感激 // 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<< } //初始化和重置校准参数 void initcalibration() { //numBoards=0; NUMCORNERSOR=水平角; numCornersVer=垂直角; numSquares=水平角*垂直角; board_sz=尺寸(水平角、垂直角); frame_sz=大小(frameWidth,frameHeight); sqSizeInmm=sqSizemm;//25毫米 object_points.clear(); 图像_points.clear(); 角。清除(); finishedCalberation=假; } //过程框架 bool棋盘格框架(Mat图像,bool debug=false) { 向量obj; 灰度图像; CVT颜色(图像、灰度图像、颜色和灰度); 对于(int j=0;j

校准摄像机以确定内在参数 我一直在努力用C++实现OpenCV的正确校准。 下面是我的计算代码片段,如果您能指出我做错了什么,或者我如何改进它,我将不胜感激 // 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<< } //初始化和重置校准参数 void initcalibration() { //numBoards=0; NUMCORNERSOR=水平角; numCornersVer=垂直角; numSquares=水平角*垂直角; board_sz=尺寸(水平角、垂直角); frame_sz=大小(frameWidth,frameHeight); sqSizeInmm=sqSizemm;//25毫米 object_points.clear(); 图像_points.clear(); 角。清除(); finishedCalberation=假; } //过程框架 bool棋盘格框架(Mat图像,bool debug=false) { 向量obj; 灰度图像; CVT颜色(图像、灰度图像、颜色和灰度); 对于(int j=0;j,c++,opencv,camera-calibration,C++,Opencv,Camera Calibration,终于解决了这个问题。多亏了-@mika 因此,由于数据类型不匹配,我得到了垃圾值。Opencv需要双精度,而我对Mat参数使用浮点类型。这也是产生意外值的原因,例如内在.at(0,1)处的非零值 这实际上让我对我的实现产生了怀疑。但将其转换为双重修复也是如此。 虽然我不确定0的双值是如何被浮现到6.05179的,但是可能与OpenCV的隐藏实现有关。你有一个工作的Matlab脚本和C++代码,逻辑错误。你可以在调试器中运行这两个代码并比较这些值。@ ThomasSablik,这里有什么逻辑错误?

终于解决了这个问题。多亏了-@mika

因此,由于数据类型不匹配,我得到了垃圾值。Opencv需要双精度,而我对Mat参数使用浮点类型。这也是产生意外值的原因,例如内在.at(0,1)处的非零值

这实际上让我对我的实现产生了怀疑。但将其转换为双重修复也是如此。
虽然我不确定0的双值是如何被浮现到6.05179的,但是可能与OpenCV的隐藏实现有关。

你有一个工作的Matlab脚本和C++代码,逻辑错误。你可以在调试器中运行这两个代码并比较这些值。@ ThomasSablik,这里有什么逻辑错误?我不知道,但是你的调试器。告诉你。这是一个C++问题。我在看代码。你得到的是<代码>内在。AT(0,1)为非零,因为您在其中写入了非零。找到将值写入此变量的位置。尝试键入
double
而不是
float
。OpenCV对那些小矩阵和镜头畸变值使用双精度,但您将内存区域解释为浮点。@Mika您是生命救星。许多谢谢:)这不是类型转换。让我们举一个16位与8位无符号整数的类似例子。如果有3个16位的值,我们就说[2255,1]这是以位表示的:00000000000000 1000000000000 11111111 000000000000000000000 1,你将内存解释为8位整数,你将得到6个值:00000000000010 00000000 11111111 00000000 0000000,这是[0,2,0255,0,1],所以你将预期的3个值读取为[0,2,0](示例经过简化,不处理小端、大端等,这可能会引入额外的内容)正确。这很有意义。感谢您的详细解释。