OpenCV — сшивание изображений из сетки изображений

Я нашел несколько основных рабочих примеров сшивания через OpenCV для панорамных изображений. Я также нашел полезную документацию в API документы, но я не могу узнать, как ускорить обработку, предоставив дополнительную информацию.

В моем случае я генерирую набор изображений в сетке 20х20 отдельных кадров, чтобы в общей сложности 400 изображений были сшиты в один большой. На современном ПК это занимает огромное количество времени, поэтому, скорее всего, на плате разработчика это займет несколько часов.

Есть ли способ сообщить экземпляру OpenCV информацию об изображениях, например, если я заранее знаю относительное расположение всех изображений, как они будут отображаться в сетке? Единственные вызовы API, которые я вижу до сих пор, это просто без разбора добавлять все изображения в очередь через vImg.push_back(),


Рекомендации

  1. Строчка. Сшивание изображений — Документация по OpenCV API, По состоянию на 2014-02-26, <http://docs.opencv.org/modules/stitching/doc/stitching.html>
  2. Пример сшивания OpenCV (класс Stitcher, Panorama), По состоянию на 2014-02-26, <http://feelmare.blogspot.ca/2013/11/opencv-stitching-example-stitcher-class.html>
  3. Панорама — сшивание изображений в OpenCV, По состоянию на 2014-02-26, <http://ramsrigoutham.com/2012/11/22/panorama-image-stitching-in-opencv/>

18

Решение

Насколько я знаю, нет никаких средств для предоставления дополнительных данных движку OpenCV, кроме простого предоставления ему списка изображений. Это делает довольно хорошую работу самостоятельно. Я хотел бы проверить некоторые примеры кода и проверить, сколько времени занимает каждая операция сшивания. Из моих экспериментов с использованием панорамных реконструкций 4×6, 4×8, …, 4×20 требуемое время ЦП, похоже, увеличивается с увеличением количества перекрывающихся изображений. Я полагаю, что ваш случай потребует, по крайней мере, минуты, чтобы вычислить на современной машине.

Источник:
https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/cpp/stitching.cpp?rev=6682

