从ArDrone 2.0获取图像并使用cv2
我正在尝试从ArDrone 2.0获取图像,并使用Python的OpenCV库(也就是cv2)来处理这些图像,并创建一个控制器。
这是我的代码:
import cv2
import numpy as np
from pydrone import libardrone
drone = libardrone.ARDrone()
cap = drone.image
while(True):
ret, frame = cap
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
但是,我一直遇到这个问题:
Traceback (most recent call last):
File "ArDrn/7/drony.py", line 14, in <module>
ret, frame = cap
TypeError: 'NoneType' object is not iterable
有人能告诉我我哪里出错了吗?
3 个回答
1
正如mangon提到的,libardrone这个库在视频支持方面有问题。不过,你并不需要依赖libardrone来获取视频流。下面是一个使用OpenCV的简单示例:
import cv2
cam = cv2.VideoCapture('tcp://192.168.1.1:5555')
running = True
while running:
# get current frame of video
running, frame = cam.read()
if running:
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == 27:
# escape key pressed
running = False
else:
# error reading frame
print 'error reading video feed'
cam.release()
cv2.destroyAllWindows()
1
你没有做错什么。
pydrone这个库不支持AR.Drone 2.0的录像流(我也不知道有没有其他库能支持)。
AR.Drone 2.0有两个主要的变化:
- 视频流是通过TCP传输的;
- 它使用的是H264编码,并且有Parrot自定义的头信息。
你可以通过输入 ffplay tcp://192.168.1.1:5555
来查看无人机的视频(可能会有很大的延迟)。
关于AR.Drone 2.0视频的更多信息,可以在 开发论坛 上找到。
1
我觉得你可能需要稍微调整一下逻辑,先检查一下 cap 是否为 None,然后再去使用它:
while(True):
cap = drone.image
if not cap:
time.sleep(0.1) # or something to save just a touch of CPU spin time, optional
continue
ret, frame = cap
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
可能在切换图片的过程中,cap 会有一段时间是 None。此外,看起来你在每次循环中并没有更新 cap 以指向新的图片,所以这也可能是个问题。