繁体   English   中英

pythons opencv 使用网络摄像头时帧数不足

[英]pythons opencv running out of frames when using webcam

我正在尝试将我的 opencv 设置为加热 map。 我让它适用于 set.mp4 文件。 但是,当我尝试在实时提要上使用我的网络摄像头使其工作时,它似乎并不喜欢它。 它的问题是它在以下代码行中说"index is out of range"

make_video('./frames/', './output.avi')
frame = cv2.imread(os.path.join(image_folder, images[0]))

.py文件如下:

import numpy as np
import cv2
import copy
from make_video import make_video
from progress.bar import Bar



def main():
    capture = cv2.VideoCapture(0)
    background_subtractor = cv2.bgsegm.createBackgroundSubtractorMOG()
    length = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))

    bar = Bar('Processing Frames', max=length)

    print(length)
    short = length
    first_iteration_indicator = 1
    for i in range(0, short):

        print(i)

        ret, frame = capture.read()

        # If first frame
        if first_iteration_indicator == 1:

            first_frame = copy.deepcopy(frame)
            height, width = frame.shape[:2]
            accum_image = np.zeros((height, width), np.uint8)
            first_iteration_indicator = 0
        else:

            filter = background_subtractor.apply(frame)  # remove the background
            cv2.imwrite('./frame.jpg', frame)
            cv2.imwrite('./diff-bkgnd-frame.jpg', filter)

            threshold = 2
            maxValue = 2
            ret, th1 = cv2.threshold(filter, threshold, maxValue, cv2.THRESH_BINARY)

            # add to the accumulated image
            accum_image = cv2.add(accum_image, th1)
            cv2.imwrite('./mask.jpg', accum_image)

            color_image_video = cv2.applyColorMap(accum_image, cv2.COLORMAP_HOT)

            video_frame = cv2.addWeighted(frame, 0.7, color_image_video, 0.7, 0)

            name = "./frames/frame%d.jpg" % i
            cv2.imwrite(name, video_frame)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        bar.next()

    bar.finish()

    make_video('./frames/', './output.avi')

    color_image = cv2.applyColorMap(accum_image, cv2.COLORMAP_HOT)
    result_overlay = cv2.addWeighted(first_frame, 0.7, color_image, 0.7, 0)

    # save the final heatmap
    cv2.imwrite('diff-overlay.jpg', result_overlay)

    # cleanup
    capture.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

为了将其设置为网络摄像头,我使用capture = cv2.VideoCapture(0)导致上述错误,但是如果我使用 pre-saved.mp4 文件,例如 capture = cv2.VideoCapture('vid.mp4') 它工作正常。有什么想法吗?

问题:

当使用您的网络摄像头时capture = cv2.VideoCapture(0) ; line length = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))没有帮助。 因为,当使用网络摄像头capture.get(cv2.CAP_PROP_FRAME_COUNT)返回-1.0 这意味着使用网络摄像头时帧数不适用。 用于读取视频时有意义,因为它可以找出视频中存在的帧数。

解决方案:

我修改了现有代码以使用网络摄像头并删除了for循环。 我在没有make_video的情况下测试了这段代码。 结果与使用cv2.imshow分析它们时所预期的一样(取消注释以自己查看)。

import cv2

capture = cv2.VideoCapture(0)

background_subtractor = cv2.bgsegm.createBackgroundSubtractorMOG()

threshold = 100
maxValue = 255

# for counting frames
i = 0
while True:
    i = i + 1
    ret, frame = capture.read()

    if frame is None:
        break
    
    fgMask = background_subtractor.apply(frame)
    ret, th1 = cv2.threshold(fgMask, threshold, maxValue, cv2.THRESH_BINARY)
    blur = cv2.GaussianBlur(th1,(11,11), 9)
    heat_map = cv2.applyColorMap(blur, cv2.COLORMAP_HOT)
    video_hm = cv2.addWeighted(frame, 0.7, heat_map, 0.7, 0)

    name = "./frames/frame%d.jpg" % i
    cv2.imwrite(name, video_hm)
    
    #cv2.imshow('Frame', frame)
    #cv2.imshow('FG Mask', fgMask)
    #cv2.imshow('Video OP', video_hm)
    #cv2.imshow('Blur', blur)
    
    keyboard = cv2.waitKey(30)
    if keyboard == 'q' or keyboard == 27:
        break

capture.release()
make_video('./frames/', './output.avi')
cv2.destroyAllWindows()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM