2009-10-16 4 views
5

Tengo el siguiente script PyObjC:¿Cómo puedo capturar marcos de iSight con Python en Snow Leopard?

from Foundation import NSObject 
import QTKit 
error = None 
capture_session = QTKit.QTCaptureSession.alloc().init() 
print 'capture_session', capture_session 
device = QTKit.QTCaptureDevice.defaultInputDeviceWithMediaType_(QTKit.QTMediaTypeVideo) 
print 'device', device, type(device) 
success = device.open_(error) 
print 'device open success', success, error 
if not success: 
    raise Exception(error) 
capture_device_input = QTKit.QTCaptureDeviceInput.alloc().initWithDevice_(device) 
print 'capture_device_input', capture_device_input, capture_device_input.device() 
success = capture_session.addInput_error_(capture_device_input, error) 
print 'session add input success', success, error 
if not success: 
    raise Exception(error) 
capture_decompressed_video_output = QTKit.QTCaptureDecompressedVideoOutput.alloc().init() 
print 'capture_decompressed_video_output', capture_decompressed_video_output 
class Delegate(NSObject): 
    def captureOutput_didOutputVideoFrame_withSampleBuffer_fromConnection_(self, captureOutput, videoFrame, sampleBuffer, connection): 
     print videoFrame, sampleBuffer, connection 
delegate = Delegate.alloc().init() 
print 'delegate', delegate 
capture_decompressed_video_output.setDelegate_(delegate) 
print 'output delegate:', capture_decompressed_video_output.delegate() 
success = capture_session.addOutput_error_(capture_decompressed_video_output, error) 
print 'capture session add output success', success, error 
if not success: 
    raise Exception(error) 
print 'about to run session', capture_session, 'with inputs', capture_session.inputs(), 'and outputs', capture_session.outputs() 
capture_session.startRunning() 
print 'capture session is running?', capture_session.isRunning() 
import time 
time.sleep(10) 

El programa de informes de errores, pero la luz verde del iSight no está habilitada y devolución de llamada captura de fotogramas del delegado nunca es llamado. Aquí está la salida me sale:

$ python prueba.py 
capture_session <QTCaptureSession: 0x1006c16f0> 
device Built-in iSight <objective-c class QTCaptureDALDevice at 0x7fff70366aa8> 
device open success (True, None) None 
capture_device_input <QTCaptureDeviceInput: 0x1002ae010> Built-in iSight 
session add input success (True, None) None 
capture_decompressed_video_output <QTCaptureDecompressedVideoOutput: 0x104239f10> 
delegate <Delegate: 0x10423af50> 
output delegate: <Delegate: 0x10423af50> 
capture session add output success (True, None) None 
about to run session <QTCaptureSession: 0x1006c16f0> with inputs (
    "<QTCaptureDeviceInput: 0x1002ae010>" 
) and outputs (
    "<QTCaptureDecompressedVideoOutput: 0x104239f10>" 
) 
capture session is running? True 

PD: Por favor, no responder yo debería tratar PySight, tengo pero no va a funcionar porque Xcode no puede compilar CocoaSequenceGrabber en 64 bits.

Respuesta

3

Su problema aquí es que no tiene un bucle de eventos. Si quieres hacer esto como un script independiente, tendrás que descubrir cómo crear uno. El PyObjC XCode plantillas configuradas automáticamente que para usted con:

from PyObjCTools import AppHelper 
AppHelper.runEventLoop() 

tratando de insertar que en la parte superior de su script, sin embargo, muestra que algo dentro AppHelper (probablemente NSApplicationMain) espera un archivo plist para extraer la clase principal de. Usted puede conseguir que mediante la creación de un archivo setup.py y el uso de py2app, algo así como este ejemplo de un PyObjc talk:

from distutils.core import setup 
import py2app 
plist = dict(
    NSPrincipalClass='SillyBalls', 
) 
setup(
    plugin=['SillyBalls.py'], 
    data_files=['English.lproj'], 
    options=dict(py2app=dict(
     extension='.saver', 
     plist=plist, 
    )), 
) 
+1

@ Dan: Gracias por el puntero! Es mi primera experiencia con la programación de Mac OS X y no tenía ni idea. Lo hice funcionar invocando 'AppHelper.runConsoleEventLoop()' en su lugar al final del script, sin necesidad de 'Plist'. Ahora mi problema es que toma el hilo principal y nunca vuelve. Esperaba envolverlo muy bien en un módulo de una manera no intrusiva. –

+0

Podría generar un hilo y manejarlo dentro del hilo, probablemente. QT no es inseguro, pero en este contexto todo lo que significa es que tienes que hacer todas tus cosas de QT en un hilo, que no es necesariamente el hilo principal. También puede consultar los temporizadores, pero creo que probablemente todavía necesite un bucle principal para eso. – Dan

+0

Aparentemente, tiene que ser el hilo principal. Si hago 'Thread (target = AppHelper.runConsoleEventLoop) .start()' en su lugar, me sale un montón de errores y nada funciona: '2009-10-20 12: 58: 32.075 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Objeto 0x1018065b0 de la clase NSCFString liberado automáticamente sin agrupación en su lugar - solo goteando 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Objeto 0x101821130 de la clase NSCFString liberado automáticamente sin piscina en su lugar - solo goteando 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Objeto 0x101828df0 de clase NSCFString autorelease' –

2

deben darle una oportunidad a motmot's camiface biblioteca de Andrew paja. También funciona con cámaras firewire, pero también funciona con isight, que es lo que estás buscando.

Desde el tutorial:

import motmot.cam_iface.cam_iface_ctypes as cam_iface 
import numpy as np 

mode_num = 0 
device_num = 0 
num_buffers = 32 

cam = cam_iface.Camera(device_num,num_buffers,mode_num) 
cam.start_camera() 
frame = np.asarray(cam.grab_next_frame_blocking()) 
print 'grabbed frame with shape %s'%(frame.shape,) 
+0

¡genial! gracias por el enlace –

+0

puede ver algunos ejemplos simples en http://www.incm.cnrs-mrs.fr/LaurentPerrinet/SimpleCellDemo – meduz

+0

esta es la biblioteca original: https://github.com/motmot/libcamiface – dashesy

Cuestiones relacionadas