2009-10-16 6 views
5

У меня есть следующий сценарий: PyObjCКак я могу захватить рамки iSight с помощью Python в 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) 

Программа отчетов без ошибок, но зеленый свет 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 в 64bit.

ответ

3

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

from PyObjCTools import AppHelper 
AppHelper.runEventLoop() 

Попытки вставить, что в верхней части вашего сценария, однако, показывает, что что-то внутри AppHelper (вероятно NSApplicationMain) ожидает PLIST файла для извлечения основного класса из. Вы можете получить, что путем создания setup.py файла и используя py2app, что-то вроде этого примера из 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: Спасибо за указатель! Это мой первый опыт в программировании на Mac OS X, и я был абсолютно невежественным. Я получил его для работы с вызовом 'AppHelper.runConsoleEventLoop()' вместо этого в конце скрипта, нет необходимости в 'Plist'. Теперь моя проблема в том, что он берет на себя основной поток и никогда не возвращается. Я надеялся обернуть его в модуле неинтрузивным способом. –

+0

Возможно, вы можете создать поток и обработать его внутри потока. QT не является потокобезопасным, но в этом контексте все это означает, что вам нужно делать все ваши вещи QT в одном потоке, что не обязательно является основным потоком. Вы также можете заглянуть в таймеры, но я думаю, вам, вероятно, все еще нужен основной цикл для этого. – Dan

+0

По-видимому, это должен быть основной поток. Если я делаю 'Thread (target = AppHelper.runConsoleEventLoop) .start()' вместо этого, я получаю кучу ошибок и ничего не работает: '2009-10-20 12: 58: 32.075 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Объект 0x1018065b0 класса NSCFString автореализован без пула на месте - просто утечка 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Объект 0x101821130 класса NSCFString, автореализованный без бассейн на месте - просто утечка 2009-10-20 12: 58: 32.078 Python [2054: 4903] *** __NSAutoreleaseNoPool(): Объект 0x101828df0 класса NSCFString autorelease' –

2

Вы должны дать попробовать на motmot's camiface библиотеку от Эндрю Стро. Он также работает с камерами 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,) 
+0

классный! спасибо за ссылку –

+0

вы можете увидеть несколько простых примеров на http://www.incm.cnrs-mrs.fr/LaurentPerrinet/SimpleCellDemo – meduz

+0

это оригинальная библиотека: https://github.com/motmot/libcamiface – dashesy

 Смежные вопросы

  • Нет связанных вопросов^_^