视频播放了几帧然后出现错误

时间:2019-05-21 07:12:10

标签: python-3.x opencv raspberry-pi

我正在研究树莓派pi3 b +模型 我在树莓派上安装了opencv 3.4.4,并且安装正确。我只是运行基本代码以查看我的相机输出。 (我已经插入了两个摄像头)

这是代码。

import cv2
import time


def show_webcam(mirror=False):
    frame_rate = 30
    prev = 0
    cam = cv2.VideoCapture(0)
    cam1 = cv2.VideoCapture(1)
    ff= 0.5

    fxx = ff
    fyy = ff 
    while True:
        ret_val, img = cam.read()
        img2 = cam1.read()[1]
        time_elapsed = time.time() - prev
       # print('data type of frame', type(img))
        if time_elapsed > 1/frame_rate:
            prev = time.time()
            cv2.rectangle(img,(100,100),(500,500),(255,255,0),2)
            small_frame = cv2.resize(img, (0, 0), fx=fxx, fy=fyy)
            cv2.resize(img2,(0, 0), fx = fxx, fy = fyy)
            #print("helo")
        #if mirror: 
        #    img = cv2.flip(img, 1)
            cv2.imshow('my webcam', img)
            cv2.imshow('my 2nd webcam', img2)
        #if cv2.waitKey(1) == 27: 
        #    break  # esc to quit
        if cv2.waitKey(1) == 27:
            break
    cv2.destroyAllWindows()
    print (cam)

def main():
    show_webcam(mirror=True)

if __name__ == '__main__':
    main()



视频显示了几帧,但几秒钟后我出现了这个错误

select timeout
VIDIOC_DQBUF: Resource temporarily unavailable
Traceback (most recent call last):
  File "camera.py", line 39, in <module>
    main()
  File "camera.py", line 36, in main
    show_webcam(mirror=True)
  File "camera.py", line 21, in show_webcam
    small_frame = cv2.resize(img, (0, 0), fx=fxx, fy=fyy)
cv2.error: OpenCV(3.4.4) /home/pi/packaging/opencv-python/opencv/modules/imgproc/src/resize.cpp:3784: error: (-215:Assertion failed) !ssize.empty() in function 'resize'

当我在笔记本电脑上实现该代码时,该代码也可以正常工作。我该怎么办才能纠正此错误并确保视频不中断?

尝试执行cv2.waitKey(30)不起作用

3 个答案:

答案 0 :(得分:0)

相同的代码在笔记本电脑上有效,但在pi上无效。这意味着您在较小的设备上遇到内存和/或CPU减少的问题。

尝试降低帧速率,以调整在较小的设备上可以使用的帧数。

答案 1 :(得分:0)

在继续处理之前,应同时检查两个cam.read()的ret_val是否为true。因此,当未正确抓取框架时,将其丢弃并重试该过程,而不是抛出错误并退出。

从技术上讲,这并不能解决错误,但是可以解决您的问题,只要所得到的帧速率足以满足您的应用要求。

答案 2 :(得分:0)

为什么要使用time_elapsed变量,而只能使用waitkey函数并将要等待的毫秒数传递给它,即1000 / framePerSecond。关于您的错误,您尝试调整大小的框架为空,有时会发生这种情况。因此在进行任何图像处理之前,请尝试检查图像是否不为空,然后继续执行您想做的事情。