Получение кадра от UDP происходит слишком медленно для распознавания лиц - PullRequest
1 голос
/ 13 июля 2020

Я хочу получать кадры с порта UDP и запускать на них алгоритмы распознавания лиц с помощью opencv cv :: dnn framework. Tello дрон отправляет кадры по протоколу UDP.

/* load dnn model */
    cv::dnn::Net net = cv::dnn::readNetFromCaffe("dnnmodel/deploy.prototxt.txt","dnnmodel/res10_300x300_ssd_iter_140000.caffemodel");
    cv::VideoCapture cap("udp://@0.0.0.0:11111?overrun_nonfatal=1&fifo_size=50000000");
    cv::Mat frame;

    float confidenceThreshold = 0.2;
   
    while(true)
    {   
        if(!cap.read(frame))
            break;

        cv::Mat inputBlob = cv::dnn::blobFromImage(frame, 1, cv::Size(300, 300), cv::Scalar(104.0, 177.0, 123.0), false, false);
        net.setInput(inputBlob, "data");
        cv::Mat detection = net.forward("detection_out");
        cv::Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());

        
        cv::imshow("window", frame);

        char key = cv::waitKey(10);
        if (key == 27) // ESC
            break;
    }

Время отклика камеры очень велико, примерно 10-20 секунд. Когда я перемещаю камеру, я получаю новый кадр через 20 секунд.

Но если бы я использовал свою собственную веб-камеру ноутбука вместо порта udp в VideoCapture с этим вызовом;

VideoCapture cap;
cap.open(0)

результат будет идеальный. Когда я использую веб-камеру, задержки нет.

В чем причина этой задержки?

1 Ответ

2 голосов
/ 15 июля 2020

С ненадежными протоколами, такими как UDP, где стек связи может и будет отбрасывать данные, если они не были немедленно перенесены в пространство пользователя, важно придавать большое значение чтению данных, даже за счет дополнительной сложности в recv code.

В этом случае можно использовать отдельный поток для извлечения дейтаграмм, как только они станут доступны, и постановки буферов в очередь (во всяком случае, указателей на буферы) для обработки кода, что в противном случае привело бы к чрезмерному время использовало и сбросил дейтаграммы.

Эй, это сработало!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...