来自udp的接收帧对于人脸识别来说太慢了
Receiving frame from udp is too slow for face recognition
我想从 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)
结果很完美。使用网络摄像头时没有延迟。
延迟的原因是什么?
对于像 UDP 这样不可靠的协议,如果不及时将数据取出给用户,通信堆栈可以并且将会丢弃数据 space,即使以牺牲为代价,也要高度重视读取数据,这一点很重要增加了 recv 代码的复杂性。
在这种情况下,可以使用一个单独的线程来尽快提取可用的数据报并将缓冲区排队(无论如何指向缓冲区),以处理代码,否则会导致过多的时间使用和丢弃的数据报。
嘿 - 成功了!
我想从 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)
结果很完美。使用网络摄像头时没有延迟。
延迟的原因是什么?
对于像 UDP 这样不可靠的协议,如果不及时将数据取出给用户,通信堆栈可以并且将会丢弃数据 space,即使以牺牲为代价,也要高度重视读取数据,这一点很重要增加了 recv 代码的复杂性。
在这种情况下,可以使用一个单独的线程来尽快提取可用的数据报并将缓冲区排队(无论如何指向缓冲区),以处理代码,否则会导致过多的时间使用和丢弃的数据报。
嘿 - 成功了!