我目前正在使用来自鹦鹉的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 &"
所以我尝试了不同的选项以提高质量,但我无法让它发挥作用。 谢谢你的帮助。
我在Windows 10上使用最新的python版本
答案 0 :(得分:0)
我之前也曾与Bebop合作。我想很难在Bebop上提供视频流服务。因此,我尝试跟踪源代码以解决此质量较差的问题。
我注意到他(amymcgovern)自己编写了一个流服务器,您可以在pyparrot/networking/wifiConnection.py
中看到这些代码。但是我不知道如何构建更好的流服务器,我只是在寻找调整服务器的选项。
我发现两个选项是可编辑的:
第一个在pyparrot/Bebop.py
中。我们可以通过功能set_video_stream_video
设置流模式。它包含三种模式:low_latency
,high_realiability
,high_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
的文档。无论如何,我们现在有了另一架无人驾驶飞机,所以我没有花太多时间。