由于Raspberry Pi的处理能力有限,我需要在远程机器上处理相机输出。该机器是Linux服务器,应使用OpenCV处理视频数据。
我找到了一种技术上有效的解决方案,但在1280x720分辨率下产生了大约10秒的不可接受的高延迟,在640x360分辨率下产生了大约17秒的高延迟。也许这是由于某些缓冲区大小过大造成的?
所以,到目前为止我的解决方案:
在Raspberry PI上首先使用raspivid命令捕获视频,将此数据输出到标准输出并使用netcat进行传输:
raspivid --timeout 0 --nopreview --intra 2 --width 1280 --height 720 --framerate 20 --output - | nc 192.168.1.108 5555
然后在接收部分(在传输之前实际调用):
nc -l -p 5555 | ./receiver
其中receiver是一个C ++应用程序,包含以下源代码:
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
int main()
{
cv::VideoCapture cap("/dev/stdin");
if(!cap.isOpened())
{
std::cout << "Could not open '/dev/stdin'!" << std::endl;
return -1;
}
cv::namedWindow("Receiver");
cv::Mat frame;
while(cap.read(frame))
{
cv::imshow("Receiver", frame);
cv::waitKey(30);
}
cv::waitKey(0);
return 0;
}
问题
如何将raspicam输出传输到(Linux)服务器,并能够使用支持OpenCV的C ++应用程序处理此数据。在帧的传输和该帧的实际处理之间需要低等待时间(<400ms是可接受的)。
编辑:还需要高分辨率(1280x720或更高)。
如果有任何错误,请原谅我的英语!
答案 0 :(得分:0)
您可以使用QWebSockets(Qt5)。 您只需将图片从cv :: Mat转换为QByteArray并将其流式传输。 在720p,我通过LAN连接获得近15 FPS。