【问题标题】:Extracting the Y, Cb, Cr from a Mat in c++ and create a Mat with only the Y values从 C++ 中的 Mat 中提取 Y、Cb、Cr 并创建一个只有 Y 值的 Mat
【发布时间】:2014-08-15 18:58:17
【问题描述】:

我有两个想要融合的视频。我计划拍摄可见光视频,捕获帧,并将帧转换为 YUV。在将其与 IR 视频融合之前,我想提取 Y 分量,将其放入另一个相同大小的 Mat 类型的图像(变量)中,并将其与 IR 帧的亮度融合。融合后,我想把 Cb 和 Cr 放回去得到颜色。

我看到了这个链接:Getting the Y and Cb , Cr values of a frame in openCV c++

但我不知道如何使用这种提取 Y、Cb 和 Cr 的方法创建自己的矩阵。

有什么想法可以做到这一点吗?

【问题讨论】:

    标签: c++ opencv extract mat luminance


    【解决方案1】:

    查看 split() 和 merge

    Mat vis_img; // from cam
    
    Mat ycrcb;
    cvtColor( vis_img, ycrcb, CV_BGR2YCRCB ); // am i right assuming rgb input even ?
    
    Mat channels[3];
    split( ycrcb, channels );
    
    // y is channels[0], cb is channels[1], cr, well...
    
    // some operations on channels later..
    // once you 'fused' your luminance channels into one, you can re-assemble the image
    // from the channels:
    
    Mat new_channels[3] = { lum_fused, channels[1], channels[2] };
    
    Mat new_ycrcb;
    merge( new_channels, new_ycrcb, 3 );
    

    【讨论】:

    • 谢谢,但我是新手,所以只问几点:当您创建一个名为 channels[3] 的新 Mat 时,这是一个一维矩阵,对吗?现在它的大小与 ycrcb 不同,我无法将它与另一个框架融合?那有意义吗 ?还是我应该以某种方式为每个像素获取这个 Y,然后创建另一个矩阵?
    • 不,Mat channels[3] 是一个由 3 个空垫组成的数组。他们将被填充到 split() 函数中。他们每个人都将持有一个与输入 img 大小相同的 2d Mat,稍后有 1 个颜色通道
    • 你也可以使用'std::vector<:mat> channels'。然后,您可以使用 channels.at(number) 访问单独的频道。
    • @Nallath,这是对 split() 函数的替代吗?我仍然需要初始化:Mat channels[3] 还是我完全错了?
    • 您可以使用向量而不是 cv::Mat 通道[3] 作为 CV::split 的输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多