通过基本矩阵校正未校准的相机
我正在尝试使用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);
我是否通过了整套图像中的所有收集的点,还是仅从两幅图像中尝试纠正?
3.) 找到单应性矩阵
CvInvoke.cvStereoRectifyUncalibrated(points11Matrix, points21Matrix,
_fundamentalMatrix.Ptr, Size, h1.Ptr, h2.Ptr, threshold);
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) ;
我在这里有一个问题...因为我没有使用校准图像,我的相机矩阵和失真系数是什么? 我如何从基本矩阵或单应性矩阵中获得它?
5.)重新映射
CvInvoke.cvRemap(src.Ptr, destRight.Ptr, mapxRight, mapyRight,
(int)INTER.CV_INTER_LINEAR, new MCvScalar(255));
这并没有带来好的结果。 如果有人会告诉我我做错了什么,我将不胜感激。
我有25对图像,棋盘格大小9x6。
O'Reilly出版社出版的“Learning OpenCV”一书有两个专门讨论这个特定主题的章节。 都大量使用OpenCV包含的例程cvCalibrateCamera2()和cvStereoCalibrate(); 这些例程是代码封装器,与您在此处编写的代码很相似,还有维护OpenCV库的人员对其进行了更彻底的调试。 尽管它们很方便,但都需要相当多的预处理来实现对例程的必要输入。 实际上,OpenCV发行版的示例目录中可能有一个示例程序,它使用这些例程,并提供了有关如何从棋盘图像到校准/内在矩阵的示例。 如果您深入了解这些地方,我相信您会在专家的建议下看到如何实现您的目标。
如果图像点的内部参数是单位矩阵,cv :: findFundamentalMat无法工作,换句话说,它不能用于未投影的图像点
链接地址: http://www.djcxy.com/p/30619.html上一篇: Rectification of uncalibrated cameras, via fundamental matrix