2016-11-05 1 views
1

Lorsque je rouvre une webcam dans OpenCV sous Mac OSX Sierra et que j'en affiche des images, j'obtiens NSExceptions.OpenCV se bloque lors de la réouverture de la caméra sous Mac OSX Sierra et de l'affichage

C'est le code de test avec lequel je travaille pour essayer de comprendre le mode d'erreur.

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) 

L'erreur que je reçois est

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 

Je reçois constamment cette erreur quand je le lance à partir iTerm ou terminal. Mais je l'obtiens de façon incohérente de xterm.

Je reçois également la même erreur lors de l'utilisation cam.release() avant tous les appels à cam.open(0).

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

Je n'utilise pas/Python sais, mais il semble que vous appelez 'cam.open' plus d'une fois sans fermer. Est-ce exact? –

+0

Oui, je l'ai aussi fait avec les vérifications et les libérations 'cam.open (0)'. J'ai également essayé ceci avec des appels 'cam.release()' insérés. (J'ai mis à jour ma question pour clarifier) ​​ – ramsey0

+0

Je ne comprends toujours pas pourquoi vous appelez 'cam.open' du tout - vous ne semblez pas en avoir besoin pour votre première image. –

Répondre

0

En cap_avfoundation_mac.mm, la fonction CvCaptureCAM::stopCaptureDevice, commentaire cette ligne:

[mCaptureDevice release];