我正在校准我的相机,以消除图像失真。 为了实现这个目标,我正在使用 OpenCV 库的校准相机功能。 所以我用棋盘在真实引用系统中取点来提取点数。然后我用mm将这些点转换成真实的引用系。所以最后我得到两个点 vector :棋盘交叉点的 vector 和以毫米为单位的点 vector 。
最后我尝试使用 calibrateCamera 函数校准相机,以获得我的校准参数。 相机标定函数定义如下:
calibrateCamera(pointsmm,points,Size(640,480),cameraMatrix,distCoeffs,rvec,tvec );
其中 points 和 pointstmm 定义如下:
vector<vector<Point2f>> points;
vector<vector<Point3f>> pointsmm;
和cameraMatrix, distCoeff, rvec, tvec as
vector <float>
.
vector 点的获取方式如下:
vector <Point2f> temp;
bool found = findChessboardCorners(md1,Size(nx,ny),temp);
if (found){
//cornerSubPix( md1_g, temp, Size(11,11), Size(-1,-1), TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 )); //(peggiora)
points.push_back(temp);
vector<Point3f> temp2;
for( int i = 0; i < ny; i++ )
for( int j = 0; j < nx; j++ )
temp2.push_back(Point3f(float((2*j + i % 2)*squaresize), float(i*squaresize), 220));
pointsmm.push_back(temp2);
}
//nx and ny are the size of the image
cv::drawChessboardCorners(md1, Size(nx,ny), Mat(temp), found);
对我拥有的所有采集重复此操作,因此点和点的大小与采集的数量相对应。而 vector 中每个元素的大小对应于棋盘的预期大小。
我画的棋盘还可以,点数对应。此外,我检查了 pointsmm 和 points 具有相同的大小。
当我在执行中调用校准函数时,出现以下错误: BridgeLibrary.dll 中的“System.Runtime.InteropServices.SEHException”中未管理异常 外部组件引发的异常。 调试软件时,当我调用 calibrateCamera 函数时抛出异常。
我正在使用 CLI/C++ 将 wpf 与 C++ 连接起来。 我认为问题取决于我如何调用 calibrateCamera 函数。 我还尝试将 vector rvec 和 tvec 定义为 vector ,但它不起作用。 我正在使用 OpenCV 2.19 版。
最佳答案
你使用了正确的技巧..
我在我的项目中使用相同的方法为固定图案校准相机。
使用此链接获取更多帮助:
关于c++ - calibrateCamera opencv 功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25401628/