2016-06-21 3 views
2

저는 파이썬으로 코딩 중이며 현재 테스트를 위해 웹캠을 사용하고 있습니다.python OpenCV Segmentation 오류 (코어 덤프)

(ASUS의 KV55J | 우분투 14.04 | 파이썬 2.7.6 (기본 이세 (22) 2015 년 17시 58분 13초) [GCC 4.8.2] | OpenCV의 버전 '2.4.8')

I 내 웹캠 (아주 간단한 코드)에서 이미지를 성공적으로 보여줄 수 있지만 마우스 콜백을 설정할 때 마우스가 이미지 (매우 간단한 코드)를 지나칠 때 큰 문제가 발생합니다. 여러 프레임 후에 세그먼트 오류가 발생합니다. 약 10/20seconds 실패하지만 내가 "Ctrl-c"누를 때까지 작동합니다 콜백 주석 경우).

왜 그런 일이 발생하는지 알고 있습니까?

나는 이것을 실행하고 (난 아무것도 마우스를 이동하거나 누르면 해달라고 경우에도)이 오류가 발생했습니다 : 나는 beggining에 있었다

[email protected]:~/Desktop/testes_python/gui$ python a_teste_capture.py 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
Left mouse button pushed 
Left mouse button pushed 
Left mouse button pushed 
Left mouse button pushed 
Left mouse button pushed 
Segmentation fault (core dumped) 

간단한 코드가 있었다 :

import cv, cv2 

def click_and_take_frame(event, x, y, flags, param): 

    if event == cv2.EVENT_LBUTTONDOWN: 
     print 'Left mouse button pushed' 


def main_function(): 
    camera_device=cv2.VideoCapture(0) 
    frame_name="Segmentation fault (core dumped) TEST WINDOW" 
    cv2.namedWindow(frame_name, cv2.WINDOW_AUTOSIZE) 

    while 1: 
     (grabbed1, frame1) = camera_device.read() 
     frame1= cv2.cvtColor(frame1, cv2.CV_8U) 
     cv2.imshow(frame_name, frame1) 
     cv2.setMouseCallback(frame_name, click_and_take_frame) 
     key = cv2.waitKey(1) & 0xFF 

    cv2.destroyAllWindows()  # Closes displayed windows 


if __name__ == '__main__': 
    import sys 

    main_function() 
+0

OS X에서 코드를 실행할 때 segfault를 재현 할 수 없습니다. 해당 플랫폼에서 제대로 작동하는 것 같습니다. – Aurelius

답변

0

에 따르면 내 과거의 경험이 오류는 기계 리소스를 오버로드 할 때 발생합니다. 귀하의 경우에는

  • while 1을 할 수있는 두 가지 더 프레임이없는 경우에도 무한 루프가되어 있습니다. 루프 중에 (grabbed1, frame1) = camera_device.read()을 이동하고 프레임이 True 인 경우에만 루프를 실행하는 while grabbed1:을 사용하여이 문제를 해결할 수 있습니다. 이 here에 대해 자세히 알아볼 수 있습니다.
  • 클릭 수신기가 무한 루프 안에 있습니다. 루프 안에 리스너를 배치 할 필요가 없습니다. 위의 cv2.setMouseCallback(frame_name, click_and_take_frame)을 반복하면서 이동할 수 있으며 리소스 낭비를 막을 수 있습니다.