OpenCV和Python:如果源不是来自网络摄像头,则视频输出为空

2024-10-04 03:25:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在python2.7中使用opencv

我正在编写的程序的目的是用VideoCapture打开一个源视频(是一个mp4和H264编解码器),应用一些过滤器(背景删除,目标跟踪,诸如此类),用imshow函数将结果显示在一个帧中,并将结果保存为另一个输出视频。在

输出帧显示得很好,但问题是保存的输出是一个空的.avi(或mp4,或我作为VideoWriter函数的参数的任何内容)。只是几个字节的简单说明。在

到目前为止,你可以回答我没有使用适当的编解码器格式组合。 但奇怪的是,如果我将视频捕获从网络摄像头改为流式(所以只需更改视频容量(“来源.mp4“)到视频捕获(webcamindex)并保持所有设置不变,效果良好!在

我的程序是这样的,我只是省略了函数

import cv2
import numpy as np

#VIDEO INPUT: SWITCHING THE TWO LINES BELOW IT WORKS!
#cap = cv2.VideoCapture(1)
cap = cv2.VideoCapture('input.mp4')

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 30, (640,480), True)

while True:
    ret, frame = cap.read()

    #A BACKGROUND REMOVAL FUNCTION
    maskedMotion = justMotion(frame)

    #A FUNCTION THAT FINDS CIRCLE THROUGH THE HOUGHCIRCLE FUNCTION
    circle = findBall(maskedMotion)    

    #DRAW THE CIRCLES
    if circle!=None and circle.size != 0:    
        for i in circle[0,:]:
            #draw the outer circle
            cv2.circle(maskedMotion,(i[0],i[1]),i[2],(0,255,0),2)
            #draw the center of the circle
            cv2.circle(maskedMotion,(i[0],i[1]),2,(0,0,255),3)

    out.write(maskedMotion)
    cv2.imshow('Result', maskedMotion)

    #ESCAPE SEQUENCE
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

有什么建议吗?在


Tags: the函数程序视频functionoutcv2mp4
1条回答
网友
1楼 · 发布于 2024-10-04 03:25:21

正如肖申克在一篇评论中所说,问题在于解决方案。我试图用比原始源更小的分辨率保存视频输出。所以我就换了

out = cv2.VideoWriter('output.avi', fourcc, 30, (640,480), True)

^{pr2}$

希望其他人会发现这个提示有用:D

相关问题 更多 >