python OpenCV分段故障(核心转储)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python OpenCV分段故障(核心转储)相关的知识,希望对你有一定的参考价值。

我正在使用python进行编码,现在正在使用我的网络摄像头进行测试。

(华硕KV55J | Ubuntu 14.04 | python 2.7.6(默认,2015年6月22日,17:58:13)[GCC 4.8.2] | OpenCV版本'2.4.8')

我可以成功地从我的网络摄像头显示图像(非常简单的代码),但当我尝试设置鼠标回调到鼠标经过图像时(也是一个非常简单的代码),有一个很大的问题,几帧之后的分段错误(需要大约10/20秒才能失败,但如果我评论回调它将一直工作,直到按下“Ctrl-c”)。

有谁知道它为什么会发生?

我跑了这个并得到了这个错误(即使我不移动鼠标或按任何东西):

ncc@ncc-K55VJ:~/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()
答案

根据我过去的经验,当您超载机器资源时会发生此错误。

在你的情况下,有两件事可以做到这一点

  • 即使没有框架,while 1也是一个无限循环。您可以通过在循环中移动(grabbed1, frame1) = camera_device.read()来修正此问题,并使用while grabbed1:,如果框架为True,则仅运行循环。你可以阅读更多关于这个here的信息。
  • 您的单击侦听器位于无限循环内。将侦听器置于循环中是没有意义的。你可以在循环中移动cv2.setMouseCallback(frame_name, click_and_take_frame),你将不再浪费资源。

以上是关于python OpenCV分段故障(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中转储的分段故障核心

分段故障核心转储...?

分段故障核心转储在 Hermite 中

Centos docker容器因6分段故障而崩溃 - 这是核心转储

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误

C - 分段故障(核心转储)