udp接收帧太慢,无法识别人脸

时间:2020-07-13 12:59:48

标签: c++ c opencv deep-learning udp

我想从UDP端口接收帧,并使用opencv cv :: dnn框架在它们上运行人脸识别算法。 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秒后得到新的画面。

但是,如果通过此调用我使用了自己的便携式计算机网络摄像头而不是VideoCapture中的udp端口,那么;

VideoCapture cap;
cap.open(0)

结果是完美的。使用网络摄像头时没有延迟。

此延迟的原因是什么?

1 个答案:

答案 0 :(得分:2)

对于不可靠的协议(如UDP),如果未及时将其删除到用户空间中,则comms堆栈可以并且将丢弃数据,因此高度重视读取数据非常重要,即使这样做会以增加recv中的复杂性为代价代码。

在这种情况下,可以使用一个单独的线程来尽快提取数据报,并将缓冲区(无论如何指向缓冲区)排队,然后处理代码,否则将导致过多的时间使用和数据报丢失

嘿-可行!