麻烦从Bebop 2获取视频流(python,open cv和ffmpeg)

时间:2018-05-23 16:43:03

标签: python opencv ffmpeg

我目前正在使用来自鹦鹉的Bebop 2无人机,我想从bebop获取视频流并使用我得到的帧。为了控制bebop我使用这个库:https://github.com/amymcgovern/pyparrot

首先,我尝试通过打开bebop使用的sdp文件来使用opencv来使用此代码流式传输视频:

capture = cv2.VideoCapture('./bebop.sdp')

    while True :
        rt,img = capture.read()
        cv2.imshow("cam",img)
        cv2.waitKey(10)

这是sdp文件的内容:

c=IN IP4 192.168.42.1
m=video 55004 RTP/AVP 96
a=rtpmap:96 H264/90000

但是我收到了这个错误

[rtp @ 0000020b890b3300] Protocol 'rtp' not on whitelist 'file,crypto'!
warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:808)
warning: ./bebop.sdp (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:809)
False
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp, line 331
Traceback (most recent call last):
 File "pilotage.py", line 109, in <module>
   _main_(args)
 File "pilotage.py", line 56, in main
   cv2.imshow('drone view',im)
cv2.error: C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:331: error: (-215) size.width>0 && size.height>0 in function cv::imshow

我已经看到这是由于opencv使用的ffmpeg命令不包含选项-protocol_whitelist 因此,我尝试使用此命令直接使用ffmpeg获取图像

"ffmpeg -protocol_whitelist \"file,rtp,udp\"  -i  ./bebop.sdp -r 30 -b:v 800k image_%03d.png &"

但是我得到的图像很糟糕而且毫无用处。 像这个 : bad quality photo

所以我尝试了不同的选项以提高质量,但我无法让它发挥作用。 谢谢你的帮助。

我在Windows 10上使用最新的python版本

1 个答案:

答案 0 :(得分:0)

我之前也曾与Bebop合作。我想很难在Bebop上提供视频流服务。因此,我尝试跟踪源代码以解决此质量较差的问题。

我注意到他(amymcgovern)自己编写了一个流服务器,您可以在pyparrot/networking/wifiConnection.py中看到这些代码。但是我不知道如何构建更好的流服务器,我只是在寻找调整服务器的选项。

我发现两个选项是可编辑的:

第一个在pyparrot/Bebop.py中。我们可以通过功能set_video_stream_video设置流模式。它包含三种模式:low_latencyhigh_realiabilityhigh_reliability_low_framerate。我认为我们可以尝试不同的模式。

第二个在pyparrot/DroneVision.py中。它在self.fps中包含一个选项__init__,我认为我们可以降低帧速率以提高图片质量并减少系统负载。

顺便说一句,ffmpeg -protocol_whitelist xxxxxx会引起ffmpeg解析参数错误,我想您可以在pyparrot/DroneVision.py中注释该部分。(命令字符串存储在名为{{1的变量中}})我有一个类似的解决方案,就像我一样,我只是使用另一个程序来保存这些图片。我使用cmdStr连接到流媒体,并每秒将图片保存到jpeg文件中。

mplayer

也许我可以使用mplayer -vo jpeg -sstep 1 bebop.sdp 连接到流服务器,但是我厌倦了阅读ffmpeg的文档。无论如何,我们现在有了另一架无人驾驶飞机,所以我没有花太多时间。