【问题标题】:cv::Mat graystyle conversioncv::Mat 灰度转换
【发布时间】:2012-09-06 11:14:59
【问题描述】:

我有从 RGB 图像创建的 cv::Mat,每个组件 8 位,4 个通道 (CV_8UC4)。我想将它转换为灰度垫,然后将我的灰度垫存储回 4 通道垫。我怎样才能做到这一点?以下代码将我带到 EXC_BAD_ACCESS:

void myMethod(const Mat& mat) {
      cv::Mat gray;
      cv::cvtColor(mat, gray, CV_RGB2GRAY);
      gray.copyTo(mat);
}

【问题讨论】:

  • 为什么需要这个功能?它没有提供任何新功能。
  • 顺便说一句,你确定你有一个 RGB 图像,因为 OpenCV 使用默认 BGR 打开图像。
  • “RGB”和“4 通道”如何混合?你有 RGBA 吗?

标签: c++ ios opencv computer-vision


【解决方案1】:

如果要更改数据,则不能使用 const 引用:

void toGrayscale(cv::Mat& mat)
{
     cv::Mat gray;
     cv::cvtColor(mat, gray, CV_RGB2GRAY);
     cv::cvtColor(gray, mat, CV_GRAY2RGB);
}

编辑:在 Christian Rau 的帮助下更正了答案。

【讨论】:

  • 您确定 cv::Mat::copyTo 将灰色通道分配到 4 个颜色通道中,并且不只是将 mat 重新分配为 1 通道矩阵吗?
  • @ChristianRau:文档指出,如果需要,将重新分配目标矩阵:opencv.willowgarage.com/documentation/cpp/…
  • 是的,但问题是,如果源是 1 通道而目标是 4 通道,是否需要重新分配,或者 cv::Mat::copyTo 足够智能以将源图像的 1 通道分配到目的地的4个频道。
  • 您是否阅读了我链接到的文档?引用:“在复制数据之前,该方法调用m.create(this->size(), this->type);,以便在需要时重新分配目标矩阵。”
  • 其实你的答案几乎是正确的,你只需要把最后一行变成cv::cvtColor(gray, mat, CV_GRAY2RGB);
猜你喜欢
  • 2012-05-07
  • 2020-02-09
  • 1970-01-01
  • 2015-11-19
  • 2012-12-29
  • 2014-05-07
  • 2011-06-07
  • 2012-06-16
  • 2016-04-13
相关资源
最近更新 更多