c++ - 从 udp 接收帧对于人脸识别来说太慢了

标签 c++ c opencv deep-learning udp

我想从 UDP 端口接收帧并使用 opencv cv::dnn 框架在它们上运行人脸识别算法。 特洛 无人机正在通过 UDP 协议(protocol)发送帧。

/* 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)
结果是完美的。我使用网络摄像头时没有延迟。
这种延迟的原因是什么?

最佳答案

对于像 UDP 这样不可靠的协议(protocol),如果不及时将数据取出到用户空间,通信堆栈可以并且将会丢弃数据,因此高度重视读取数据非常重要,即使以增加 recv 代码的复杂性为代价。
在这种情况下,可以使用单独的线程来尽快提取可用的数据报并将缓冲区(无论如何都是指向缓冲区的指针)排队,以处理代码,否则会导致过多的时间使用和丢弃数据报。
嘿 - 它奏效了!

关于c++ - 从 udp 接收帧对于人脸识别来说太慢了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62876383/

相关文章:

python - 使用 cv2.HoughCircles 检测圆圈

c++ - 为什么锁会起作用?

C++ fstream 不读取整个文件

c++ - 使用 UDP 连接到服务器

c - 如何将 ptr 增加到字符串数组的第一个元素

c++ - 使用 64 位版本的 MVSC2019 从源代码 OpenCV 编译时出现问题

c++ - (编辑)如何使用 cpp 文件中声明的源在 Windows 中导出模板特化

c - 为什么像clone()这样的系统调用会失败、恢复和暂停?

mysql - C 中的命名空间冲突

c++ - 在 OpenCV 中将两张纸片合并成一张图像