我想从使用Python(版本2.7或2.6)和PyObjC(版本2.2)内置到Macbook Pro中的Apple iSight摄像头捕获单帧。如何使用Python和PyObjC从Apple iSight捕获帧?
作为一个起点,我用this old StackOverflow问题。为了验证它是有道理的,我交叉引用了它似乎基于的Apple's MyRecorder示例。不幸的是,我的脚本不起作用。
我的大问题是:
- 我是否正确初始化相机?
- 我开始正确的事件循环?
- 有没有其他设置我应该做的?
在下面粘贴的示例脚本中,预期的操作是在调用startImageCapture()后,我应该开始打印CaptureDelegate的“Got a frame ...”消息。但是,相机的指示灯永远不会亮起,委托人的回叫从不执行。
另外,在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()
感谢您的帮助,您可以提供!
冷静的男人,顺便说一句,你应该标记自己的接受为'接受':) – 2011-02-04 23:12:26
这个脚本很好,但写入字节文件时失败。你应该改变open('filename','w')打开('filename','wb')以字节模式打开一个文件,然后它就可以工作。 – andli 2013-08-11 07:32:34