линейное сшивание изображений с помощью emgu.cv в c # - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть устройство, которое вращает объект и делает снимки части объекта через равные промежутки времени. В настоящее время у меня 30 фотографий. Чтобы сшить изображения в плоское изображение, я беру срез прямо из центра каждого изображения фиксированной ширины (от 50 до 75 пикселей). Я пытаюсь сшить эти кусочки вместе в плоское изображение исходного изображения, используя библиотеку EMGU CV Stitching с примером кода для сшивания, который поставляется с EMGU. Я тестирую от 5 до 10 срезов одновременно. Иногда я получаю сообщение об ошибке «Ошибка, нужно больше изображений». Когда я получаю результат, он выглядит ужасно со странными искривлениями. Мне не нужны пространственные корректировки. Я просто хочу сшить их линейно слева направо. Какие-нибудь идеи, используя EMGU или другое?

Вот несколько кусочков и результат:

Slice 1 Slice 2 Slice 3 Slice 4 Result

Почему итоговое изображение отличается от высоты 4 фрагментов? Что нужно сделать, чтобы соединить их линейно, чтобы текст был непрерывным?

Вот код, который я использую:

  private void selectImagesButton_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.CheckFileExists = true;
            dlg.Multiselect = true;

            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                sourceImageDataGridView.Rows.Clear();

                Image<Bgr, byte>[] sourceImages = new Image<Bgr, byte>[dlg.FileNames.Length];

                for (int i = 0; i < sourceImages.Length; i++)
                {
                    sourceImages[i] = new Image<Bgr, byte>(dlg.FileNames[i]);

                    using (Image<Bgr, byte> thumbnail = sourceImages[i].Resize(200, 200, Emgu.CV.CvEnum.Inter.Cubic, true))
                    {
                        DataGridViewRow row = sourceImageDataGridView.Rows[sourceImageDataGridView.Rows.Add()];
                        row.Cells["FileNameColumn"].Value = dlg.FileNames[i];
                        row.Cells["ThumbnailColumn"].Value = thumbnail.ToBitmap();
                        row.Height = 200;
                    }
                }
                try
                {
                    //only use GPU if you have build the native binary from code and enabled "NON_FREE"
                    using (Stitcher stitcher = new Stitcher(false))
                    {

                        using (AKAZEFeaturesFinder finder = new AKAZEFeaturesFinder())
                        {

                            stitcher.SetFeaturesFinder(finder);
                            using (VectorOfMat vm = new VectorOfMat())
                            {
                                Mat result = new Mat();
                                vm.Push(sourceImages);

                                Stopwatch watch = Stopwatch.StartNew();

                                this.Text = "Stitching";
                                Stitcher.Status stitchStatus = stitcher.Stitch(vm, result);
                                watch.Stop();

                                if (stitchStatus == Stitcher.Status.Ok)
                                {
                                    resultImageBox.Image = result;
                                    this.Text = String.Format("Stitched in {0} milliseconds.", watch.ElapsedMilliseconds);
                                }
                                else
                                {
                                    MessageBox.Show(this, String.Format("Stiching Error: {0}", stitchStatus));
                                    resultImageBox.Image = null;
                                }
                            }
                        }
                    }

                }
                finally
                {
                    foreach (Image<Bgr, Byte> img in sourceImages)
                    {
                        img.Dispose();
                    }
                }
            }
        }
...