在C#中使用emgu.cv进行线性图像拼接

时间:2018-09-05 21:25:07

标签: c# image-processing emgucv

我有一个设备,可以旋转对象并以固定的间隔拍摄对象的一部分的图片。目前,我有30张图片。要将图像拼接成平面图像,我从固定宽度(在50到75像素之间)的每张图片的中心切出一片。我正在尝试使用EMGU CV缝合库以及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();
                    }
                }
            }
        }

0 个答案:

没有答案