У меня есть устройство, которое вращает объект и делает снимки части объекта через равные промежутки времени. В настоящее время у меня 30 фотографий. Чтобы сшить изображения в плоское изображение, я беру срез прямо из центра каждого изображения фиксированной ширины (от 50 до 75 пикселей). Я пытаюсь сшить эти кусочки вместе в плоское изображение исходного изображения, используя библиотеку EMGU CV Stitching с примером кода для сшивания, который поставляется с EMGU. Я тестирую от 5 до 10 срезов одновременно. Иногда я получаю сообщение об ошибке «Ошибка, нужно больше изображений». Когда я получаю результат, он выглядит ужасно со странными искривлениями. Мне не нужны пространственные корректировки. Я просто хочу сшить их линейно слева направо. Какие-нибудь идеи, используя EMGU или другое?
Вот несколько кусочков и результат:
![Result](https://i.stack.imgur.com/fpxB3.jpg)
Почему итоговое изображение отличается от высоты 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();
}
}
}
}