c++ - 在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# - 在负载下减少 NetNamedPipe 的 CPU 使用
- python - 重新启动列并为每个列创建 min() 列
- r - 如何计算平滑线的斜率,时间为R中的x轴
- reactjs - 如果绝对值大于数组长度,则禁用从数组开头开始的 .slice 位置参数
- javascript - 如何仅在页面完全呈现后才显示 div
- spring-boot - 如何将用户的身份验证(和授权)传播到其他微服务
- r - 读取列中包含日期和非日期条目的 excel 文件
- python - 在鼠标移动时检查鼠标按下
- mysql - 在Mysql中创建程序时出错,如何解决?
- anylogic - 如何让 Anylogic 仿真运行得更快?