【问题标题】:merging 2 single channel images WITHOUT knowing their datatype?在不知道其数据类型的情况下合并 2 个单通道图像?
【发布时间】:2014-02-28 22:11:54
【问题描述】:

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

任务:我想将它们合并成一个图像 Mat mergedImage,它应该有 2 个通道,以便 I1I2 可以合并到其中。

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

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

PS:请不要说要使用I1.type(),因为I1只有单通道。

【问题讨论】:

  • 您可以像使用 size() 一样查询 type()
  • @berak:我认为它会返回整个信息,即bit / datatype / channels。但它只需要知道数据类型,即 uchar/float。看看这个问题stackoverflow.com/questions/10167534/…>
  • 真的。只是想填充创意池..

标签: opencv image-processing


【解决方案1】:

为什么没有?

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

通常,当您阅读有关图像处理的代码时,该代码会根据类型改变行为,您会看到一些ifswitch 条件。更可控的环境,更少的错误倾向,更易读的代码和干净的行为,以及区分行为的好方法。你为什么不想使用它?就是这么简单,记住Occam's razor

例如:

if(src.type() == CV_32F || src.type() == CV_32FC1) {
    ....
}

并通过检查类型来区分行为。

如果你不相信这个在opencv source code中打开一些随机文件:它到处都是类型检查,并在此基础上默默区分策略和实现。

【讨论】:

  • 如果OP不想使用type(),因为它包含通道数,他可以随时使用depth(),返回CV_32FCV_8U,与通道数无关频道...
【解决方案2】:

解决问题的另一种简单方法:

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);

【讨论】:

  • 谢谢,但我会得到合并后的图像,数据类型为float,可能不是I1I2 的类型。但我想获得与“I1”和“I2”具有相同数据类型的mergedImage
  • @user2756695 好吧,图像的所有通道必须具有相同的数据类型。如果 I1 是 float 而 I2 是 uchar,你会怎么做?另外,请参阅我对 nkint 答案的评论。
  • I1I2 必须属于同一类型..这是肯定的。但我需要使用I1I2 都有的数据类型创建mergedImage
  • 那么它更容易:) 请参阅我的编辑。两张图片大小一样吧?
【解决方案3】:

使用宏CV_MAKE_TYPE 实现您想要的另一种方法,这似乎更接近您解决问题的方法。 CV_MAKE_TYPE(depth,channels) 是一个未记录的 OpenCV 宏,如果您独立指定深度和通道数,它可以构建您想要的类型。

因此,您可以执行以下操作:

mergedImage.create( I1.size(), CV_MAKE_TYPE(I1.depth(),2));

这里,I1.depth() 与通道数无关地返回数据类型,这与I1.type() 不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2012-09-19
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多