c++ - 如何将每个 channel 分别与相同的矩阵相乘?

标签 c++ opencv

我有一个大小相同的 1 和 3 channel Mat,称它们为 aimg。我想将 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/

相关文章:

c++ - 如何在OpenGL中拥有多个独立移动的对象

c++ - 我最近在阅读 opencv 源代码。有没有更好的方法在 opencv 库中查找类定义?

c++ - 模板特化编译器错误

python - 在用于图像分割的全卷积神经网络中将Python中的索引值转换为(R,G,B)值(颜色图)

c++ - 在 C++ 中删除 vector 中的范围元素

C++ 不能减去两个字符串

c++ - OpenCV-cvQueryFrame()

c++ - 训练图像在openCV中意味着什么?

python - VideoCapture 在 Python OPENCV [Linux] 中始终返回 False

python - 从无人机Parrot 2.0流式传输视频。 Python + cv2