C++ 无法更改opencv中的垫类型

C++ 无法更改opencv中的垫类型,c++,ios,opencv,C++,Ios,Opencv,我正在尝试将垫的类型从CV_8UC1更改为CV_8UC4 cv::Mat tempCVImg2; cv::Mat tempMat3; cvImage2.convertTo(tempCVImg2, CV_8UC4); tempMat2.convertTo(tempMat3, CV_8UC4); NSString *strType1 = [NSString stringWithCString:type2str(tempCVImg2.type()).c_str()

我正在尝试将垫的类型从CV_8UC1更改为CV_8UC4

cv::Mat tempCVImg2;
cv::Mat tempMat3;
cvImage2.convertTo(tempCVImg2, CV_8UC4);
tempMat2.convertTo(tempMat3, CV_8UC4);

NSString *strType1 = [NSString stringWithCString:type2str(tempCVImg2.type()).c_str()
                                        encoding:[NSString defaultCStringEncoding]];
NSString *strType = [NSString stringWithCString:type2str(tempMat3.type()).c_str()
                                       encoding:[NSString defaultCStringEncoding]];

cv::cvtColor(cvImage2, tempMat2, cv::COLOR_BGR2GRAY);
它在cvtColor崩溃,因为它期望CV_8UC4,但收到了CV_8UC1

为什么cvImage2.convertTo(tempCVImg2,CV_8UC4);是否未更改mat cvImage2的类型?

它被写入

其中指出:

rtype所需的输出矩阵类型,或者更确切地说,是自 通道数量与输入相同;如果rtype是 如果为负值,则输出矩阵的类型将与输入矩阵的类型相同

正如您所见,频道的数量将是相同的

不确定你到底想要实现什么。。。但OpenCV不知道在其他通道中额外添加哪些数据,据我所知,没有直接的方法。。。。如果要复制数据,可以使用
cvtColor
GRAY2RGBA
标志或类似标志,它将创建具有相同值的额外通道。。。。您还可以尝试使用
合并
混合频道
。。。由于数据必须是:

 C1 C2 C3 C4, C1 C2 C3 C4....
这意味着数据是以每像素4个值组织的,因此C1应该来自每个像素。我想如果你告诉我你想做什么,答案可能会更准确一些。

你可以尝试使用


我发布了一个关于我想做什么的问题。在这样做的过程中,我遇到了这个错误。嗯,我仍然不明白为什么需要从BGR到灰度,然后再到4通道图像?
convertScaleAbs(image);