相关文章推荐
傻傻的铁链  ·  Caching - Improve ...·  1 年前    · 
任性的砖头  ·  How to create a ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I have a device that rotates an object and takes a picture of a portion of the object at regular intervals. Currently, I have 30 pictures. To stitch the images into a flat image, I am taking a slice right out of the center of each picture of a fixed width (between 50 and 75 pixels). I am trying to stitch these slices together into a flat image of the original picture using the EMGU CV Stitching library with the sample stitching code that comes with EMGU. I am testing with between 5 and 10 slices at a time. Sometimes, I am getting an error that says "Error, need more images". When I do get a result, it looks terrible with weird curvatures. I don't need any spatial adjustments. I just want to stitch them in a linear fashion from left to right. Any ideas, either using EMGU or other?

Here are a few slices and the result:

Why is the resulting image not the same height as the 4 slices? What must be done just to stitch these together in a linear fashion so that the text is continuous?

Here is the code I am using:

  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;
                    //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);
                                    MessageBox.Show(this, String.Format("Stiching Error: {0}", stitchStatus));
                                    resultImageBox.Image = null;
                finally
                    foreach (Image<Bgr, Byte> img in sourceImages)
                        img.Dispose();
                Not sure why you are using a feature-finder as this link shows Stitcher is able to do its job without any feature-finder.
– user366312
                Sep 6, 2018 at 5:58
                Removing the feature-finder actually greatly improved the result, at least with the 4 slices added to the question.  I am going to see what happens when I use more and more slices.
– Richard Martin
                Sep 6, 2018 at 12:46
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.