2016-11-05 90 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];