cv2.imshow中的“发生异常:错误”

时间:2019-04-25 10:48:02

标签: python opencv

我只是试图制作简单的计算机视觉代码,该代码是使用python 3.6.6和openCV4.1.0从某个网站复制的,但是出现错误,这是我的错吗?

在每个“ cv2.imshow”中总会有一些错误

import cv2

cam = cv2.VideoCapture(1)

cv2.namedWindow("test")

img_counter = 0

while True:
    ret, frame = cam.read()
    cv2.imshow("test", frame)
    if not ret:
        break
    k = cv2.waitKey(1)

    if k%256 == 27:
        # ESC pressed
        print("Escape hit, closing...")
        break
    elif k%256 == 32:
        # SPACE pressed
        img_name = "opencv_frame_{}.png".format(img_counter)
        cv2.imwrite(img_name, frame)
        print("{} written!".format(img_name))
        img_counter += 1

cam.release()

cv2.destroyAllWindows()

它应该在笔记本电脑上编译为网络摄像头视图。 但这就是我得到的:

Exception has occurred: error
OpenCV(4.1.0) ../modules/highgui/src/window.cpp:352: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'

2 个答案:

答案 0 :(得分:2)

这里的关键是要记住,每当在cv2.imshow()周期内执行while True操作时,都必须使用以下结构:

while True: 
    r, f = cam.read()
    if r: 
        cv2.imshow("f", f)
        if cv2.waitkey(1) & 0xff == ord('q'):
            break 

然后,您可以围绕此基本结构构建所有应用程序逻辑。

答案 1 :(得分:0)

这部分错误

  

size.width> 0 && size.height> 0

告诉您图像的宽度或高度为零。这意味着Output无效,因此无法显示。在显示之前,请检查您的frame是否有效。

好事是frame已经告诉您读取是否成功,就像可以在documentation中读取的内容一样(cam.read()等于您的cap):< / p>

  

cap.read()返回布尔值(True / False)。如果正确读取框架,则它   将为真。因此,您可以通过检查此返回值来检查视频的结尾。

实际阅读和显示应如下所示:

cam

使用您的代码的完整示例:

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:   # frame is valid
        # show the frame
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

如果所有帧都无效(视频设备不起作用),它将打印

  

“框架无效”

始终向您显示出问题。 我调整了import cv2 cam = cv2.VideoCapture(0) # adjusted to the first device '0' img_counter = 0 while(True): ret, frame = cam.read() if ret: # frame is valid # show the frame cv2.imshow('frame',frame) key = cv2.waitKey(1) if key & 0xFF == ord('s'): # s for saving print("S hit, saving...") img_name = "opencv_frame_{}.png".format(img_counter) cv2.imwrite(img_name, frame) print("{} written!".format(img_name)) img_counter += 1 if key & 0xFF == ord('q'): # q for quitting print("Q hit, closing...") break else: print("Frame not valid") cam.release() cv2.destroyAllWindows() 的参数以使用系统的第一个视频设备(计数从0开始而不是1)。 该示例使用“ s”保存并使用“ q”退出。