我有一个使用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已打开相机,所以我无法在其他程序中打开相机。
如果您需要更多信息,请告诉我,我们将为您提供帮助。
答案 0 :(得分:0)
如果需要从网络上的RPi流式传输摄像机图像,则可以根据需要采用多种方法来实现。
一种方法是使用MJPG streamer,RPi IP Camera等高级应用程序。
另一种方法是,您可以使用GStreamer,FFmpeg,Raspistill等通过流传输将摄像机图像抛出网络(通过RTP,UDP等)。通过这种方法,您需要具有接收器应用程序才能获取流(例如FFmpeg)。
您已经在问题中提到了另一种方法,即直接访问相机并捕获图像,然后手动将其传输到网络上。使用这种方法,您可以自由地修改设计(例如添加自己的压缩,加密等),但是您应该自己照顾网络协议。 在您的示例中,您可以使用简单的TCP / IP套接字传输网络中的每个帧,也可以构建简单的Web服务器。显然,您无法同时使用两个应用程序访问凸轮。您可以使用v4l2loopback创建多个摄像头界面并通过多个应用程序访问它们,但这并不能解决您的问题。
有rpi-webrtc-streamer和streameye这样的好项目,它们使用低级协议来传输图像。