我正在使用OpenCV Stitcher类进行拼接图像任务。输入图像是许多高分辨率图像的列表。有专用的摄像头,因此每个捕获的图像将采用固定和稳定的重叠区域和光亮度。 (抱歉这种不便,因为我没有足够的声誉来发布图片,你可以在这里看到幻觉https://lh6.googleusercontent.com/-cGcORHtZwro/VMhdiMjBuqI/AAAAAAAABqI/htHNorsUUoI/s574/snapshot1.png)。
我决定使用ROIS参数加速拼接过程(在本例中我假设重叠区域为40%)
vector<Rect> roi1, roi2;
vector<vector<Rect> > rois;
for (int i = 1; i < argc - 1; i++) {
Mat tmp = imread(argv[i]);
vImg.push_back(tmp);
if (i == 1) {
Rect newSize(0, 0, tmp.cols * 2 / 5, tmp.rows);
roi1.push_back(newSize);
rois.push_back(roi1);
roi1.clear();
} else if (i == argc - 2) {
Rect newSize(tmp.cols * 3 / 5, 0, tmp.cols * 2 / 5, tmp.rows);
roi2.push_back(newSize);
rois.push_back(roi2);
roi2.clear();
} else {
Rect newSize(0, 0, tmp.cols * 2 / 5, tmp.rows);
roi1.push_back(newSize);
newSize = cvRect(tmp.cols * 3 / 5, 0, tmp.cols * 2 / 5, tmp.rows);
roi1.push_back(newSize);
rois.push_back(roi1);
roi1.clear();
}
}
使用分辨率1296x1936缝合17张图像需要78秒。我在OpenCV文档和论坛上搜索过。我发现这些功能会影响拼接速度和输出质量:
stitcher.setWarper();
stitcher.setFeaturesFinder();
stitcher.setRegistrationResol();
stitcher.setSeamEstimationResol();
stitcher.setCompositingResol();
stitcher.setPanoConfidenceThresh();
stitcher.setSeamFinder();
stitcher.setBlender();
stitcher.setExposureCompensator();
stitcher.setWaveCorrection(true);
stitcher.setWaveCorrectKind();
stitcher.setFeaturesMatcher());
stitcher.setBundleAdjuster();
现在我的代码是(当然我已经从某个地方复制并进行了一些修改):
stitcher.setFeaturesFinder(new detail::SurfFeaturesFinder(400, 3, 4, 3, 4));
stitcher.setRegistrationResol(0.3);
stitcher.setSeamEstimationResol(0.1);
stitcher.setCompositingResol(0.6);
stitcher.setPanoConfidenceThresh(1);
stitcher.setSeamFinder(new detail::GraphCutSeamFinder(detail::GraphCutSeamFinderBase::COST_COLOR));
stitcher.setBlender(detail::Blender::createDefault(detail::Blender::MULTI_BAND, false));
stitcher.setExposureCompensator(detail::ExposureCompensator::createDefault(detail::ExposureCompensator::GAIN_BLOCKS) );
stitcher.setWaveCorrection(true);
stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);
stitcher.setFeaturesMatcher(
new detail::BestOf2NearestMatcher(false, 0.3, 6, 6));
stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());
但是,其中一些功能文档没有详细解释,例如setRegistrationResol(),setSeamEstimationResol(),setCompositingResol()。
我不确定哪个实际上适合上面的具体输入。
有什么建议吗?
非常感谢你。