Как захватывать кадры из Apple iSight с помощью Python и PyObjC?

Я пытаюсь захватить один кадр с камеры Apple iSight, встроенной в Macbook Pro, с использованием Python (версия 2.7 или 2.6) и PyObjC (версия 2.2).

В качестве отправной точки я использовал этот старый вопрос StackOverflow . Чтобы убедиться, что это имеет смысл, я сделал перекрестную ссылку на пример Apple MyRecorder , на котором он, похоже, основан. К сожалению, мой сценарий не работает.

Мои большие вопросы:

  • Правильно ли я инициализирую камеру?
  • Правильно ли я запускаю цикл событий?
  • Существовали ли какие-либо другие настройки, которые я должен был выполнить ?

В примере скрипта, вставленном ниже, предполагаемая операция заключается в том, что после вызова startImageCapture () я должен начать печатать сообщения «Получил кадр ...» из CaptureDelegate. Однако камера ' Индикатор никогда не загорается, и обратный вызов делегата никогда не выполняется.

Кроме того, во время startImageCapture () нет сбоев, все функции утверждают, что завершились успешно, и он успешно находит устройство iSight. Анализ объекта сеанса в pdb показывает, что он имеет допустимые объекты ввода и вывода, для вывода назначен делегат, устройство не используется другими процессами и сеанс помечается как запущенный после вызова startRunning ().

Вот код:

#!/usr/bin/env python2.7

import sys
import os
import time
import objc
import QTKit
import AppKit
from Foundation import NSObject
from Foundation import NSTimer
from PyObjCTools import AppHelper
objc.setVerbose(True)

class CaptureDelegate(NSObject):
    def captureOutput_didOutputVideoFrame_withSampleBuffer_fromConnection_(self, captureOutput, 
                                                                           videoFrame, sampleBuffer, 
                                                                           connection):
        # This should get called for every captured frame
        print "Got a frame: %s" % videoFrame

class QuitClass(NSObject):
    def quitMainLoop_(self, aTimer):
        # Just stop the main loop.
        print "Quitting main loop."
        AppHelper.stopEventLoop()


def startImageCapture():
    error = None

    # Create a QT Capture session
    session = QTKit.QTCaptureSession.alloc().init()

    # Find iSight device and open it
    dev = QTKit.QTCaptureDevice.defaultInputDeviceWithMediaType_(QTKit.QTMediaTypeVideo)
    print "Device: %s" % dev
    if not dev.open_(error):
        print "Couldn't open capture device."
        return

    # Create an input instance with the device we found and add to session
    input = QTKit.QTCaptureDeviceInput.alloc().initWithDevice_(dev)
    if not session.addInput_error_(input, error):
        print "Couldn't add input device."
        return

    # Create an output instance with a delegate for callbacks and add to session
    output = QTKit.QTCaptureDecompressedVideoOutput.alloc().init()
    delegate = CaptureDelegate.alloc().init()
    output.setDelegate_(delegate)
    if not session.addOutput_error_(output, error):
        print "Failed to add output delegate."
        return

    # Start the capture
    print "Initiating capture..."
    session.startRunning()


def main():
    # Open camera and start capturing frames
    startImageCapture()

    # Setup a timer to quit in 10 seconds (hack for now)
    quitInst = QuitClass.alloc().init()
    NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(10.0, 
                                                                             quitInst, 
                                                                             'quitMainLoop:', 
                                                                             None, 
                                                                             False)
    # Start Cocoa's main event loop
    AppHelper.runConsoleEventLoop(installInterrupt=True)

    print "After event loop"


if __name__ == "__main__":
    main()

Спасибо за любую помощь, которую вы можете оказать!

11
задан Community 23 May 2017 в 12:00
поделиться