Как я могу захватить кадры iSight с помощью Python в Snow Leopard?

У меня есть следующий скрипт PyObjC:

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) 

Программа не сообщает об ошибках, но зеленый свет iSight никогда не активируется, и обратный вызов захвата кадра делегата никогда не вызывается. Вот результат, который я получаю:

 $ 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 

PS: Пожалуйста, не отвечайте, я должен попробовать PySight, но я не буду работать, потому что Xcode не может скомпилировать CocoaSequenceGrabber на 64-битной основе.

2 Solutions collect form web for “Как я могу захватить кадры iSight с помощью Python в Snow Leopard?”

Ваша проблема в том, что у вас нет цикла событий. Если вы хотите сделать это как отдельный сценарий, вам нужно будет выяснить, как его создать. Шаблоны PyObjC XCode автоматически устанавливают для вас:

 from PyObjCTools import AppHelper AppHelper.runEventLoop() 

Однако попытка вставить это в начало вашего скрипта показывает, что что-то внутри AppHelper (возможно, NSApplicationMain ) ожидает, что файл NSApplicationMain будет извлекать основной класс. Вы можете получить это, создав файл setup.py и используя py2app , что-то вроде этого примера из беседы PyObjc :

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

Вы должны попытаться использовать библиотеку камбалов motmot от Andrew Straw. Он также работает с камерами FireWire, но он также работает с пространством, которое вы ищете.

Из учебника:

 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,) 
Python - лучший язык программирования в мире.