现在有一个目标是对视频进行处理,比如输入一个mp4文件,通过算法对每一帧进行处理,最后将视频重新输出,有以下难点
输入的是mp4视频,在demo中需要先将其处理为一帧一帧的形式
1. 将视频处理为单帧的形式
首先涉及到gr.State函数,参考如下例子对其进行了解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import gradio as grdemo = gr.Blocks(css="""#btn {color: red} .abc {font-family: "Comic Sans MS", "Comic Sans", cursive !important}""" ) with demo: default_json = {"a" : "a" } btn = gr.Button("Next Square" , elem_id="btn" , elem_classes=["abc" , "def" ]) num = gr.State(value=0 ) stats = gr.State(value=default_json) squared = gr.Number(value=0 ) table = gr.JSON() def increase (var, stats_history ): var += 1 stats_history[str (var)] = var**2 return var, var**2 , stats_history, stats_history btn.click(increase, [num, stats], [num, squared, stats, table]) if __name__ == "__main__" : demo.launch()
输出如下所示,这是点击了4次next square按钮的结果,一般来说gradio都是输入经过一个函数得到输出,是一次性的,gr.State则可以保存中间变量,让demo能够进行多次的输入和输出,如上述代码所示,我们定义了两个State:num和stats,这两个变量作为输入,squared和table作为输出变量,increase是我们的函数,将num和stats输入到函数中后,最后返回四个变量,其中两个用来更新num和stats,另外两个变量则就是输出了,多看几遍代码就很容易弄懂
了解上述函数之后用opencv库将视频帧进行提取即可