【问题标题】:combine two RGB images to a 6 channel image - openCV将两个 RGB 图像组合成一个 6 通道图像 - openCV
【发布时间】:2012-05-13 22:17:38
【问题描述】:

我正在使用 openCV,我需要将两个三通道 RGB 图像组合成一个 6 通道图像。我不确定我将如何组合它们。有什么想法吗?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    首先,您必须创建一个目标矩阵。
    cv::Mat 允许创建多达 CV_CN_MAX (512) 个通道的图像。
    例如cv::Mat(cv::Size(640,480),CV_8UC(6)) 是具有六个 8 位通道的 640x480 图像。更一般地说,给定s 输入,就可以得到一个自适应的目的矩阵:

    cv::Mat(s.size(), CV_MAKETYPE(s.depth(), 6))
    

    请参阅 Data typescv::Mat constructor

    您可能希望使用Mat::convertTo 来确保您的两个输入图像具有相同的格式,然后使用mixChannels

    mixChannels(const Mat *     src,
        size_t      nsrcs,
        Mat *   dst,
        size_t      ndsts,
        const int *     fromTo,
        size_t      npairs 
    )   
    

    需要将 2 个源图像放入一个容器中(请记住,分配矩阵只会创建一个新标头,除非明确要求,否则不会复制图像缓冲区)。

    最后要做的是使用通道映射创建一个from_to 向量。给定 s0 和 s1 输入图像,目标是如下映射:

    s0 red   -> 1st output channel
    s0 green -> 2nd
    s0 blue  -> 3rd
    s1 red   -> 4th
    s1 green -> 5th
    s1 blue  -> 6th
    

    最终代码为:

    std::vector<cv::Mat> s;
    s.resize(2); //Or `push_back` your 2 input images
    s[0] = ...   //1st input image
    s[1] = ...   //2nd input image
    auto d = cv::Mat(s[0].size(), CV_MAKETYPE(s[0].depth(), 6));
    
    int from_to[] = { 0,0, 1,1, 2,2, 3,3, 4,4, 5,5 };
    cv::mixChannels(s.data(), s.size(), &d, 1, from_to, 6);
    

    【讨论】:

    • 请注意,from_to 中应该有 0,3 而不是 0,1
    • 其实应该是:int from_to[] = { 0,0, 1,1, 2,2, 3,3, 4,4, 5,5 };,因为索引是通过数组递增计数的。
    【解决方案2】:

    split 将图像拆分为单通道图像数组,merge 将它们以任意顺序重新组合在一起。还有 mixchannels() ,它是两者的更有效但更复杂的组合

    理论上,opencv 适用于任意数量的通道,但我怀疑许多功能仅适用于 1 或 3(即灰色或“正常”颜色)

    【讨论】:

    • 我正在考虑使用合并,但我对如何传入所有通道有点困惑。
    • @ChrisMondiek - 只是 cv::Mat 的 std::vector。它是引用计数的,因此您只需将它们添加到 std::vector 即可处理内存
    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多