将单通道图像转换为3通道图像C ++ / OpenCV

时间:2010-09-01 00:16:57

标签: c++ opencv

我正在使用openCV C ++

我需要将单个通道图像转换为3通道图像。所以我可以使用它:cvCvtColor(result,gray,CV_BGR2GRAY);

我不能这样做,因为结果img是单通道图像。有什么想法吗?

6 个答案:

答案 0 :(得分:15)

您应该使用CV_GRAY2BGR代替CV_BGR2GRAY

答案 1 :(得分:7)

试试这个:

CvSize dim = cvSize(int width, int height);
IplImage* dst = cvCreateImage( dim, 8, 3 );
IplImage* gray = cvCreateImage(dim, 8, 1);
// Load the gray scale image
cvMerge(gray , NULL, NULL, NULL, dst);
cvShowImage("gray",gray);
cvShowImage("dst",dst);
cvWaitKey(0);

dst和gray必须具有相同的数据类型。你不能简单地在一个uint矩阵中合并一个浮点数。你必须使用cvScale。

答案 2 :(得分:7)

我在OpenCV参考书中检查了 cvtColor ,发现了这个:

  

C ++:void cvtColor (InputArray src ,OutputArray dst ,int 代码,int dstCn = 0)

     
    

dstCn - 目标图片中的频道数。如果参数为0,则从src和代码自动导出通道数。

  

我用过

cvtColor(src,gray,CV_BGR2GRAY,1);

将3通道Mat转换为1通道,并且有效。因此,将 dstCn 更改为3可能对您有用:)

答案 3 :(得分:3)

尝试将灰色,灰色,灰色合并到BGR中。

答案 4 :(得分:0)

IMHO: 如果输入为灰色,则输出为灰色。您可以获得的最佳效果是基于像素数据的彩色分布式图像(110, 110, 110),用于110的像素数据,而非真彩色图像

答案 5 :(得分:0)

您可以创建相同频道的矢量,然后将其合并,如下所示:

std::vector<cv::Mat> copies{mat,mat,mat};  
cv::merge(copies,mat);