image-processing - 通过基本矩阵校正未校准的相机

标签 image-processing opencv emgucv camera-calibration

我正在尝试使用 Emgu/OpenCV 校准 Kinect 相机和外部相机。 我被困住了,非常感谢任何帮助。

我选择通过基本矩阵(即对极几何)来做到这一点。 但结果并不如我所料。结果图像是黑色的,或者根本没有任何意义。 mapx 和 mapy 点通常都等于无穷大或 - 无穷大,或者都等于 0.00,很少有规则值。

这就是我尝试进行整改的方式:

1.) Find image points 从一组图像中获取两个图像点阵列(每个相机一个)。我已使用棋盘和 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 出版的《学习 OpenCV》一书有两章专门讨论这个特定主题。两者都大量使用 OpenCV 包含的例程 cvCalibrateCamera2() 和 cvStereoCalibrate();这些例程是对与您在此处编写的代码非常相似的代码的包装器,其额外好处是已由维护 OpenCV 库的人员进行了更彻底的调试。虽然它们很方便,但都需要相当多的预处理才能获得例程的必要输入。实际上可能有一个示例程序,在 OpenCV 发行版的示例目录深处的某个地方,它使用这些例程,并提供有关如何从棋盘图像到校准/内部矩阵的示例。如果您深入了解这些地方中的任何一个,我相信您会了解如何根据专家的建议实现您的目标。

关于image-processing - 通过基本矩阵校正未校准的相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10192552/

相关文章:

python - python中图像数组的居中

c++ - OPENCV:image_proc 中的 PCA 应用程序错误

c# - 无法在OpenCV中分配字节

python - cv2.blur 中的深色边框

c# - 写入时图像不更新..奇怪的事情发生了

c# - 用于人员检测的 Emgu 训练 SVM - C#

matlab - 找到合适的陷波滤波器以从图像中去除图案

java - 为什么同样宽高的图片尺寸不一样?

image - 为什么灰色图像(1 channel )比彩色图像(3 channel )小 1/3?

c++ - 无法在opencv中使用命令行解析器