1

我正在尝试从 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

有人可以告诉我我做错了什么吗?

4

3 回答 3

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 以在每个循环中指向一个新图像,因此这也可能是一个问题。

于 2014-11-04T01:11:44.883 回答
1

你没有做错什么。

pydrone 库不适用于 AR.Drone 2.0 视频流(我不知道有)。

AR.Drone 2.0 有两大变化:

  • 流在 TCP 上;
  • 它基于 H264,带有 Parrot 自定义标头。

您可以使用无人机观看视频ffplay tcp://192.168.1.1:5555(可能具有可怕的延迟)。

开发论坛中有更多关于 AR.Drone 2.0 视频的信息。

于 2014-12-07T23:13:07.083 回答
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()
于 2015-06-02T08:04:16.107 回答