C++ cv::Mat灰色样式转换

C++ cv::Mat灰色样式转换,c++,ios,opencv,computer-vision,C++,Ios,Opencv,Computer Vision,我从RGB图像创建了cv::Mat,每个组件8位,4个通道(cv_8UC4)。我想把它转换成灰色的垫子,然后把我的灰色垫子存储回4通道垫子。我该怎么做?以下代码将我带到EXC_BAD_访问: void myMethod(const Mat& mat) { cv::Mat gray; cv::cvtColor(mat, gray, CV_RGB2GRAY); gray.copyTo(mat); } 如果要更改数据,则不能使用常量引用: void toG

我从RGB图像创建了cv::Mat,每个组件8位,4个通道(cv_8UC4)。我想把它转换成灰色的垫子,然后把我的灰色垫子存储回4通道垫子。我该怎么做?以下代码将我带到EXC_BAD_访问:

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

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

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

编辑:由于Christian Rau的输入,更正了答案。

为什么需要该功能?它不提供任何新功能。顺便问一下,既然OpenCV使用默认BGR打开图像,您确定您有RGB图像。RGB和“4通道”如何混合?你有RGBA吗?你确定
cv::Mat::copyTo
将灰色通道分配到4个彩色通道中,而不是将
Mat
重新分配为1通道矩阵吗?@ChristianRau:文档说明,如果需要,将重新分配目标矩阵:是的,但问题是,如果源映像为1通道,目标映像为4通道,或者
cv::Mat::copyTo
足够智能,可以将源映像的1通道分发到目标映像的4通道,是否需要重新分配。您是否阅读了我链接到的文档?引号:“在复制数据之前,该方法调用
m.create(this->size(),this->type);
以便在需要时重新分配目标矩阵。”事实上,您的答案几乎是正确的,只需将最后一行变成
cv::cvtColor(gray,mat,cv_GRAY2RGB)