【问题标题】:OpenCV cvtColor without having to know source typeOpenCV cvtColor,无需知道源类型
【发布时间】:2017-01-19 19:56:46
【问题描述】:

有没有办法在 OpenCV (>=2) 中转换图像 不必知道它们的源类型?我意识到有 cvtColor,但是你必须指定转换代码,这总是需要我创建一个相应的开关块,这真的很乏味。如果没有像这样常见的东西的辅助函数,我会感到惊讶。

谢谢

【问题讨论】:

  • 如何在不知道 A,B 是什么的情况下将 A 转换为 B?你到底想达到什么目的?
  • 如何创建开关块?通常你要么知道输入类型(然后你可以创建一个开关块),要么你不知道(那么即使是开关块也不可能)
  • 我正在构建一个用于处理相机数据的通用类,它应该使用不同的输入进行操作,例如 RGB 或灰度,16 位或 8 位。例如,如果我需要灰度数据(因为许多 OpenCV 函数只在 8 位单通道数据上运行),我必须根据通道数来决定,要么调用 cvtColor,要么只复制数据,以防它已经处于灰度状态。然后,我还必须仔细检查它是否已经是 8 位并且可能再次转换。这是我经常偶然发现的事情,手动处理每个案例很乏味。
  • 您可以创建一个函数来封装switch,它接受两个参数:源色彩空间和目标色彩空间并返回正确的代码(如果支持)。对于额外的功劳,您也可以传递源图像以验证#channels 对应于提供的颜色空间。
  • 是的,感谢您指出这一点,我通常会这样做。事情在我遇到的每个新项目中都必须重新编码,或者从旧代码中获取并复制/粘贴。我想也许我缺少一个便利功能。但是你的回答当然是对的,这样做所需的数据并不存在。

标签: c++ opencv


【解决方案1】:

OpenCV cv::Mat 不存储图像数据所代表的格式或色彩空间(仅与内存存储相关的内容,如深度和通道数)。

因此,此信息是外部信息,必须由用户管理。
管理还意味着,如果您想转换到另一个颜色空间,您需要知道并指定源颜色空间和目标颜色空间。

【讨论】:

  • 等等,imwrite 和 imshow 等函数如何决定如何解释数据?
  • 他们假设 C1是灰度,C3BGR
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多