OpenCV Mat 对象 - 获取数据长度

Posted

技术标签:

【中文标题】OpenCV Mat 对象 - 获取数据长度【英文标题】:OpenCV Mat object - get data length 【发布时间】:2014-04-03 21:57:29 【问题描述】:

在 OpenCV 中,我可以使用 C++ 中的 VideoCapture 捕获帧,但是,当我尝试从帧中获取数据并计算长度时,它只返回 0。

下面是我的示例代码:

VideoCapture cap(0);
for(;;) 
  Mat frame;
  cap >> frame;
  int length = strlen((char*) frame.data); // returns 0

正如我上面提到的,如果我将帧保存在 PNG 文件中,我实际上可以看到图像,所以我无法理解为什么数据长度为零。

有什么线索吗?

【问题讨论】:

Size of Matrix OpenCV 的可能重复项 但是如何根据行和列信息计算缓冲区的长度?而且,上面的代码应该也可以工作吧? 自从我完成 OpenCV 以来已经有一段时间了,但是 strlen 正在寻找一个空字符。你确定frame.data 不是以'\0'0 开头的吗?我不确定这是告诉缓冲区大小的有效方法。 【参考方案1】:

你也可以这样做:

Mat mat;
int len = mat.total() * mat.elemSize(); // or mat.elemSize1()

【讨论】:

这是首选答案【参考方案2】:

strlen 方法只适用于字符串,它是由特殊字符终止的字符数组:

http://www.cplusplus.com/reference/cstring/strlen/

您已将Mat 类型转换为char*,因此它不是字符串。

基于解决方案here,尝试:

Mat mat;
int rows = mat.rows;
int cols = mat.cols;
int num_el = rows*cols;
int len = num_el*mat.elemSize1();

获取一个通道的大小(以字节为单位)。此外,如果您想要所有通道,请使用 elemSize()(即,如果 Mat 是 3 通道图像,您将获得 3 倍于 elemSize1() 的值)。

查看这里讨论Mat 可以包含的各种类型:

http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-type

【讨论】:

以上是关于OpenCV Mat 对象 - 获取数据长度的主要内容,如果未能解决你的问题,请参考以下文章

opencv::Mat,从原始数据中获取像素值?

opencv:Mat对象

如何在 Android Opencv c++ 中获取 abs Mat?

Android将字节数组从Camera API转换为颜色Mat对象openCV

如何在 OpenCV 2 中从图像中获取通道数?

OpenCV基于字节指针进行高效像素遍历