2016-06-21 6 views
2

私はPythonでコーディングしています。python OpenCVセグメンテーションフォールト(コアダンプ)

(ASUSのKV55J | Ubuntuの14.04 |のpython 2.7.6(デフォルト、2015年6月22日、17時五十八分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を行うことができる2つの事がある何のフレームが存在しない場合でも、無限ループです。ループ中に(grabbed1, frame1) = camera_device.read()を外側に移動し、フレームがTrueの場合にのみループを実行するwhile grabbed1:を使用してこれを修正できます。このhereについて詳しく読むことができます。
  • クリックリスナーは無限ループ内にあります。ループ内にリスナーを配置する必要はありません。あなたはループの間に上記のcv2.setMouseCallback(frame_name, click_and_take_frame)を移動することができ、リソースの無駄遣いを止めるでしょう。
関連する問題