cv2.videocapture.read () no devuelve una matriz numpy

Tengo este código tratando de capturar un cuadro de mi cámara web en la raspberry pi y guardarlo como imagen. Uso opencv 2, pero obtengo errores extraños cuando ejecuto el código …

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); 

Puede ignorar la parte ftp y las líneas comentadas. Esto es lo que devuelve el progtwig:

 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  cv2.imwrite("current.jpeg",image) TypeError:  is not a numpy array 

¿Que esta mal aquí?

La lectura ( cam.read() ) de un VideoCapture devuelve una tupla (return value, image) . Con el primer elemento, usted verifica si la lectura fue exitosa, y si lo fue, entonces procede a usar la image devuelta.

Esto se documenta en http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html

Todo lo que dice mmgp es acertado; cam.read() devuelve primero un valor booleano que indica si la lectura fue exitosa, y luego la imagen en sí (que estará vacía si el valor de retorno es False ). También tenga en cuenta que si no está utilizando el valor de retorno para nada, solo puede establecer esa parte en _ , lo que le dice a Python “ignóreme”; esa línea se vería entonces como _, image = cam.read() . Además, generalmente es una buena práctica especificar el índice en el que se encuentra su cámara (generalmente 0 si solo tiene una cámara conectada) al llamar a cv2.VideoCapture() , de modo que, en caso de que tenga varias cámaras conectadas, OpenCV sabe de qué cámara leer (de lo contrario, podría bloquearse porque no sabe qué hacer).

Deberías usar argumentos en cv2.VideoCapture()

Intenta esto para capturar desde la cámara por defecto

 cam = cv2.VideoCapture(0) 

Intenta esto para capturar desde la cámara 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