Я использую 4 стационарных камеры. Камеры не перемещаются относительно друг друга. И я хочу сшить видеоизображения из них в одно видеоизображение в режиме реального времени.
Я использую этот класс OpenCV 2.4.10 и cv:stitcher
, например:
// use 4 video-cameras
cv::VideoCapture cap0(0), cap1(1), cap2(2), cap3(3);
bool try_use_gpu = true; // use GPU
cv::Stitcher stitcher = cv::Stitcher::createDefault(try_use_gpu);
stitcher.setWarper(new cv::CylindricalWarperGpu());
stitcher.setWaveCorrection(false);
stitcher.setSeamEstimationResol(0.001);
stitcher.setPanoConfidenceThresh(0.1);
//stitcher.setSeamFinder(new cv::detail::GraphCutSeamFinder(cv::detail::GraphCutSeamFinderBase::COST_COLOR_GRAD));
stitcher.setSeamFinder(new cv::detail::NoSeamFinder());
stitcher.setBlender(cv::detail::Blender::createDefault(cv::detail::Blender::NO, true));
//stitcher.setExposureCompensator(cv::detail::ExposureCompensator::createDefault(cv::detail::ExposureCompensator::NO));
stitcher.setExposureCompensator(new cv::detail::NoExposureCompensator());
std::vector<cv::Mat> images(4);
cap0 >> images[0];
cap1 >> images[1];
cap2 >> images[2];
cap3 >> images[3];
// call once!
cv::Stitcher::Status status = stitcher.estimateTransform(images);
while(true) {
// **lack of speed, even if I use old frames**
// std::vector<cv::Mat> images(4);
//cap0 >> images[0];
//cap1 >> images[1];
//cap2 >> images[2];
//cap3 >> images[3];
cv::Stitcher::Status status = stitcher.composePanorama(images, pano_result);
}
Я получаю только 10 FPS (кадр за секунды), но мне нужно 25 FPS. Как ускорить этот пример?
Когда я использую stitcher.setWarper(new cv::PlaneWarperGpu());
, тогда я получаю очень увеличенное изображение, мне это не нужно.
Мне нужно только - Переводы.
Например, я готов не использовать:
- Перспективное преобразование
- Операции масштабирования
- и может быть даже вращением
Как я могу это сделать? Или как я могу получить из cv::Stitcher stitcher
параметров x,y
переводов для каждого из изображений?
UPDATE - профилирование в MSVS 2013 в Windows 7 x64: