首页 > 解决方案 > 将 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 打开。

如果您需要更多信息,请告诉我,我们将不胜感激。

标签: c++opencvstreaming

解决方案


如果您需要从网络上的 RPi 流式传输您的相机图像,根据您的需要,有很多方法可以做到这一点。

一种方法是使用高级应用程序,如MJPG streamerRPi IP Camera等。

另一种方法是,您可以使用 GStreamer、FFmpeg、 Raspistill等将相机图像流式传输到网络(通过 RTP、UDP 等)。使用这种方法,您需要有一个接收器应用程序来获取流(例如 FFmpeg)。

您在问题中已经说明了另一种方法,即直接访问相机并捕获图像,然后手动将它们传输到网络。使用这种方法,您可以更自由地修改设计(例如添加自己的压缩、加密等),但您应该自己处理网络协议。在您的示例中,您可以使用简单的 TCP/IP 套接字传输网络中的每个帧,或者您可以构建一个简单的 Web 服务器。很明显,您不能同时使用两个应用程序访问摄像头。您可以使用v4l2loopback创建多个相机接口并通过多个应用程序访问它们,但这不会解决您的问题。

有像rpi-webrtc-streamerstreameye这样的好项目,它们使用低级协议来传输图像。


推荐阅读