【问题标题】:Converting HSV to RGB fails in OpenCV在 OpenCV 中将 HSV 转换为 RGB 失败
【发布时间】:2017-05-09 13:50:35
【问题描述】:

cvtColor() 的 OpenCV documentation 不提供有关 HSV 到 BGR 转换的信息。它说不支持 16 位图像从 RGB 到 HSV 的转换。

我需要将每像素超过 8 位(16 位或 32 位都可以)的 HSV 图像转换为 RGB 图像。下面的代码给出了运行时错误。

cv::Mat hsv(10, 10, CV_16UC3, cv::Scalar(0)); // same in cv::Mat hsv(10, 10, CV_32F);
cv::Mat rgb(hsv.size(), hsv.type());
cv::cvtColor(hsv, rgb, cv::COLOR_HSV2BGR);

这是运行时错误

OpenCV Error: Assertion failed (scn == 3 && (dcn == 3 || dcn == 4) && (depth == CV_8U || depth == CV_32F)) in cv::ipp_cvtColor, file C:\InstalledPrograms\opencv_3.1\sources\modules\imgproc\src\color.cpp

【问题讨论】:

  • hsv中的像素是用什么填充的?我没有看到您在哪里分配像素值
  • opencv 假设(默认) HSV 的色调值在 0..180 范围内,所以也许您的未初始化值更大?如果文档说不支持 16 位,你为什么要尝试 16 位?!?如果你需要一些不支持的东西,也许你可以调整opencv源代码(它是开源的!)!
  • 此消息告诉您输入图像中需要 3 个通道,输出图像中需要 3 或 4 个通道,这在您的示例中是可以的。但它进一步告诉你,atm 只允许 8U 和 32F 深度。请切换到 CV_32FC3 并告诉我们新的错误消息。
  • @Micka CV_32FC3 工作正常,谢谢。请把它写成答案,以便我接受。
  • @Melike 正是 Micka 所说的。现在您已经分配了值并将类型更改为 CV_32FC3CV_8UC3,您应该不会收到错误。

标签: c++ opencv rgb hsv


【解决方案1】:

您必须使用CV_32FC3 而不是CV_32F,因为您需要3 个频道。

根据CV_16UC3 的错误消息(除了文档),RGB/BGR=>HSV 和 HSV=>RGB/BGR 都不支持 16 位

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多