我一直在尝试使用CvLevMarq
来优化我的相机参数,但是在阅读了它之后,似乎导致了混合结果-这正是我所遇到的。我阅读了有关替代方案的内容,并了解了EIGEN
-也发现了利用它的this library。
但是,上面的库似乎使用了不支持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
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
3. 与
BestOf2NearestMatcher
匹配的功能vector<MatchesInfo> pairwise_matches;
BestOf2NearestMatcher matcher(try_use_gpu, 0.50f);
matcher(features_global, pairwise_matches);
matcher.collectGarbage();
4.从设备传递的
CameraParams.R
四元数(稍微不准确,这会导致问题)5.
CameraParams.Focal
== 389.0f-以此值播放,389.0f是唯一与水平但垂直不匹配图像的值。6. Bundle Adjustment(
cvLevMarq
,calcError
和calcJacobian
)Ptr<BPRefiner> adjuster = new BPRefiner();
adjuster->setConfThresh(0.80f);
adjuster->setMaxIterations(5);
(*adjuster)(features,pairwise_matches,cameras);
7.
ExposureCompensator
(GAIN)8. OpenCV
MultiBand Blender
到目前为止有效:
SeamFinder
-在某种程度上有效,但是取决于cvLevMarq
算法的结果。即如果算法关闭,那么seamFinder
也将关闭。 HomographyBasedEstimator
效果很好。但是,由于它“依赖”功能,因此很遗憾,它不是我要寻找的方法。 我不想依赖这些功能,因为我已经有了矩阵,如果有办法代替“优化”当前矩阵,那将是目标结果。
到目前为止的结果:
cvLevMarq
“俄罗斯轮盘” 6/10:这就是我想要达到10/10次的目标。但是4/10倍,看起来像这张照片下面的照片。
只需重新运行算法,结果就会改变。看起来是这样(或更糟)的4/10倍:
cvLevMarq
“俄罗斯轮盘” 4/10:所需结果:
我想使用匹配的功能来“优化”相机参数-希望图像能够完美对齐。除了希望
cvLevMarq
为我做这件事(它不会做4/10次),还有另一种方法来确保图像对齐吗?更新:
我试过这些版本:
OpenCV 3.1:在3.1中使用
CVLevMarq
就像玩俄罗斯轮盘一样。有时它可以使它们完美对齐,而有时它会将焦点估计为NAN,这会在MultiBand Blender中引起段错误(由于NAN
,ROI = 0,0,1,1)OpenCV 2.4.9/2.4.13:不幸的是,在2.4.9或2.4.13中使用
CvLevMarq
是减去NAN
问题的同一件事。它可以完美对齐图像的6/10倍,但是其他4倍完全关闭。我的推测/想法:
使用OpenCV的
CvLevMarq
中而不是BestOf2NearestMatcher
中?但是,我搜索了几天,找不到另一个返回成对匹配项并传递给BPRefiner
的方法。 8月12日更新:
在尝试了各种组合之后,到目前为止,绝对最好的是
CvLevMarq
。唯一的问题是上图所示的混合结果。如果有人有任何意见,我将永远感激不已。 最佳答案
看来您的参数初始化是问题所在。我会先使用线性估算器,即忽略您的噪声传感器,然后将其用作非线性优化器的初始值。
一种快速的方法是使用 getaffinetransform
,因为您大多数情况下会轮换使用。