我有两个单通道图片Mat I1;
和Mat I2;
。我没有关于其数据类型的信息(即uchar或float)。
任务:我想将它们合并到一个图像 Mat mergedImage
,该图片应该包含2个频道,以便I1
和I2
可以合并到它。
问题:在将图片合并到Mat mergedImage
之前,我必须使用mergedImage.create( I1.size() , ...... );
我应该在 ......
的地方填写什么?我只知道它应该是2通道所以,我如何提取I1
的数据类型
PS:请不要说使用I1.type()
,因为I1
仅限于单一频道。
答案 0 :(得分:2)
为什么没有?
在不知道类型的情况下工作并不是一个好主意。您可以使用模板化函数在C ++中完成它,但是您将实现多少灵活性?以及如何增加软件的设计?你要撞到多少个不受控制的问题?
通常,当您阅读有关该类型更改行为的图像处理代码时,您会看到某些if
或switch
条件。更多的受控环境,更少的错误发音,更可读的代码和清晰的行为,以及区分行为的好方法。你为什么不想用呢?这很简单,请记住Occam's razor。
例如:
if(src.type() == CV_32F || src.type() == CV_32FC1) {
....
}
并通过检查类型来区分行为。
如果你不相信这会在opencv source code中打开一些随机文件:它到处都是类型检查,并根据它默默地区分策略和实现。
答案 1 :(得分:1)
解决问题的另一个简单方法:
cv::Mat I1; // Unknown depth but 1 channel
cv::Mat I2; // Unknown depth but 1 channel
// Merge
cv::Mat channels[2]={I1,I2};
cv::Mat mergedImage;
cv::merge(channels,2,mergedImage);
答案 2 :(得分:0)
另一种实现您想要的方法,使用宏CV_MAKE_TYPE
,这似乎更接近您的问题处理方法。 CV_MAKE_TYPE(depth,channels)
是一个未记录的OpenCV宏,如果您单独指定深度和通道数,则可以构建所需的类型。
因此,您可以执行以下操作:
mergedImage.create( I1.size(), CV_MAKE_TYPE(I1.depth(),2));
此处,与I1.depth()
不同,I1.type()
返回的数据类型与通道数无关。