从ArDrone 2.0获取图像并使用cv2

1 投票
3 回答
2720 浏览
提问于 2025-05-01 10:13

我正在尝试从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 以指向新的图片,所以这也可能是个问题。

撰写回答