Использование cv :: cuda :: stream для асинхронной обработки изображений в opencv - PullRequest
0 голосов
/ 17 января 2019

Я использую 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);
...