无 8 位系统上的 CV_8U opencv 矩阵

Posted

技术标签:

【中文标题】无 8 位系统上的 CV_8U opencv 矩阵【英文标题】:CV_8U opencv's matrixes on no 8 bit systems 【发布时间】:2011-09-30 11:42:47 【问题描述】:

我读过有符号字符和无符号字符类型不能保证在每个平台上都是 8 位,但有时它们有超过 8 位。 如果是这样,使用 OpenCv 我们如何确定 CV_8U 始终是 8bit? 我编写了一个简短的函数,它需要一个 8 位 Mat 并且碰巧将 CV_8SC1 Mat 元素转换为 uchars 并将 CV_8UC1 转换为 schar。 现在恐怕它不是独立于平台的,我应该以某种方式修复代码(但不知道如何)。

P.S.:同样,CV_32S 怎么总是 int,在没有 32 位整数的机器上也是如此?

【问题讨论】:

我认为您无需担心这一点 - 只需让 OpenCV 负责底层实现即可。 CHAR_BIT > 8 的平台有些不寻常(通常是 DSP)。 sizeof(int) > 4 比较常见,但我很确定 OpenCV 会处理这个问题。 实际上 OpenCV 被承诺只能在 ia32、amd64 和 arm(自 2.3.0 起)平台上工作。所有这些平台都有 8 位字符和 32 位整数。 @AndreyKamaev。至于 schar 到 uchar 的转换,反之亦然,你认为我可以依赖我编写的代码吗?所有这些平台都是对 2 的补充吗? 【参考方案1】:

你能提供一个参考(我从未听说过)吗?可能您的意思是可以在 cv::Mat 中的一行末尾添加的填充。这没问题,因为通常不使用填充,特别是如果您使用接口函数,例如迭代器 (c.f.)。如果您发布一些代码,我们可以看到您的实现是否确实存在此类问题。

// template methods for iteration over matrix elements.
// the iterators take care of skipping gaps in the end of rows (if any)
template<typename _Tp> MatIterator_<_Tp> begin();
template<typename _Tp> MatIterator_<_Tp> end();

CV_32S 将始终是 32 位整数,因为它们使用的类型类似于在 inttypes.h 中定义的类型(例如 int32_tuint32_t),而不是特定于平台的 intlong 等。

【讨论】:

以上是关于无 8 位系统上的 CV_8U opencv 矩阵的主要内容,如果未能解决你的问题,请参考以下文章

6opencv入门Mat类介绍,基本的绘图函数

OpenCV 图像阵列,4D 矩阵

opencv报错——(mtype == CV_8U || mtype == CV_8S)

opencv报错——(mtype == CV_8U || mtype == CV_8S)

opencv python 如何将float 转换成 CV_8U

OpenCV中的图像数据格式CV_8U定义