将 CV_16SC2 Mat 保存到文件 OpenCV

Posted

技术标签:

【中文标题】将 CV_16SC2 Mat 保存到文件 OpenCV【英文标题】:Save CV_16SC2 Mat to a file OpenCV 【发布时间】:2011-09-13 09:06:47 【问题描述】:

我想将 CV_16SC2 矩阵保存到文件中。它是 initUndistortRectifyMap 的结果。我需要它以二进制形式,稍后我想从文件中读取它。最好的方法是什么(YAML,XML 因为需要空间而不好)?

【问题讨论】:

您可以通过遍历矩阵数据来编写自己的保存方法。 @Adrian 很难相信 openCV 不支持它... 也许这会对您有所帮助:opencv.willowgarage.com/documentation/cpp/… 但您必须将 2 个频道转换为 3 个。 试过了。问题是我有 2 通道 16 位图像,根据该文档,它不起作用。 Mat::convertTo 和 cvtColor 似乎不是 waz,因为我的垫子是 2 通道的。 【参考方案1】:

如果您不想使用XML/YMAL Input and Output 提供的方式。你必须自己写。

首先确保您的类型正确。使用cout << mat.type() 并查看下表。

        C1  C2  C3  C4
CV_8U   0   8   16  24
CV_8S   1   9   17  25
CV_16U  2   10  18  26
CV_16S  3   11  19  27
CV_32S  4   12  20  28
CV_32F  5   13  21  29
CV_64F  6   14  22  30

现在您知道了 Matrixelements 的通道数和正确类型(位数)。 例如编号mat.type() == 11 表示您的类型是:CV_16SC2,因此是 16 位(有符号短)和 2 通道。

如果您现在不了解位计数和变量名之间的关系,请检查以下内容:

Unsigned 8bits uchar 0~255
Mat: CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4

Signed 8bits char -128~127
Mat: CV_8SC1,CV_8SC2,CV_8SC3,CV_8SC4

Unsigned 16bits ushort 0~65535
Mat: CV_16UC1,CV_16UC2,CV_16UC3,CV_16UC4

Signed 16bits short -32768~32767
Mat: CV_16SC1,CV_16SC2,CV_16SC3,CV_16SC4

Signed 32bits int -2147483648~2147483647
Mat: CV_32SC1,CV_32SC2,CV_32SC3,CV_32SC4

Float 32bits float -1.18*10-38~3.40*10-38 
Mat: CV_32FC1,CV_32FC2,CV_32FC3,CV_32FC4

Double 64bits double 
Mat: CV_64FC1,CV_64FC2,CV_64FC3,CV_64FC4

要访问它们,您需要使用 at 和正确的 type!

在我们的 CV_16SC2(有符号短和 2 通道)示例中,这意味着:Vec2s

Vec 因为我们想要一个向量,2 因为有 2 个通道,s,因为我们想要一个签名短。

因此,要将位置 (5,7) 处的第二个通道的值放入变量 's',您可以这样写:

Vec2s v = mat.at<Vec2s>(5, 7);
short s = v[1];

由于您想保存矩阵,因此您可能需要先写入矩阵的大小(行、列、通道),然后再写入所有值。

感谢http://ninghang.blogspot.de/2012/11/list-of-mat-type-in-opencv.html提供信息让我终于明白了一切!

【讨论】:

以上是关于将 CV_16SC2 Mat 保存到文件 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

如何将 cv::Mat 类型从 CV_16UC1 转换为 CV_8UC1

open cv mat怎样将数据类型转化为double

如何正确将 cv::Mat 转换为 CV_8UC1?

OpenCV——图像的深度与通道数讲解

如何在 CUDA 内核中正确操作 CV_16SC3 Mat

错误:(-215:断言失败)_step >= minstep in function 'cv::Mat::Mat'