【问题标题】:cv2.videocapture.read() does not return a numpy arraycv2.videocapture.read() 不返回 numpy 数组
【发布时间】:2012-12-21 11:48:50
【问题描述】:

我有这段代码试图从树莓派上的网络摄像头捕获帧,并将其保存为图像。我使用opencv 2,但运行代码时出现奇怪的错误..

import time
import sys
from subprocess import call
import cv2

cam = cv2.VideoCapture()

while True:
        cam.open(-1)
        image = cam.read()
        cv2.imwrite("current.jpeg",image)
        time.sleep(10);

这是程序返回的内容:

VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument

Traceback (most recent call last):
  File "kvamskogen.py", line 18, in <module>
    cv2.imwrite("current.jpeg",image)
TypeError: <unknown> is not a numpy array

这里有什么问题?

【问题讨论】:

  • "您可以忽略 ftp 部分和注释行。" - 你应该编辑不相关的部分,以帮助那些试图帮助你的人。而不是a)在您的示例中留下额外的代码和b)解释为什么它不相关。见sscce.org

标签: python opencv v4l2 ftputil


【解决方案1】:

VideoCapture 读取 (cam.read()) 会返回一个元组 (return value, image)。使用第一项检查读取是否成功,如果成功则继续使用返回的image

这记录在https://opencv-tutorial.readthedocs.io/en/latest/intro/intro.html#capture-live-video

【讨论】:

  • @mmpg 你知道 cam.read() 异常的原因是什么吗?我有一个应用程序,运行一段时间后开始从cam.read() 引发异常。它使用.set(3, 640).set(4, 360) 显示预览帧,但使用.set(3, 1920).set(4, 1080) 引发异常NULL object passed to Py_BuildValuecam.read() 甚至不能在元组中返回 False,它只会崩溃。
【解决方案2】:

mmgp 所说的一切都是正确的; cam.read() 首先返回一个布尔值,指示读取是否成功,然后返回图像本身(如果返回值为False,则为空)。另请注意,如果您不使用任何返回值,则可以将该部分设置为_,这会告诉Python“忽略我”;那条线看起来像_, image = cam.read()。此外,在调用cv2.VideoCapture() 时,指定您的相机所在的索引(通常为 0,如果您只连接一台相机)通常是一个好习惯,这样,如果您确实连接了多台相机,OpenCV 知道从哪个摄像头读取(否则它可能会因为不知道该怎么做而崩溃)。

【讨论】:

  • FWIW,调用变量 _ 不会告诉 Python 任何事情。 Python 只是将其视为另一个变量名。这只是程序员用来告诉自己和其他人你没有用这个值做任何事情的约定。
【解决方案3】:

你应该在cv2.VideoCapture()中使用参数

尝试使用默认相机进行拍摄

cam = cv2.VideoCapture(0)

试试这个从网络摄像机捕捉

cam = cv2.VideoCapture('http://ip-address') # to check video source's ip address right click video and select "copy image address" and put the exact address in above line of code

【讨论】:

    【解决方案4】:

    如果您尝试使用内置网络摄像头捕捉视频,那么以下代码行将为您提供最佳效果 cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

    【讨论】:

      猜你喜欢
      • 2017-07-29
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      相关资源
      最近更新 更多