Не удается получить доступ к свойству Image <Bgr, byte> .Data в C # emgucv. - PullRequest
0 голосов
/ 30 июня 2011

Я могу получить доступ к каждому пикселю серого изображения, используя Data[,,], но не могу сделать это для изображения Bgr.Я написал следующий код:

Image<Bgr, byte> currentFrame = capture.QueryFrame();
Image<Gray, byte> grayFrame = currentFrame.Convert<Gray, byte>();
Byte gray = grayFrame.Data[0, 10, 0];
Byte blue = currentFrame.Data[0, 10, 0];

, который выдает исключение: Object reference not set to an instance of an object.

Я проверил, добавив точку останова, и результат был такой:

currentFrame.Data is nul
grayFrame.Data has 3d array
gray has value 71

и затем следующая строка вызвала ошибку

Почему currentFrame.Data, который должен был быть трехмерным массивом, был нулевым?Как получить доступ к свойству Image.Data для изображения Bgr?

Я использую emgucv 2.2.1.Та же проблема возникла с версией 2.1.

Спасибо за любую помощь


То, что я нашел, довольно удивительно.

Image<Bgr, byte> currentFrame = capture.QueryFrame();
byte b;
try
{
   b = image.Data[0, 0, 0];            //Line (A)
}
catch (Exception ex)
{ MessageBox.Show("Before Convert : "+ex.Message); }         

image = image.Convert<Bgr, byte>();

try
{
   b = image.Data[0, 0, 0];           //Line (B)
}
catch (Exception ex)
{ MessageBox.Show("AfterConvert : "+ex.Message); }

В приведенном выше коде:А) выдает исключение «Рефензия объекта не установлена ​​для экземпляра объекта».Но после добавления кода

image = image.Convert<Bgr, byte>();

Линия (B) проходит без каких-либо исключений.

Кто-нибудь знает, почему это происходит?

Ответы [ 3 ]

3 голосов
/ 30 июня 2014

[Хотя уже очень поздно отвечать, я публикую это для дальнейшего использования.]
Недавно я столкнулся с той же проблемой.Мне не удалось получить доступ к пиксельным значениям изображения, возвращаемого свойством QueryFrame через Data.Но после применения любой операции (например, изменение размера, преобразование) результирующее изображение становится доступным.Причина этого и решения довольно проста.

Data свойство изображения, возвращаемого QueryFrame, всегда равно нулю.Данные его изображения хранятся в неуправляемой памяти, поэтому недоступны из-за свойства Data.Чтобы получить доступ к пиксельным значениям кадра, вам просто нужно его клонировать.

Image<Bgr, byte> currentFrame = capture.QueryFrame();
Image<Bgr, byte> frame = currentFrame.Clone();
// now access using Data property
byte b = frame.Data[0,0,0];
byte g = frame.Data[0,0,1];
byte r = frame.Data[0,0,2];
0 голосов
/ 27 февраля 2018

Привет, попробуйте добавить файл .xml в ваш ... / bin / Debug.Затем введите свой метод ProcesFrame: // haar is HaarCascade haar = new HaarCascade ("haarcascade_frontalface_default.xml");

0 голосов
/ 01 июля 2011

capture.QueryFrame () возвращает значение null, к которому вы пытаетесь получить доступ в последней строке. Я бы заглянул внутрь этого метода. Я предполагаю, что .Convert - это метод расширения, и этот метод проверяет наличие нуля и возвращает что-то, что не равно нулю.

...