Использование cv::cuda::stream для асинхронной обработки изображений в opencv
Я использую OpenCV 3.4 с библиотеками cuda для обработки видеоизображений. Изображение захватывается и загружается через устройство с помощью GpuMat::upload()
, После этого изображение подвергается двойному порогу для создания двух разных двоичных изображений (Th1 и Th2). Мой первый вопрос: могу ли я использовать потоки cuda в обеих пороговых функциях для одновременного запуска? Это проблема, поскольку они оба используют один и тот же GpuMat в качестве ввода.
После установления порога я буду использовать оба двоичных GpuMats для дополнительной обработки их, используя другие функции cv::cuda. Второй вопрос: я должен использовать Stream::waitForCompletion()
ждать завершения обработки пороговых значений, прежде чем использовать Th1 и Th2 для дальнейшей обработки? или эта зависимость данных определяется автоматически? в основном я пытаюсь обработать эти 2 двоичных изображения отсюда параллельно, а не обрабатывать сначала 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);