将OpenCV cv :: Mat图片流式传输到网站(html5页)

时间:2019-05-07 17:13:01

标签: c++ opencv streaming

我有一个使用OpenCV在树莓派上运行的c ++代码来处理相机输入(形式和颜色检测)。这是我从pi摄像头捕获图像的线程:

(变量名称为法语,对此感到抱歉)

    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已打开相机,所以我无法在其他程序中打开相机。

如果您需要更多信息,请告诉我,我们将为您提供帮助。

1 个答案:

答案 0 :(得分:0)

如果需要从网络上的RPi流式传输摄像机图像,则可以根据需要采用多种方法来实现。

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

另一种方法是,您可以使用GStreamer,FFmpeg,Raspistill等通过流传输将摄像机图像抛出网络(通过RTP,UDP等)。通过这种方法,您需要具有接收器应用程序才能获取流(例如FFmpeg)。

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

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