EmguCV — Создать образ из неуправляемых данных

#c# #image #access-violation #emgucv

#c# #изображение #нарушение доступа #emgucv

Вопрос:

Я использую EmguCV, и у меня есть матрица в оттенках серого байтового типа размером 640×480, и каждый элемент матрицы равен либо 255, либо 0. Теперь мне нужно создать образ из этого. Лучший конструктор, который я нашел, выглядел так:

 Image<Gray,byte>(int width, int height, int stride, IntPtr scan0)
  

Я получил первый, второй и четвертый параметры из матрицы и отправил 640 для stride. Но это дает мне

 Access violation exception: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  

Я буду признателен за любую помощь.

Ответ №1:

Скорее всего, вы передали что-то неправильное в качестве указателя. Неправильный шаг приведет к искажению содержимого изображения. 640 было бы правильным значением в вашем случае (просто снова используйте width), поскольку шаг всегда представляет длину одной строки изображения в памяти (в вашем случае 640 байт). Я могу только догадываться, но не пытайтесь использовать _ptr указатель матрицы. Это может показаться логичным, но это будет указывать на весь объект matrix, а не только на данные (которые вы хотите). Не проверяя прямо сейчас, я скорее уверен, что вы можете использовать matrix copyTo() для копирования содержимого в изображение (если этого достаточно для вашего варианта использования).

Комментарии:

1. Спасибо, как вы, наверное, догадались, эта строка не является точной позицией исключения. Исключение возникает в следующих строках, в которых используется созданный образ. Функция CopyTo() матрицы принимает CvArray в качестве входных данных, но изображение содержит только элемент byte[]. У вас есть какие-нибудь идеи о том, как скопировать это в образ?

2. Я совершенно уверен, что изображение может быть использовано в качестве замены CvArray (iirc, оно является производным от него). Сейчас нет времени на тестирование.

3. Вау, это сработало. Вы даже не представляете, как я ценю вашу помощь.