我正在使用openCV C ++
我需要将单个通道图像转换为3通道图像。所以我可以使用它:cvCvtColor(result,gray,CV_BGR2GRAY);
我不能这样做,因为结果img是单通道图像。有什么想法吗?
答案 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);