合并2个单通道图像而不知道他们的数据类型?

时间:2014-02-27 20:22:42

标签: opencv image-processing

我有两个单通道图片Mat I1;Mat I2;。我没有关于其数据类型的信息(即uchar或float)。

任务:我想将它们合并到一个图像 Mat mergedImage ,该图片应该包含2个频道,以便I1I2可以合并到它。

问题:在将图片合并到Mat mergedImage之前,我必须使用mergedImage.create( I1.size() , ...... );

创建该图片

我应该在 ...... 的地方填写什么?我只知道它应该是2通道所以,我如何提取I1的数据类型

PS:请不要说使用I1.type(),因为I1仅限于单一频道。

3 个答案:

答案 0 :(得分:2)

为什么没有?

在不知道类型的情况下工作并不是一个好主意。您可以使用模板化函数在C ++中完成它,但是您将实现多少灵活性?以及如何增加软件的设计?你要撞到多少个不受控制的问题?

通常,当您阅读有关该类型更改行为的图像处理代码时,您会看到某些ifswitch条件。更多的受控环境,更少的错误发音,更可读的代码和清晰的行为,以及区分行为的好方法。你为什么不想用呢?这很简单,请记住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()返回的数据类型与通道数无关。