代码之家  ›  专栏  ›  技术社区  ›  Martin Blech

我怎样才能用雪豹中的巨蟒捕捉到视觉画面?

  •  5
  • Martin Blech  · 技术社区  · 16 年前

    我有以下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
    

    附言:请不要回答,我应该试试pysight,我有,但它不会工作,因为xcode不能编译64位的cocoasequencegrabber。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Dan    16 年前

    这里的问题是您没有事件循环。如果您想作为一个独立的脚本来完成这项工作,您必须弄清楚如何创建一个脚本。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,
        )),
    )
    
        2
  •  2
  •   meduz    16 年前

    你应该尝试一下 motmot's camiface 安德鲁·斯特劳的图书馆。它也适用于FireWire摄像头,但它也适用于您正在寻找的isLight。

    从教程中:

    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,)
    
    推荐文章