目录
一、主程序基本结构
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>
运行结果: