OpenCV 运行 视频上的 otsu thresh 很奇怪 window

OpenCV running otsu thresh on video gives weird window

我正在尝试 运行 这个 opencv 代码 运行 otsu tresh 在我的图像上并获得掩码

import cv2
import numpy as np


video = cv2.VideoCapture('video.mp4')
 
 
# loop runs if capturing has been initialized
while True:
 
    # reads frames from a camera
    ret, frame = video.read()
    
    original = frame.copy()
    mask = np.zeros(frame.shape, dtype=np.uint8)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)

    cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
    for c in cnts:
        cv2.drawContours(mask, [c], -1, (255,255,255), -1)
        break

    close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=4)
    close = cv2.cvtColor(close, cv2.COLOR_BGR2GRAY)
    result = cv2.bitwise_and(original, original, mask=close)
    result[close==0] = (255,255,255)


    cv2.imshow('result', result)
video.release()
 
# De-allocate any associated memory usage
cv2.destroyAllWindows()

这给我一个奇怪的框架 window 如下所示

大约 20 秒后没有任何反应,直到它警告我程序将崩溃。我得到的唯一输出是 Killed

图片是这样的:

是什么原因造成的,我该如何解决?

大多数情况下,它崩溃是因为它对您的设备来说太多了。您可以通过保存视频流中的一些帧、运行 相同的代码并测量完成所需的时间来检查这一点。如果花费的时间超过捕获两帧之间的时间,则意味着您正在创建一个操作队列,直到您的设备不再能够处理它。例如,如果您使用 60 frames/minute 并且您的操作需要 2 秒,那么每 60 帧操作将延迟 1 分钟。它会增加直到崩溃。

关于OTSU输出,完全取决于你的输入。您必须先在几帧上尝试一下。可能你的颜色接近while,因为反转所以一切都变黑了。

你不见了cv2.waitKey()。把它放在 cv2.imshow()

之后
    cv2.imshow('result', result)
    cv2.waitKey(0)
video.release()