#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. Вау, это сработало. Вы даже не представляете, как я ценю вашу помощь.