1   /*M///////////////////////////////////////////////////////////////////////////////////////
2   //
3   //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4   //
5   //  By downloading, copying, installing or using the software you agree to this license.
6   //  If you do not agree to this license, do not download, install,
7   //  copy or use the software.
8   //
9   //
10  //                          License Agreement
11  //                For Open Source Computer Vision Library
12  //
13  // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14  // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15  // Third party copyrights are property of their respective owners.
16  //
17  // Redistribution and use in source and binary forms, with or without modification,
18  // are permitted provided that the following conditions are met:
19  //
20  //   * Redistribution's of source code must retain the above copyright notice,
21  //     this list of conditions and the following disclaimer.
22  //
23  //   * Redistribution's in binary form must reproduce the above copyright notice,
24  //     this list of conditions and the following disclaimer in the documentation
25  //     and/or other materials provided with the distribution.
26  //
27  //   * The name of the copyright holders may not be used to endorse or promote products
28  //     derived from this software without specific prior written permission.
29  //
30  // This software is provided by the copyright holders and contributors "as is" and
31  // any express or implied warranties, including, but not limited to, the implied
32  // warranties of merchantability and fitness for a particular purpose are disclaimed.
33  // In no event shall the Intel Corporation or contributors be liable for any direct,
34  // indirect, incidental, special, exemplary, or consequential damages
35  // (including, but not limited to, procurement of substitute goods or services;
36  // loss of use, data, or profits; or business interruption) however caused
37  // and on any theory of liability, whether in contract, strict liability,
38  // or tort (including negligence or otherwise) arising in any way out of
39  // the use of this software, even if advised of the possibility of such damage.
40  //
41  //M*/
42
43  // We follow to these papers:
44  // 1) Construction of panoramic mosaics with global and local alignment.
45  //    Heung-Yeung Shum and Richard Szeliski. 2000.
46  // 2) Eliminating Ghosting and Exposure Artifacts in Image Mosaics.
47  //    Matthew Uyttendaele, Ashley Eden and Richard Szeliski. 2001.
48  // 3) Automatic Panoramic Image Stitching using Invariant Features.
49  //    Matthew Brown and David G. Lowe. 2007.
50
51  #include <iostream>
52  #include <fstream>
53  #include "opencv2/highgui/highgui.hpp"54  #include "opencv2/stitching/stitcher.hpp"55
56  using namespace std;
57  using namespace cv;
58
59  void printUsage()
60  {
61      cout <<
62          "Rotation model images stitcher.\n\n"63          "stitching img1 img2 [...imgN]\n\n"64          "Flags:\n"65          "  --try_use_gpu (yes|no)\n"66          "      Try to use GPU. The default value is 'no'. All default values\n"67          "      are for CPU mode.\n"68          "  --output <result_img>\n"69          "      The default is 'result.jpg'.\n";
70  }
71
72  bool try_use_gpu = false;
73  vector<Mat> imgs;
74  string result_name = "result.jpg";
75
76  int parseCmdArgs(int argc, char** argv)
77  {
78      if (argc == 1)
79      {
80          printUsage();
81          return -1;
82      }
83      for (int i = 1; i < argc; ++i)
84      {
85          if (string(argv[i]) == "--help" || string(argv[i]) == "/?")
86          {
87              printUsage();
88              return -1;
89          }
90          else if (string(argv[i]) == "--try_gpu")
91          {
92              if (string(argv[i + 1]) == "no")
93                  try_use_gpu = false;
94              else if (string(argv[i + 1]) == "yes")
95                  try_use_gpu = true;
96              else
97              {
98                  cout << "Bad --try_use_gpu flag value\n";
99                  return -1;
100             }
101             i++;
102         }
103         else if (string(argv[i]) == "--output")
104         {
105             result_name = argv[i + 1];
106             i++;
107         }
108         else
109         {
110             Mat img = imread(argv[i]);
111             if (img.empty())
112             {
113                 cout << "Can't read image '" << argv[i] << "'\n";
114                 return -1;
115             }
116             imgs.push_back(img);
117         }
118     }
119     return 0;
120 }
121
122
123 int main(int argc, char* argv[])
124 {
125     int retval = parseCmdArgs(argc, argv);
126     if (retval) return -1;
127
128     Mat pano;
129     Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
130     Stitcher::Status status = stitcher.stitch(imgs, pano);
131
132     if (status != Stitcher::OK)
133     {
134         cout << "Can't stitch images, error code = " << status << endl;
135         return -1;
136     }
137
138     imwrite(result_name, pano);
139     return 0;
140 }
141
142
7

Другие решения

Я немного поработал с конвейером сшивания, и хотя я не считаю себя экспертом в этой области, я получил лучшую производительность (и лучшие результаты), настраивая каждый шаг конвейера отдельно. Как вы можете видеть на рисунке, класс Stitching — это всего лишь оболочка этого конвейера: Обзор сшивания трубопровода

Некоторые интересные части, которые вы можете отрегулировать, — это шаги по изменению размера (наступает момент, когда большее разрешение просто означает больше времени вычислений и больше неточных функций), процесс согласования и (хотя это только предположение) предоставление хороших параметров камеры вместо выполнения предварительный расчет. Это включает получение параметров камеры перед прошивкой, но это не очень сложно. Здесь у вас есть некоторые ссылки: Калибровка камеры OpenCV и 3D реконструкция.

Опять же: я не эксперт, это просто основано на моем опыте стажера, проводившего некоторые эксперименты с библиотекой!

8

Рассмотрите возможность использования графического процессора в Opencv Stitcher:

bool try_use_gpu = true;
Stitcher myStitcher = Stitcher::createDefault(try_use_gpu);
Stitcher::Status status = myStitcher.stitch(Imgs, pano);
3

Может быть, это может помочь?
https://software.intel.com/en-us/articles/fast-panorama-stitching

В частности, часть о парном сопоставлении

Ронен

3

Если вы знаете относительные положения изображений, вы можете разбить проблему на подзадачи и, возможно, уменьшить вычислительную нагрузку, подойдя к ней со знанием подструктуры проблемы. По сути, разбейте набор изображений на группы из 4 смежных изображений, обработайте кадры, затем продолжайте обрабатывать полученные изображения, используя ту же идею, пока вы не достигнете своей панорамы. При этом, я только недавно начал играть с этим набором инструментов opencv. Я знаю, что это довольно простая идея, но она может быть полезна для кого-то.

1
По вопросам рекламы [email protected]