0
点赞
收藏
分享

微信扫一扫

Python视频处理(2)——Flask网页开发+分镜

半夜放水 2022-01-13 阅读 53

目录

一、主程序基本结构

1、安装并导入Flask

2、创建Flask对象(很重要的一步,不能忘记)

3、编写主程序

4、路由

5、完整代码

二、渲染网页

三、定义分镜相关函数

1、定义切帧函数并调用

2、Hash均值分镜

3、直方图均值分镜

4、修改完善并呈现


一、主程序基本结构

1、安装并导入Flask

安装:pip3 install flask

导入:

(以下2—5部分文案引自Python学习 | 2021-10-22 Flask Web开发_宣纸儿的博客-CSDN博客,博主概括得非常凝练)

2、创建Flask对象(很重要的一步,不能忘记)

  • flask程序需要创建一个Flask类对象,用于应用的配置和运行
  • name 是Python中的特殊变量,如果文件作为主程序执行,那么__name__变量的值就是__main__,如果是被其他模块引入,那么__name__的值就是模块名称

3、编写主程序

  • 在主程序中,执行run()来启动应用
  • 改名启动一个本地服务器,默认情况下其地址是localhost:5000,可以使用关键字参数port修改监听端口

4、路由

  • 使用app变量的route()装饰器来告诉Flask框架URL如何触发视图函数
  • 处理URL和函数之间关系的程序称为路由
  • 像index()这样的函数称为视图函数(view function),函数的返回值称为响应,是客户端会收到的内容
  • 对路径’/'的请求将转为对index()函数的调用
  • 尖括号里的内容是动态部分

5、完整代码

from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def index():
    return 'Hello, World!'
 
if __name__ == '__main__':
    app.run(port="5008")

二、渲染网页

创建一个文件夹templates(固定的,不能更改),并在文件夹下创建一个index.html文件

 在main.py中修改返回处代码为:

 完整修改代码:

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')

def index():
    return render_template('index.html')
if "__main__"==__name__:
    app.run(port="5008")

三、定义分镜相关函数

(详见上期Python视频处理(1)——视频分镜头提取+视频处理_maplelistener的博客-CSDN博客)

1、定义切帧函数并调用

from flask import Flask,render_template

app = Flask(__name__)

def genFrame():
    v_path="static/ghz.mp4"
    image_save="static/pic"
 
    cap=cv2.VideoCapture(v_path)
    frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
 
    for i in range(int(frame_count)):
        _,img=cap.read()
        img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        cv2.imwrite("static/pic/image{}.jpg".format(i),img)

@app.route('/')

def index():
    genFrame()
    pic="static/pic/image"
    framecount=249
    return render_template('index.html',pic1=pic,framecount=framecount)
if "__main__"==__name__:
    app.run(port="5008")

可以在前端显示切帧结果:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask</title>
</head>
<body>
视频分镜
<br>
<video width="640" height="480" controls autoplay>
  <source src="static/ghz.mp4" type="video/mp4">
  <object data="static/ghz.mp4" width="640" height="480">
    <embed width="640" height="480" src="static/ghz.mp4">
  </object>
</video>
<br>
帧数:{{framecount}}<br>
{% for i in range(framecount) %}
    <img height="20" src="{{pic1}}{{i}}.jpg" />
{% endfor %}
</body>
</html>

运行结果:

 

注意事项:

上述代码成功的一个重要前提是,一定要记住把要处理的相关文件(视频,图片)都存在static静态文档中。

2、Hash均值分镜

可以利用导入包的方式,新建compareImageHash.py(具体代码内容详见上期Python视频处理(1)——视频分镜头提取+视频处理_maplelistener的博客-CSDN博客)

这样可以离线计算得出所有结果后,再将结果通过html展示

修改函数genFrame()

def genFrame():
    v_path='static/ghz.mp4'
    image_save='static/hash'

    if not(os.path.exists(image_save)):
        print(image_save)
        os.mkdir(image_save)

    cap=cv2.VideoCapture(v_path)
    fc=cap.get(cv2.CAP_PROP_FRAME_COUNT)
    print(fc)
    _, img1 = cap.read()
    cv2.imwrite('static/hash/image{}.jpg'.format(0), img1)
    print(int(fc))
    for i in range(248):
        _, img2 = cap.read()
        hash1 = aHash(img1)
        hash2 = aHash(img2)
        n = cmpHash(hash1, hash2)
        #print('均值哈希算法相似度:', n)
        if (n<0.6):
            cv2.imwrite('static/hash/image{}.jpg'.format(i),img2)
            img1=img2

3、直方图均值分镜

compareImageHist.py

(详见上期Python视频处理(1)——视频分镜头提取+视频处理_maplelistener的博客-CSDN博客)

修改函数genFrame()

def genFrame():
    v_path='static/ghz.mp4'
    image_save='static/hash'

    if not(os.path.exists(image_save)):
        print(image_save)
        os.mkdir(image_save)

    cap=cv2.VideoCapture(v_path)
    fc=cap.get(cv2.CAP_PROP_FRAME_COUNT)
    print(fc)
    _, img1 = cap.read()
    cv2.imwrite('static/hash/image{}.jpg'.format(0), img1)
    print(int(fc))
    for i in range(248):
        _, img2 = cap.read()
        n = classify_hist_with_split(img1, img2)
        #print('均值哈希算法相似度:', n)
        if (n<0.6):
            cv2.imwrite('static/hash/image{}.jpg'.format(i),img2)
            img1=img2

 

4、修改完善并呈现

修改完善main.py:

@app.route('/shot')
def shot():
    path='static/hash'
    filename = os.listdir(path)
    framecount=len(filename)
    filename.sort(key= lambda x:int(x[5:-4]))
    print(filename)
    print(type(filename))

    print(filename)

    path='static/hist'
    histfile = os.listdir(path)
    histcount=len(histfile)
histfile.sort(key= lambda x:int(x[5:-4]))   #对List的元素排序
return render_template('shot.html',filename=filename,framecount=framecount,histfile=histfile,histcount=histcount)

修改网页端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask</title>
</head>
<body>
视频分镜
<br>
<video width="640" height="480" controls autoplay>
  <source src="static/ghz.mp4" type="video/mp4">
  <object data="static/ghz.mp4" width="640" height="480">
    <embed width="640" height="480" src="static/ghz.mp4">
  </object>
</video>
<br>
均值哈希帧数:{{framecount}}<br>
{% for i in range(framecount) %}
    <img height="20" src="static/hash/{{filename[i]}}.jpg" />
{{filename[i]}}
{% endfor %}
<br>
直方图相似度帧数:{{histcount}}<br>
{% for i in range(histcount) %}
    <img height="20" src="static/hist/{{histfile[i]}}.jpg" />
{{histfile[i]}}
{% endfor %}
</body>
</html>

运行结果:

 

举报

相关推荐

0 条评论