我有一个相同大小的1和3个频道Mat
,称他们为a
和img
。我想将img
的每个频道与a
相乘。我会多次表演,表演是一个问题。
有没有办法使用multiply()
操作或乘法运算符重载来从OpenCV中的优化中受益?我试图避免出于性能原因编写自己的循环,使用运算符也会导致代码更加干净。
由于性能问题,我不想重复a
三次,merge()
重复一次3通道Mat
。
答案 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中完成工作。