Я сделал небольшое приложение, чтобы сшить несколько изображений с помощью OpenCV. Это в основном для измерения времени сшивания.
Вот функция загрузки фотографий, используя путь в текстовом файле:
void ReadPhotos(string sourceIN){
string sourcePhoto;
ifstream FileIN(sourceIN);
if (FileIN.is_open())
{
while (getline(FileIN, sourcePhoto)){
photos[photo_number] = imread(sourcePhoto, 1);
photo_number++;
}
}
else{
cout << "Can't find file" << endl;
}
cout << "Number of photos: " << photo_number << endl;
//Size size(480, 270);
for (int i = 0; i < photo_number; i++){
//resize(photos[i], photos[i], size);
ImagesVector.push_back(photos[i]);
}
}
Вот функция MakePanorama. Я реализовал здесь простой таймер для измерения времени сшивания изображений. Мне нужно знать, сколько времени нужно, чтобы сшить 2,3,4 .. изображения. Он содержит все функции класса openCV Stitcher:
void MakePanorama(vector< Mat > ImagesVector, string filename){
tp1 = std::chrono::high_resolution_clock::now();
Stitcher stitcher = Stitcher::createDefault(true);
stitcher.setWarper(new SphericalWarper()); // Rodzaj panoramy http://docs.opencv.org/master/d7/d1c/classcv_1_1WarperCreator.html
stitcher.setFeaturesFinder(new detail::SurfFeaturesFinder(900, 3, 4, 3, 4));
//stitcher.setFeaturesFinder(new detail::OrbFeaturesFinder(Size(3, 1), 1500, 1.3f, 5));
stitcher.setRegistrationResol(0.9);
stitcher.setSeamEstimationResol(0.9);
stitcher.setCompositingResol(1); // Rozdzielczosc zdjecia wyjsciowego
stitcher.setPanoConfidenceThresh(0.9);
stitcher.setWaveCorrection(true); // Korekcja obrazu - pionowa lub pozioma
stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ); // Korekcja obrazu - pionowa lub pozioma
stitcher.setFeaturesMatcher(new detail::BestOf2NearestMatcher(true, 0.3f));
stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());
Stitcher::Status status = Stitcher::ERR_NEED_MORE_IMGS;
try{
status = stitcher.stitch(ImagesVector, image);
}
catch (cv::Exception e){}
tp2 = std::chrono::high_resolution_clock::now();
cout << "Czas skladania panoramy: " << chrono::duration_cast<chrono::seconds>(tp2 - tp1).count() << " s" << endl;imwrite(filename, image);
ImagesVector.clear();
ImagesVector.empty();
image.release();
image.empty();
photo_number = 0;
}
И вот главное:
int main()
{
cout << "Starting program!" << endl;ReadPhotos("paths2.txt");
MakePanorama(ImagesVector, "22.jpg");
ReadPhotos("paths3.txt");
MakePanorama(ImagesVector, "33.jpg");
ReadPhotos("paths4.txt");
MakePanorama(ImagesVector, "44.jpg");system("pause");
waitKey(0);
return 0;
}
И вот странная вещь. Когда я вызываю ReadPhotos () и MakePanorama () только один раз за один прогон программы, он сшивает 2 изображения за 3 секунды, 3 изображения за 8 секунд и 4 изображения за 16 секунд.
Когда я вызываю ReadPhotos () и MakePanorama () 3 раза с 2, 3 и 4 фотографиями, чтобы сшить за один прогон программы, это занимает 3 секунды, 30 секунд и 130 секунд.
Итак, я вижу, что повторная программа дает намного лучшие времена. Это почему? Я чищу ImageVector. Что еще я должен сделать?
Спасибо за помощь:)
Задача ещё не решена.