c++ - 将 OpenCV cv::Mat 图像流式传输到网站(html5 页面)
问题描述
我使用 OpenCV 在树莓派上运行 c++ 代码来处理相机输入(形式和颜色检测)。这是我从 pi cam 捕获图像的线程:
(变量名称是法语,对此感到抱歉)
Mat imgOriginal;
VideoCapture camera;
int largeur = camPartage->getLargeur();
int hauteur = camPartage->getHauteur();
camera.open(0);
if ( !camera.isOpened() )
{
screen->dispStr(10,1,"Cannot open the web cam");
}
else
{
screen->dispStr(10,1,"Open the web cam");
camera.set(CV_CAP_PROP_FRAME_WIDTH,largeur);
camera.set(CV_CAP_PROP_FRAME_HEIGHT,hauteur);
camera.set(CV_CAP_PROP_FPS,30);
}
while(1)
{
if(largeur != camPartage->getLargeur() || hauteur != camPartage->getHauteur())
{
largeur = camPartage->getLargeur();
hauteur = camPartage->getHauteur();
camera.set(CV_CAP_PROP_FRAME_WIDTH,largeur);
camera.set(CV_CAP_PROP_FRAME_HEIGHT,hauteur);
}
camera.grab();
camera.retrieve(imgOriginal);
camPartage->setImageCam(imgOriginal); //shared object
if(thread.destruction == DESTRUCTION_SYNCHRONE)
{
pthread_testcancel();
}
usleep(20000);
}
现在,我想将这些图像流式传输到我在另一个树莓派上托管的网站。我研究了 gstreamer、ffmpeg 和套接字,但在 c++ 中没有找到任何对我有用的好例子。我试图获得尽可能低的延迟。
有些人建议使用 raspistill,但我无法在另一个程序中打开相机,因为它已经被 OpenCV 打开。
如果您需要更多信息,请告诉我,我们将不胜感激。
解决方案
如果您需要从网络上的 RPi 流式传输您的相机图像,根据您的需要,有很多方法可以做到这一点。
一种方法是使用高级应用程序,如MJPG streamer、RPi IP Camera等。
另一种方法是,您可以使用 GStreamer、FFmpeg、 Raspistill等将相机图像流式传输到网络(通过 RTP、UDP 等)。使用这种方法,您需要有一个接收器应用程序来获取流(例如 FFmpeg)。
您在问题中已经说明了另一种方法,即直接访问相机并捕获图像,然后手动将它们传输到网络。使用这种方法,您可以更自由地修改设计(例如添加自己的压缩、加密等),但您应该自己处理网络协议。在您的示例中,您可以使用简单的 TCP/IP 套接字传输网络中的每个帧,或者您可以构建一个简单的 Web 服务器。很明显,您不能同时使用两个应用程序访问摄像头。您可以使用v4l2loopback创建多个相机接口并通过多个应用程序访问它们,但这不会解决您的问题。
有像rpi-webrtc-streamer和streameye这样的好项目,它们使用低级协议来传输图像。
推荐阅读
- java - 在 Feign Client 中使用 spring form 编码器时,请求正文未正确编码和隐藏
- node.js - Discord.js 多个命令
- datatables - 将行添加为 DOM 节点时如何应用排序
- python - 维恩图显示数据框中 NaN 的绝对数量
- python - 从字典中读取 file_path 并稍后在管道中使用另一个键值对
- javascript - 如何使用 module.export 将 javascript 中的特定变量导出到节点
- google-api - 是否可以将 DV360 API 用于 youtube 广告系列?
- php - Laravel 路由调用了两次。[有HTTPS请求]
- loops - 使用 VLC 上的批处理文件播放歌曲 3 次
- android - 在 PhonecallReceiver 中更新 SQLite 时更新 recyclerview