use*_*511 5 opencv image-processing emgucv camera-calibration
我正在尝试使用Emgu/OpenCV校准Kinect摄像头和外部摄像头.我被困住了,我真的很感激任何帮助.
我选择通过基本矩阵,即极线几何来做到这一点.但结果并不像我预期的那样.结果图像是黑色的,或根本没有任何意义.Mapx和mapy点通常都等于无限或 - 无限,或者全部等于0.00,并且很少有常规值.
这就是我试图纠正的方法:
1.)查找图像点 从图像集中获得两个图像点阵列(每个摄像机一个).我用棋盘和FindChessboardCorners函数完成了这个.
2.) 找到基本矩阵
CvInvoke.cvFindFundamentalMat(points1Matrix, points2Matrix,
_fundamentalMatrix.Ptr, CV_FM.CV_FM_RANSAC,1.0, 0.99, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
我是否从整个图像集中传递所有收集的点,或者只是从两个图像中尝试纠正?
3.)查找单应矩阵
CvInvoke.cvStereoRectifyUncalibrated(points11Matrix, points21Matrix,
_fundamentalMatrix.Ptr, Size, h1.Ptr, h2.Ptr, threshold);
Run Code Online (Sandbox Code Playgroud)
4.)获取mapx和mapy
double scale = 0.02;
CvInvoke.cvInvert(_M1.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU);
CvInvoke.cvMul(_H1.Ptr, _M1.Ptr, _R1.Ptr,scale);
CvInvoke.cvMul(_iM.Ptr, _R1.Ptr, _R1.Ptr, scale);
CvInvoke.cvInvert(_M2.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU);
CvInvoke.cvMul(_H2.Ptr, _M2.Ptr, _R2.Ptr, scale);
CvInvoke.cvMul(_iM.Ptr, _R2.Ptr, _R2.Ptr, scale);
CvInvoke.cvInitUndistortRectifyMap(_M1.Ptr,_D1.Ptr, _R1.Ptr, _M1.Ptr,
mapxLeft.Ptr, mapyLeft.Ptr) ;
Run Code Online (Sandbox Code Playgroud)
我这里有问题...因为我没有使用校准图像,我的相机矩阵和失真系数是多少?如何从基本矩阵或单应矩阵中获取它?
5.)重新映射
CvInvoke.cvRemap(src.Ptr, destRight.Ptr, mapxRight, mapyRight,
(int)INTER.CV_INTER_LINEAR, new MCvScalar(255));
Run Code Online (Sandbox Code Playgroud)
这并没有带来好结果.如果有人能告诉我我做错了什么,我将不胜感激.
我有25对图像,棋盘图案大小为9x6.
O'Reilly 出版的《学习 OpenCV》一书有两个完整的章节专门讨论这个特定主题。两者都大量使用 OpenCV 包含的例程 cvCalibrateCamera2() 和 cvStereoCalibrate();这些例程是与您在此处编写的代码非常相似的代码的包装器,其额外好处是由维护 OpenCV 库的人员进行了更彻底的调试。虽然它们很方便,但都需要大量预处理才能实现例程的必要输入。事实上,在 OpenCV 发行版的示例目录深处可能有一个示例程序,它使用这些例程,其中包含有关如何从棋盘图像到校准/内在矩阵的示例。如果您深入研究这些地方,我相信您会看到如何根据专家的建议实现您的目标。
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |