【发布时间】:2018-01-08 06:16:20
【问题描述】:
我正在使用 OpenCV C++ 进行图像处理。我想对 Mat 和 GpuMat 按元素进行一些快速处理。
例如,我必须对 Mat 或 GpuMat 的每个元素应用一个复函数。目前,我通过如下循环访问 Mat 的每个元素:
// C++ Example 1: a and b are Mat
for (int i = 0; i < 512; i++) {
for (int j = 0; j < 512; j++) {
double sPixel = s.at<double>(512 * i + j);
if (sPixel >= 0 && sPixel <= 1) {
a.at<double>(512 * i + j) = double(1);
} else if (sPixel > 1) {
b.at<double>(512 * i + j) = double(1);
}
}
}
// C++ Example 2: f, x are Mat
for (int i = 0; i < 512; i++) {
for (int j = 0; j < 512; j++) {
f.at<double>(512 * i + j) = (1 / (2 * sigma)) * (1 + cos(pi * x.at<double>(512 * i + j) / sigma));
}
}
不过,我觉得这个方法比较慢,因为Mat的元素之间没有实际的关系,如果并行计算逐元素计算会更好。
另一方面,我无法访问 GpuMat 的元素。如果我download和upload在Mat和GpuMat之间频繁数据,会非常慢,不存在使用GPU的优势。
所以我的问题是:
- Mat 和 GpuMat 上的元素处理有哪些改进方法? 尤其是 OpenCV 本身提供的。
- 如何在 GpuMat 上进行元素处理?
【问题讨论】:
-
您不应该为此使用透明 API 和 UMat 吗? code.opencv.org/attachments/1591/OpenCV3_0_CVPR_2014.pptx
标签: c++ opencv image-processing