Python 从ArDrone 2.0获取图像,并使用cv2

Python 从ArDrone 2.0获取图像,并使用cv2,python,string,opencv,ar.drone,Python,String,Opencv,Ar.drone,我试图从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_BGR2GR

我试图从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
回溯(最近一次呼叫最后一次):
文件“ArDrn/7/drony.py”,第14行,在
ret,frame=cap
TypeError:“非类型”对象不可编辑

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

在我看来,在尝试使用cap之前,您可能需要稍微更改逻辑以检查cap是否为无:

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是不存在的。此外,似乎您没有更新cap以在每个循环中指向一个新图像,因此这可能也是一个问题。

您没有做错什么

pydrone库不适用于AR.Drone 2.0视频流(我知道没有一个可以)

AR.Drone 2.0有两大变化:

  • 流在TCP上
  • 它基于H264,具有Parrot自定义标题
您可以使用
ffplay从无人机上观看视频tcp://192.168.1.1:5555
(可能会有可怕的延迟)


关于AR.Drone 2.0视频的更多信息,请参见。

正如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()

是的,这似乎解决了问题。然而,我刚刚意识到drone.image是一个字符串而不是图像。我只需要把它转换一下。