首页 > 解决方案 > 在opencv中使用cv::cuda::stream对图像进行异步处理

问题描述

我正在使用 OpenCV 3.4 和 cuda 库来处理视频图像。图像被抓取并使用GpuMat::upload(). 然后对图像进行两次阈值处理以创建 2 个不同的二值图像(Th1 和 Th2)。我的第一个问题是:我可以在两个阈值函数中使用 cuda 流同时运行吗?这是一个问题,因为它们都使用相同的 GpuMat 作为输入。

在阈值处理之后,我将使用两个二进制 GpuMats 使用其他 cv::cuda 函数对它们进行更多处理。第二个问题是:Stream::waitForCompletion()在使用 Th1 和 Th2 进行进一步处理之前,我是否应该等待阈值流完成?还是自动检测到这种数据依赖性?基本上我正在尝试从这里并行处理这两个二进制图像,而不是先处理 Th1 然后再处理 th2。它们将使用类似的 cuda 函数进行精确处理,但具有不同的值..

我正在使用 cuda 9.0。如果相同的操作使用不同的数据排入不同的流两次,这仍然是一个问题吗?

我的代码示例如下所示:

src.upload(IMG); //upload cv::Mat to device

//threashold src with different values and write them in dst0 and dst1
// Can I have 2 stream on the same functions that are both using src as input?
cv::cuda::threshold(src, dst0, 10, 1, THRESH_BINARY, s0); //Stream s0 
cv::cuda::threshold(src, dst1, 40, 1, THRESH_BINARY, s1); // Stream S1

s0.waitForCompletion();// I dont know if this is necessary 
cv::cuda::reduce(dst0, Vx0, 0, CV_REDUCE_SUM, CV_32S);


s1.waitForCompletion();// also this one
cv::cuda::reduce(dst1, Vx1, 0, CV_REDUCE_SUM, CV_32S);

标签: c++opencvparallel-processingcuda-streams

解决方案


推荐阅读