c# - 无法访问 C# emgucv 中的 Image.Data 属性

我可以使用 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

然后下一行导致错误

为什么应该是 3d 数组的 currentFrame.Data 为空?如何访问 Bgr 图像的 Image.Data 属性?

我正在使用 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); }

在上面的代码中:行 (A) 抛出异常“对象引用未设置为对象的实例”。但添加代码后
image = image.Convert<Bgr, byte>();

Line(B) 运行平稳,没有任何异常。

有谁知道为什么会这样?

最佳答案

[虽然现在回答很晚,但我将其发布以供将来引用。]
最近我遇到了同样的问题。我无法访问 QueryFrame 返回的图像的像素值通过Data属性(property)。但是在应用任何操作(例如调整大小、转换)后,结果图像是可访问的。这背后的原因和解决方案非常简单。
Data QueryFrame 返回的图像的属性始终为空。它的图像数据存储在非托管内存中,因此无法通过 Data 访问属性(property)。要访问帧的像素值,您只需克隆它。

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];

关于c# - 无法访问 C# emgucv 中的 Image<Bgr, byte>.Data 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6532904/

相关文章:

image - 将 GDIPlus::Bitmap 转换为 cv::Mat(OpenCV C++ 接

docker - 为什么 Neo4J docker 身份验证不起作用

docker - 在 Windows 2019 服务器上运行 linux 容器时出错

memory - cvShowImage和Kinect SDK的内存问题:骨架查看器

opencv - 什么最适合您的视频跟踪?为什么?

opencv - 检测视频帧中的现实世界对象

opencv - createVideoWriter()openCV中fps的最佳值

image - 从输入图像获取RGB像素并在opencv中重建输出图像

opencv - 在opencv中读写图像

opencv - cvSetErrMode 不工作