如何用相同的矩阵分别乘以每个通道?

时间:2015-08-02 19:32:48

标签: c++ opencv

我有一个相同大小的1和3个频道Mat,称他们为aimg。我想将img的每个频道与a相乘。我会多次表演,表演是一个问题。

有没有办法使用multiply()操作或乘法运算符重载来从OpenCV中的优化中受益?我试图避免出于性能原因编写自己的循环,使用运算符也会导致代码更加干净。

由于性能问题,我不想重复a三次,merge()重复一次3通道Mat

1 个答案:

答案 0 :(得分:1)

  
    

有没有办法使用multiply()操作或乘法运算符重载来从OpenCV中的优化中受益?

  

OpenCV3推动使用cv::UMat类代替cv::Mat。这应该尽可能给你一点GPU加速。

  
    

我试图避免出于性能原因编写自己的循环,使用运算符也会导致代码更加干净。

  

我不同意,performance reasons可能是错误的,因为你将依赖于用于构建libs的任何编译。如果lib没有AVX2,你将失去性能。此外,您将受限于OpenCV的原语,这会大大增加内存访问。具体来说,每当您执行cv::add(A,B,C)后跟cv::sqrt(C,C)之类的操作时,您会额外占用内存,从而导致性能显着下降。

它绝对不是更干净的代码,更像是为旧的Polish Notation计算器编写脚本。

总之,如果您有性能问题,请抓住.data()指针,检查它是否为矢量化,并在C ++ / CUDA / OCL中完成工作。