在 Raspberry 上的 python 中,opencv 的分段错误

Posted

技术标签:

【中文标题】在 Raspberry 上的 python 中,opencv 的分段错误【英文标题】:Segmentation fault with opencv, in python on Raspberry 【发布时间】:2015-01-03 13:14:38 【问题描述】:

我正在制作一个非常简单的程序,它使用 python 中的 opencv 从 Raspberry pi 相机捕获视频。我正在使用 Raspbian 作为操作系统。 我已经用 opencv 2.4.5 版本制作了一些程序,现在我已经安装了 opencv 2.4.9。 我曾经在以前版本的 opencv 上运行的所有程序现在都无法运行,我想我找到了程序给我错误的地方。 只是尝试启动以下代码:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
resAcquisitionWidth = 160
resAcquisitionHeight = 120
cap.set(3, resAcquisitionWidth);
cap.set(4, resAcquisitionHeight);
cv2.namedWindow('frame')  
i = 0
while(True):
    print(i)
    i = i + 1
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

我得到了错误

分段错误

我发现如果我运行相同的代码,但不尝试调整分辨率(因此在第 7-8 行没有 cap.set() 命令),一切正常。所以它应该与此相关。 我已经看过其他关于类似错误的帖子,所有这些似乎都是出于其他原因。 有人知道原因可能是什么吗?

【问题讨论】:

您有连接到 RPi 的显示器吗?你是如何访问它的? 我实际上是在 ssh 通道中显示输出。我在我的电脑上安装了 Xming,并自动启动显示输出的窗口会话。正如我所写,我已经用另一个版本的 opencv 完成了所有这些,在这种情况下一切正常。 我忘了说这个程序会显示视频的前 4 帧。我将 cv2.waitkey() 的参数从 1 更改为 0,并按下按钮“q”控制帧的更改(如您在代码中所见)。它向我显示了前四帧,然后出现错误! ...这真的很奇怪。 分别使用cap.getcap.grab(而不是组合的cap.read)并检查cap.get是否失败?!? 【参考方案1】:

问题可能是 y0u 4re n0t c0d1ng s4f3ly

cap = cv2.VideoCapture(0)
if not cap:
    print "!!! Failed VideoCapture: unable to open device 0"
    sys.exit(1)

cap.set() 被调用时,您对正在发生的事情的描述可以被视为capnull 的证据,因此发生了崩溃。当VideoCapture() 无法打开该设备时会发生这种情况。

这是什么意思?

摄像头不是设备0(试试其他号码); 摄像头可能未安装(驱动程序问题)或未正确连接到您的设备; OpenCV 不支持相机。

然而,在与 OP(提出问题的人)交换了几条消息后,很明显崩溃的可能原因是相机不支持指定的分辨率。这就是为什么检查 API 并注意函数的返回如此重要的原因。这似乎只是 n0t c0d1ng s4f3ly 的另一种情况。

According to the docs、set() 根据操作的成功/失败返回真/假:

Python:cv.SetCaptureProperty(capture, property_id, value) → retval

确保测试这些调用的返回,如果set()失败,不要让程序继续执行。

【讨论】:

相机是设备 0,因为如果我不使用 set() 函数,一切正常。出于同样的原因,我可以告诉你相机已安装。考虑到我也将此相机与其他版本的 OpenCV 一起使用,OpenCV 支持相机(出于与以前相同的原因)。奇怪的是,我可以看到第一个 4 帧! 我尝试使用 CV_CAP_PROP_FRAME_WIDTH 和 CV_CAP_PROP_FRAME_HEIGHT 而不是 3 和 4,但它给了我错误:“NameError: name 'CV_CAP_PROP_FRAME_WIDTH' is not defined”。如果我尝试检查 cap.read() 返回的帧是否为空,我仍然会收到错误,因为当我调用该函数时错误就会出现。 新成就:如果我设置为 64X64 或 320X240,它就可以工作。相反,如果我设置 320X280,它会给我同样的错误。我还没有尝试任何其他解决方案。但问题仍然存在...... 似乎驱动拒绝了一些任意尺寸。这很正常。 :) 正常吗? ...我的意思是,160X120 曾经在 OpenCV 2.4.5 中为我工作。而且我们必须考虑到 160X120 是非常传统的 4:3 分辨率。

以上是关于在 Raspberry 上的 python 中,opencv 的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

Raspberry Pi 3(服务器)上的 Python 蓝牙错误

使用 Raspberry 和 python 读取 USB RFID

Raspberry Pi 上的 Gnuplot,绘图到 X11 终端,我怎样才能重用同一个 X 窗口?

Raspberry Pi 上的 OpenCV 人脸检测速度很慢

Raspberry Pi - Python 中的 GPIO 事件

如何使用 Python 在 Raspberry Pi 上杀死 omxplayer 播放器