使用OpenCV优化拼接图像

时间:2015-01-28 04:28:56

标签: opencv image-processing

我正在使用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()。

我不确定哪个实际上适合上面的具体输入。

有什么建议吗?

非常感谢你。

0 个答案:

没有答案