Не могу создать Emgu.CV.Image из параметра Конструкторы растровых изображений - PullRequest
0 голосов
/ 07 февраля 2020

Согласно Emgu docs , я должен быть в состоянии создать EMgu.CV.Image из растрового изображения:

Image<Bgr, Byte> img = new Image<Bgr, Byte>(bmp); //where bmp is a Bitmap

Это, однако, не компилируется, параметр Bitmap в Image конструктор не принят.

Я просмотрел класс Image (T, K) и нашел следующий возможный конструктор:

/// <summary>Create an Image from unmanaged data.</summary>
/// <param name="width">The width of the image</param>
/// <param name="height">The height of the image</param>
/// <param name="stride">Size of aligned image row in bytes</param>
/// <param name="scan0">Pointer to aligned image data, <b>where each row should be 4-align</b> </param>
/// <remarks>The caller is responsible for allocating and freeing the block of memory specified by the scan0 parameter, however, the memory should not be released until the related Image is released. </remarks>

public Image(int width, int height, int stride, IntPtr scan0)
{
  this.MapDataToImage(width, height, stride, scan0);
}
// bitmap being a screenshot I painted earlier in code
BitmapData InputBitmapData0 = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);

IntPtr ptr0 = InputBitmapData0.Scan0;
int stride0 = InputBitmapData0.Stride;
byte[]  byteArray = new byte[InputBitmapData0.Stride * bitmap.Height];
Marshal.Copy(ptr0, byteArray, 0, byteArray.Length);

...
Image<Bgr, Byte> source = new Image<Bgr, Byte>(bitmap.Width, bitmap.Height,stride0, ptr0);
Image<Bgr, byte> template= new Image<Bgr, byte>(@"C:\debuggerIcon.jpg");
...

Он компилируется, но не может найти значок, который я ищу и передающий в виде строки пути к файлу. Если я передаю и шаблон, и исходные изображения в виде строк пути, программа компилирует и надежно находит значок.

Как я могу сделать рабочий Image<Bgr, byte> source из Bitmap? Я не хочу сохранять файл на диск только для чтения его в следующую секунду.

Редактировать: После сохранения source.Save("source.jpg"); изображений, которые я импортировал в программу, на диск и проверки их, я заметил, что изображение, которое я использовал в качестве источника, было обрезано с правой стороны , имел неправильные цвета и странные вертикальные линии, и проблема была не в моих настройках границ. Проблема заключалась в том, что я создал байтовый массив из изображения, которое получило RGB A , а не только RGB.

После того, как я изменил

Image<Bgr, byte> source = new Image<Bgr, byte>(bitmap.Width, bitmap.Height,stride0, ptr0);

на:

Image<Bgra, byte> source = new Image<Bgra, byte>(bitmap.Width, bitmap.Height,stride0, ptr0);

Работало. Я опубликую это как ответ через несколько дней, но я sh кто-то еще, кто использует Emgu, опубликует, что случилось с документацией, и если в последних версиях отсутствует конструктор.

...