2016-11-05 74 views
1

当我在Mac OSX Sierra上的OpenCV中重新打开网络摄像头并显示其中的图像时,出现NSExceptions。OpenCV在Mac OSX Sierra上重新打开相机时崩溃并显示

这是我正在试图找出错误模式的测试代码。

import cv2 

cam = cv2.VideoCapture(0) 
ret, im = cam.read() 
cv2.imshow('im', im) 
cv2.waitKey(1) 

cam.open(0) 
ret, im = cam.read() 
cv2.imshow('im', im) 
cv2.waitKey(1) 

cam.open(0) 
ret, im = cam.read() 
cv2.imshow('im', im) 
cv2.waitKey(1) 

cam.open(0) 
ret, im = cam.read() 
cv2.imshow('im', im) 
cv2.waitKey(1) 

我得到的错误是

2016-11-05 18:15:07.075 Python[1082:24157] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x7fca4ac3a6f0 of class AVCaptureDALDevice was deallocated while key value observers were still registered with it. Current observation info: <NSKeyValueObservationInfo 0x7fca4ac42f80> (
<NSKeyValueObservance 0x7fca4ae6df50: Observer: 0x7fca4ae6b410, Key path: open, Options: <New: NO, Old: NO, Prior: NO> Context: 0x7fffc9c99570, Property: 0x7fca4ac3fe30> 
)' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00007fffafde96fb __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x00007fffc45f0a2a objc_exception_throw + 48 
    2 CoreFoundation      0x00007fffafe669a5 +[NSException raise:format:] + 197 
    3 Foundation       0x00007fffb17d1d84 NSKVODeallocate + 293 
    4 AVFoundation      0x00007fffac67dabe -[AVCaptureDeviceInput _setDevice:exceptionReason:] + 304 
    5 AVFoundation      0x00007fffac5ae914 -[AVCaptureDeviceInput dealloc] + 39 
    6 CoreFoundation      0x00007fffafe53a7b -[__NSSingleObjectArrayI dealloc] + 43 
    7 libobjc.A.dylib      0x00007fffc45e5e60 _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 808 
    8 CoreFoundation      0x00007fffafd20d66 _CFAutoreleasePoolPop + 22 
    9 CoreFoundation      0x00007fffafd612c5 __CFRunLoopRun + 2229 
    10 CoreFoundation      0x00007fffafd607b4 CFRunLoopRunSpecific + 420 
    11 HIToolbox       0x00007fffaf2fcfbc RunCurrentEventLoopInMode + 240 
    12 HIToolbox       0x00007fffaf2fcdf1 ReceiveNextEventCommon + 432 
    13 HIToolbox       0x00007fffaf2fcc26 _BlockUntilNextEventMatchingListInModeWithFilter + 71 
    14 AppKit        0x00007fffad9e6b79 _DPSNextEvent + 1093 
    15 AppKit        0x00007fffae0fc1c3 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1637 
    16 libopencv_highgui.2.4.dylib   0x000000010d79c0a6 cvWaitKey + 402 
    17 cv2.so        0x000000010cfa3ce1 _ZL16pyopencv_waitKeyP7_objectS0_S0_ + 103 
    18 Python        0x000000010cc001ab PyEval_EvalFrameEx + 27003 
    19 Python        0x000000010cbf963a PyEval_EvalCodeEx + 1617 
    20 Python        0x000000010cbf8fe3 PyEval_EvalCode + 48 
    21 Python        0x000000010cc1cc04 run_mod + 53 
    22 Python        0x000000010cc1cca7 PyRun_FileExFlags + 133 
    23 Python        0x000000010cc1c7f8 PyRun_SimpleFileExFlags + 702 
    24 Python        0x000000010cc2deba Py_Main + 3094 
    25 libdyld.dylib      0x00007fffc4ecd255 start + 1 
    26 ???         0x0000000000000002 0x0 + 2 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
Abort trap: 6 

我一直得到这个错误,当我从的iTerm或终端运行它。但是我从xterm中得到了不一致的结果。

在对cam.open(0)的所有调用之前使用cam.release()时,我也会得到相同的错误。

import cv2 

cam = cv2.VideoCapture(0) 
ret, im = cam.read() 
cv2.imshow('im', im) 
cv2.waitKey(1) 
cam.release() 

cam.open(0) 
ret, im = cam.read() 
cv2.imshow('im', im) 
cv2.waitKey(1) 
cam.release() 

cam.open(0) 
ret, im = cam.read() 
cv2.imshow('im', im) 
cv2.waitKey(1) 
cam.release() 

cam.open(0) 
ret, im = cam.read() 
cv2.imshow('im', im) 
cv2.waitKey(1) 
cam.release() 
+0

我不使用/知道Python,但它看起来像你叫'不止一次cam.open'更无需关闭。那是对的吗? –

+0

是的,我也通过'cam.open(0)'检查并自行发布。我也尝试过插入'cam.release()'调用。 (我已经更新了我的问题以澄清) – ramsey0

+0

我仍然不明白为什么你根本不需要调用'cam.open' - 你的第一帧似乎并不需要它。 –

回答

0

cap_avfoundation_mac.mm,功能CvCaptureCAM::stopCaptureDevice, 评论这条线:

[mCaptureDevice release]; 
相关问题