我正在尝试从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
有人可以告诉我,我做错了吗?
答案 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
可能是当它处于切换图像的中间或类似的时间时,可能存在上限为无的一段时间。此外,您似乎没有更新上限指向每个循环的新图像,因此可能也是一个问题。
答案 1 :(得分:1)
你没有做错任何事。
pydrone库不能与AR.Drone 2.0视频流一起使用(我也不知道)。
AR.Drone 2.0有两个主要变化:
您可以使用ffplay tcp://192.168.1.1:5555
查看无人机中的视频(可能具有可怕的延迟)。
development foruns中有关于AR.Drone 2.0视频的更多信息。
答案 2 :(得分: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()