1

OpenCV を使用していくつかの画像をステッチする小さなアプリケーションを作成しました。主に縫製時間の計測です。

txtファイルのパスを使用して写真をロードする関数は次のとおりです。

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 スティッチャー クラス関数が含まれています。

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;
}

そして、ここに奇妙なことがあります。プログラムの 1 回の実行で ReadPhotos() と MakePanorama() を 1 回だけ呼び出すと、3 秒で 2 つの画像、8 秒で 3 つの画像、16 秒で 4 つの画像がステッチされます。

ReadPhotos() と MakePanorama() を 2、3、4 枚の写真で 3 回呼び出して、プログラムの 1 回の実行でステッチすると、3 秒、30 秒、130 秒かかります。

したがって、プログラムを再実行すると、はるかに良い時間が得られることがわかります。何故ですか?ImageVector をクリーニングしています。他に何をすべきですか?

手伝ってくれてありがとう:)

4

0 に答える 0