【问题标题】:Accessing Whole Channel in a multi channel array in opencv在opencv中访问多通道数组中的整个通道
【发布时间】:2014-05-13 15:39:21
【问题描述】:

我正在尝试访问 opencv 中 3 通道图像中的整个通道(用整个矩阵替换通道,见下文)。是否可以在不遍历单个像素值的情况下这样做?

Mat RGB(320, 480, CV_8UC3)
Mat R(320, 480, CV_8UC1)
Mat G(320, 480, CV_8UC1)
Mat B(320, 480, CV_8UC1)

// First channel of RGB = R
// second channel of RGB = G
// third channel fo RGB = B

【问题讨论】:

  • 您想提高性能还是只是让代码更具可读性?
  • 提高性能...
  • 由于第一行前 3 个像素的内存布局为 BGRBGRBGR,因此如果不先提取一个通道,您将无法轻松访问/操作一个通道 (cv::split),您也无法轻松为该通道设置一些内存区域而不对齐它(cv::merge)。由于不存在“跨步复制”(根据 stackoverflow.com/questions/17090742/copying-strided-data-in-c),我猜 openCV 内部使用了某种循环,但这仍然可能比手动循环更有效,因为它们可能会使用一些优化。

标签: c++ opencv image-processing mat


【解决方案1】:

只需使用splitmerge

Mat RGB // source mat
Mat BGR_3[3]; 
split(RGB,RGB_3);  
BGR_3[0]//do some operation Blue channel
BGR_3[1]//do some operation Green Channel
BGR_3[2]//do some operation Red channel

//later merge
Mat dst
merge(BGR_3,3,dst);  

【讨论】:

  • 没有 cv::merge 内部循环遍历所有像素?
  • 根据 doc merge 从几个单通道数组中创建多通道数组,与 merge() 正好相反,可能是他们在高效地做这件事。
  • 但这基本上比在所有像素上手动循环(并手动合并)更有效吗?
猜你喜欢
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2014-02-01
相关资源
最近更新 更多