我有一个大小相同的 1 和 3 channel Mat
,称它们为 a
和 img
。我想将 img
的每个 channel 与 a
相乘。我会多次执行此操作,性能是个问题。
有没有一种方法可以使用 multiply()
操作或乘法运算符重载来从 OpenCV 中的优化中获益?出于性能原因,我试图避免编写自己的循环,使用运算符也会产生很多干净的代码。
由于性能问题,我不想将 a
重复三次并将 merge()
合并为单个 3 channel Mat
。
最佳答案
Is there a way of using the multiply() operations or multiply operator overloads to benefit from the optimizations in OpenCV?
OpenCV3 插入使用 cv::UMat
类代替 cv::Mat
。这应该尽可能为您提供一点 GPU 加速。
I am trying to avoid writing my own loop for performance reasons, using operators leads to much clean code too.
我不同意,performance reasons
可能是错误的,因为您将依赖于用于构建库的任何编译。如果 lib 没有 AVX2,你将失去性能。此外,您将仅限于 OpenCV 的原语,这会大大增加内存访问。具体来说,每次您执行 cv::add(A,B,C)
之后执行 cv::sqrt(C,C)
之类的操作时,您都会额外访问内存导致性能显着下降的时间。
它也绝对不是更干净的代码,更像是为旧的 Polish Notation 编写脚本计算器。
总而言之,如果您有性能问题,请捕获 .data()
指针,检查它是否向量化,然后在 C++/CUDA/OCL 中完成您的工作。
关于c++ - 如何将每个 channel 分别与相同的矩阵相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31775801/