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)