精炼相机参数和计算错误 - OpenCV

9 c++ opencv

我一直试图改进我的相机参数,CvLevMarq但在阅读之后,它似乎导致了混合的结果 - 这正是我所经历的.我读到了替代品并且发现了EIGEN- 并且还发现了这个利用它的.

但是,上面的库似乎使用了不支持的拼接类,OpenCV可能需要我将其移植到OpenCV.

在继续这样做之前,这可能不是一件容易的事,我想我先问一下,看看是否有其他人有同样的问题?

我目前正在使用:

1.计算特征FASTFeatureDetector

Ptr<FeatureDetector> detector = new FastFeatureDetector(5,true);
detector->detect(firstGreyImage, features_global[firstImageIndex].keypoints); // Previous picture
detector->detect(secondGreyImage, features_global[secondImageIndex].keypoints); // New picture
Run Code Online (Sandbox Code Playgroud)

2.使用提取功能SIFTDescriptorExtractor

Ptr<SiftDescriptorExtractor> extractor = new SiftDescriptorExtractor();
extractor->compute(firstGreyImage, features_global[firstImageIndex].keypoints, features_global[firstImageIndex].descriptors); // Previous Picture
extractor->compute(secondGreyImage, features_global[secondImageIndex].keypoints, features_global[secondImageIndex].descriptors); // New Picture
Run Code Online (Sandbox Code Playgroud)

3.匹配功能BestOf2NearestMatcher

vector<MatchesInfo> pairwise_matches;
BestOf2NearestMatcher matcher(try_use_gpu, 0.50f);
matcher(features_global, pairwise_matches);
matcher.collectGarbage();
Run Code Online (Sandbox Code Playgroud)

4. CameraParams.R四元数从设备传递(稍微不准确导致问题)

5. CameraParams.Focal == 389.0f - 使用此值,389.0f是唯一一个水平匹配但不垂直匹配图像的值.

6. 捆绑调整(cvLevMarq,calcError&calcJacobian)

Ptr<BPRefiner> adjuster = new BPRefiner();
adjuster->setConfThresh(0.80f);
adjuster->setMaxIterations(5);
(*adjuster)(features,pairwise_matches,cameras);
Run Code Online (Sandbox Code Playgroud)

7. ExposureCompensator(GAIN)

8. OpenCVMultiBand Blender

到目前为止有效:

  • SeamFinder- 在某种程度上起作用,但这取决于cvLevMarq算法的结果.即如果算法关闭,seamFinder也将会关闭.

  • HomographyBasedEstimator工作得很漂亮.但是,由于它"依赖"这些功能,遗憾的是它不是我正在寻找的方法.

我不想依赖于这些特征,因为我已经有了矩阵,如果有一种方法可以"改进"当前矩阵 - 那么这就是目标结果.

结果到目前为止:

cvLevMarq "俄罗斯轮盘赌"6/10:

这就是我想要达到的10倍.但是4/10次,看起来就像这张照片下面的图片.

在此输入图像描述

只需重新运行算法,结果就会发生变化.4/10倍看起来像这样(或更糟):

cvLevMarq "俄罗斯轮盘赌"4/10:

在此输入图像描述

期望的结果:

我想用我所匹配的功能"优化"我的相机参数 - 希望图像完美对齐.而不是希望那cvLevMarq将为我做这项工作(它不会4/10次),还有另一种方法来确保图像对齐吗?

更新:

我试过这些版本:

OpenCV 3.1:使用CVLevMarq3.1就像玩俄罗斯轮盘赌一样.有时它可以完美地对齐它们,有时候它会将焦点估计为NAN,这会导致MultiBand Blender中的段错误(ROI = 0,0,1,1因为NAN)

OpenCV 2.4.9/2.4.13:CvLevMarq遗憾的是,与2.4.9或2.4.13一起使用会减去NAN问题.6/10倍它可以完美地对齐图像,但另外4次它完全关闭.

我的猜测/想法:

  • 使用OpenCV进行模板匹配.也许如果我模板匹配图像的末尾(即x = 0,y = 0,高度= image.height,宽度= 50).有什么想法吗?

  • 我发现这篇关于Levenberg Marquardt应用于Homography的有趣论文.这看起来像是可以解决我的问题的东西,因为该论文使用角点检测和诸如此类来检测图像中的特征.有什么想法吗?

  • 也许问题不在,CvLevMarq而是在BestOf2NearestMatcher?但是,我搜索了几天,我找不到另一种返回成对匹配传递给的方法BPRefiner.

  • Hough Line Transform检测第一张/第二张图像中的线条并使用它来对齐图像.有什么想法吗? - 有一件事可能是,如果图像没有任何线条怎么办?即空墙?

  • 也许我太过于苛求某些东西......或许我不是?基本上,我正在尝试对齐一组图像,这样我就可以对它们进行扭曲而不会相互重叠.如果没有意义,请发表评论:)

8月12日更新:

尝试各种组合后,到目前为止绝对是最好的CvLevMarq.唯一的问题是上图中显示的混合结果.如果有人有任何意见,我将永远感激不尽.

fir*_*ant 1

看来你的参数初始化有问题。我会首先使用线性估计器,即忽略噪声传感器,然后使用它作为非线性优化器的初始值。

一种快速方法是使用getaffinetransform,因为您大部分时间都在轮换。