cv2.videocapture.read() не возвращает пустой массив

У меня есть этот код, пытающийся захватить кадр с моей веб-камеры на Raspberry Pi и сохранить его как изображение. Я использую OpenCV 2, но я получаю странные ошибки при запуске кода..

import time
import sys
from subprocess import call
import ftputil
import cv2

cam = cv2.VideoCapture()
#cam.set(CV_CAP_PROP_FRAME_WIDTH, 640)
#cam.set(CV_CAP_PROP_FRAME_HEIGHT, 480)


while True:
        #call("streamer -q -f jpeg -s 640x480 -o ./current.jpeg", shell=True)
        #time.sleep(0.2);
        #call("killall -q streamer", shell=True)
        cam.open(-1)
        image = cam.read()
        cv2.imwrite("current.jpeg",image)
        host = ftputil.FTPHost()
        #host.remove("/domains//public_html/webcam.jpg")
        host.upload("./current.jpeg", "/domains//public_html/webc$
        host.close()
        host = ftputil.FTPHost()
        filename = str(time.time()) + ".jpg"
        #host.remove("/domains//public_html/webcam.jpg")
        host.upload("./current.jpeg", "/webcamarchive/"+filename, mode='b')
        host.close()
        time.sleep(10);

Вы можете игнорировать часть ftp и закомментированные строки. Вот что возвращает программа:

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

Что здесь не так?

4 ответа

Решение

Чтение (cam.read()) из VideoCapture возвращает кортеж (return value, image), С первым пунктом вы проверяете, было ли чтение успешным, и если это так, вы переходите к использованию возвращенного image,

Это задокументировано по адресу http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html

Все, что сказал MMGP, на месте; cam.read() сначала возвращает логическое значение, указывающее, было ли чтение успешным, а затем само изображение (которое будет пустым, если возвращаемое значение было False). Также обратите внимание, что если вы не используете возвращаемое значение для чего-либо, вы можете просто установить эту часть на _, который говорит Python "игнорировать меня"; эта линия будет выглядеть примерно так _, image = cam.read(), Кроме того, обычно рекомендуется указывать индекс, в котором находится ваша камера (обычно 0, если у вас подключена только одна камера) при вызове. cv2.VideoCapture()Таким образом, в случае, если у вас есть несколько подключенных камер, OpenCV знает, с какой камеры читать (в противном случае он может просто зависнуть, потому что не знает, что делать).

Вы должны использовать аргументы в cv2.VideoCapture()

Попробуйте сделать снимок с камеры по умолчанию

cam = cv2.VideoCapture(0)

Попробуй это захватить с ip камеры

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

если вы пытаетесь захватить видео с помощью встроенной веб-камеры, то следующая строка кода даст вам наилучшие результаты. cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

Другие вопросы по тегам