Использование 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);

0 ответов

Другие вопросы по тегам