opencv release()函数的工作方式很奇怪

v1l68za4  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(105)

我想从网络摄像头获取视频流,我用opencv编写了以下代码:

import cv2 as cv

cap = cv.VideoCapture(0)

while True:
    frame, ret = cap.read()
    cv.resize(frame, (640, 480))

    if ret is None:
        print("Error reading frame")
        break

    cv.imshow("frame", frame)

    if cv.waitKey(1) == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

我得到了下面的结果,它不应该这样工作

我在Windows 10、Ubuntu 22.04 LTS、python 3.10、3.9上测试了opencv和opencv-contrib的最新版本

p1tboqfb

p1tboqfb1#

我想从网络摄像头上
有两种方法:
选项1 ret必须始终是第一个变量,而不是第二个变量。
将此frame, ret = cap.read()交换为ret, frame = cap.read()
这就是为什么你使用if ret is None:
片段:

import cv2 as cv

cap = cv.VideoCapture(0)

while True:
    ret, frame = cap.read() #<== change
    cv.resize(frame, (640, 480))

    if ret is None: #<== change
        print("Error reading frame")
        break

    cv.imshow("frame", frame)

    if cv.waitKey(1) == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

选项2:使用相同的OP脚本。

  • 在第9行,将ret更改为frame
  • 在第13行,将frame更改为ret

片段:

import cv2 as cv

cap = cv.VideoCapture(0)

while True:
    frame, ret = cap.read()
    cv.resize(frame, (640, 480))

    if frame is None: #<== change
        print("Error reading frame")
        break

    cv.imshow("frame", ret) #<== change

    if cv.waitKey(1) == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

相关问题