【OpenCV DNN】Flask 视频监控目标检测教程 02

news2024/11/17 10:44:50

欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中
【OpenCV DNN】Flask 视频监控目标检测教程 01
【OpenCV DNN】Flask 视频监控目标检测教程 02

【OpenCV DNN】Flask 视频监控目标检测教程 02

    • 3.1 从URL地址读取图片进行处理
      • 3.1.1 从指定的 url 地址读取图像
      • 3.1.2 例程:从指定的 url 读取图像
    • 3.2 上传本地图片进行卡通处理
      • 3.2.1 建立 Flask 项目
      • 3.2.2 编写 HTML 文档
      • 3.2.3 Python程序实现业务逻辑
      • 3.2.4 运行脚本


本系列从零开始,详细讲解使用 Flask 框架构建 OpenCV DNN 模型的 Web 应用程序。

本节介绍使用OpenCV+Flask将计算机视觉应用程序部署到Web端。


3.1 从URL地址读取图片进行处理

我们编写的第一个例程,从指定的URL地址读取图片,对图片进行处理,返回处理后的图片并在网页上显示。本例程在浏览器直接显示响应图片,没有使用HTML文档。

3.1.1 从指定的 url 地址读取图像

(1)首先从指定的 url 地址读取图像。
Flask中使用route()装饰器将应用程序的URL绑定到函数,可以接受URL参数实现路由访问。

@app.route('/enhance', methods=['GET'])
def detail_enhance():
    # 从指定的 url 地址读取图像
    with urllib.request.urlopen(request.args.get('url')) as url:
        image_array = np.asarray(bytearray(url.read()), np.uint8)
    # 从指定的内存缓存中读取数据,并把数据转换成图像格式
    imgCV = cv2.imdecode(image_array, -1)  # 转换为 OpenCV 图像

使用函数request.args.get(‘url’)来获取URL参数,构建一个变量URL。当我们访问/user/时,就可以接收到URL地址,然后从URL地址读取图片。
注意不能使用函数cv.imread()读取图像,而要使用函数cv.imdecode()从指定的内存缓存中读取数据,并将传输数据转换为OpenCV图像。

(2)图像处理。
简单地,例程使用边缘保护图像滤波和铅笔素描两种方法进行图像处理。

(3)将图像编码到内存缓冲区。
使用函数cv.imencode()将图像编码为流数据,存储到内存缓存中,方便网络传输。

(4)生成返回页面响应。
使用函数make_response()将缓存中的图像编码封装为响应对象,将页面响应返回到客户端。

3.1.2 例程:从指定的 url 读取图像

完整的例程如下。

# opencvFlask01.py

import cv2
import numpy as np
from flask import Flask, request, make_response
import urllib.request


app = Flask(__name__)  # 用当前脚本名称实例化Flask对象

@app.route('/enhance', methods=['GET'])
def detail_enhance():
    # 从指定的 url 地址读取图像
    with urllib.request.urlopen(request.args.get('url')) as url:
        image_array = np.asarray(bytearray(url.read()), np.uint8)
    # 从指定的内存缓存中读取数据,并把数据转换成图像格式
    imgCV = cv2.imdecode(image_array, -1)  # 转换为 OpenCV 图像

    # # 双边滤波增强图像
    # dst = cv2.detailEnhance(imgCV, sigma_s=10, sigma_r=0.2)
    # 边缘保护滤波图像
    dst = cv2.edgePreservingFilter(imgCV, sigma_s=50, sigma_r=0.4)
    # 将图像编码到内存缓冲区
    ret, out_buf = cv2.imencode('.jpg', dst)

    # 生成返回页面响应
    resp = make_response(out_buf.tobytes())  # 封装为响应对象
    resp.headers['Content-Type'] = 'image/jpeg'  # 设置响应头
    return resp

@app.route('/pencil', methods=['GET'])
def pencil_sketch():
    # 从指定的 url 地址读取图像
    with urllib.request.urlopen(request.args.get('url')) as url:
        image_array = np.asarray(bytearray(url.read()), np.uint8)
    # 从指定的内存缓存中读取数据,并把数据转换成图像格式
    imgCV = cv2.imdecode(image_array, -1)  # 转换为 OpenCV 图像

    # 铅笔画滤波图像
    dst1, dst2 = cv2.pencilSketch(imgCV, sigma_s=100, sigma_r=0.15, shade_factor=0.02)
    # 将图像编码到内存缓冲区
    ret, out_buf = cv2.imencode('.jpg', dst1)

    # 生成返回页面响应
    resp = make_response(out_buf.tobytes())  # 封装为响应对象
    resp.headers['Content-Type'] = 'image/jpeg'  # 设置响应头
    return resp

if __name__ == '__main__':
    # 启动一个本地开发服务器,激活该网页
    app.run(host='0.0.0.0', debug=True)  # 绑定 IP 和端口

运行程序cvFlask01.py,启动Web服务器,控制台将显示如下消息。

 * Serving Flask app 'cvFlask01'
 * Debug mode: off

 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://192.168.3.249:5000

在浏览器输入以下URL,调用GET请求。

http://192.168.3.249:5000/enhance?url=http://www.news.cn/photo/2023-03/29/1129476453_16800903517201n.jpg

http://192.168.3.249:5000/pencil?url=http://www.news.cn/photo/2023-03/29/1129476453_16800903517201n.jpg

不同网络设备运行时的IP地址不同,具体可以参考控制台显示输出的内容。其中参数url的值http://www.news.cn/photo/***.jpg是待处理图像的URL地址。通过route()装饰器的路由规则,将enhance绑定到函数detail_enhance(),将pencil绑定到函数pencil_sketch(),执行不同的图像处理任务。

Flask获取GET请求后,进行图像处理,并在浏览器显示响应图片如下。


3.2 上传本地图片进行卡通处理

我们的第二个例程,上传本地图片,对图片进行处理,返回处理图片并在网页上进行格式化显示。


3.2.1 建立 Flask 项目

为了处理本地图片上传和格式化显示处理的图片,我们需要建立一个Flask项目,并编写简单的HTML文档。具体步骤如下。

(1)新建一个Flask项目。
项目默认配置建立static和templates目录,static目录用来存放静态资源,例如图片、js、css文件等,templates目录存放模板文件。网站逻辑由Python程序文件cvFlask02.py实现,保存在项目的根目录。项目cvFlask02的文件树如下。

---项目文件名\
    |---static\
|---templates\
    |    |---processed.html
    |    |---upload.html
|--- cvFlask02.py

3.2.2 编写 HTML 文档

(2)编写upload.html文档,用于上传本地图片,保存在templates目录。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>OpenCV+Flask 上传图片</title>
</head>
<body>
    <h1 align="center">OpenCV+Flask 例程:上传本地图片处理</h1>
    <p align="center">Developed by youcans@xupt2023</p>
    <form action="" enctype='multipart/form-data' method='POST'>
        <label>选择按钮:</label>
        <input type="file" name="file" style="margin-top:25px;"/>
        <br>
        <label>选中文件:</label>
        <input type="text" class="txt_input" name="name"  value="png/jpg/jpeg/bmp" style="margin-top:20px;"/>
        <br>
        <label>上传按钮:</label>
        <input type="submit" value="上传图片" class="button-new" style="margin-top:20px;"/>
        <br>
    </form>
</body>
</html>

(3)编写processed.html文档,用于显示上传图片和处理图片,保存在templates目录。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>OpenCV+Flask 上传图片</title>
</head>
<body>
    <h1 align="center">OpenCV+Flask 例程:上传本地图片进行处理</h1>
    <p align="center">Developed by youcans@xupt, 2023</p>    
    <form action="" enctype='multipart/form-data' method='POST'>
        <label>选中文件:</label>
        <input type="text" class="txt_input" name="name" value={{userinput}} style="margin-top:10px;"/>
        <br>
    </form>
    <h2 align="center">图片处理结果</h2>
    <table width="700" height="350" border="5" align="center" frame=void>
		<tr>
			<td align="center" valign="middle">原始图片</td>
			<td align="center" valign="middle">处理结果</td>
		</tr>
		<tr>
			<td align="center" valign="middle">
                <img src="{{ url_for('static', filename= './images/upload.jpg',_t=val1) }}" width="300" height="300" alt="上传的原始图片"/>
            </td>
			<td align="center" valign="middle">
                <img src="{{ url_for('static', filename= './images/processed.jpg',_t=val1) }}" width="300" height="300" alt="处理完成的图片"/>
            </td>
		</tr>
    </table>

</body>
</html>

(4)编写Python程序文件cvFlask02.py,保存在项目根目录下。


3.2.3 Python程序实现业务逻辑

Python程序实现如下的业务逻辑:
1)启动一个本地开发服务器,激活upload.html网页。
2)接收upload.html页面上传的图像文件,并进行检查。
3)将上传的图片保存到 upload_path 路径。
4)调用图像处理子程序,对上传的图像进行处理。
5)激活processed.html网页,显示原始图像和处理后的图像。

本例程的图像处理子程序,使用cv. Stylization()函数对上传的图片进行卡通化处理,也可以根据需要实现其它图片处理方法。

cvFlask02.py完整的程序代码如下。

# cvFlask02.py
# OpenCV+Flask 图像处理例程 02
# 上传本地图片进行处理,在网页上显示处理结果
# Copyright 2023 Youcans, XUPT
# Crated:2023-4-25

# coding:utf-8
import cv2
import os, time
from flask import Flask, render_template, request, make_response, jsonify
from werkzeug.utils import secure_filename
from datetime import timedelta

# 设置允许的文件格式
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'bmp'])

app = Flask(__name__)  # 用当前脚本名称实例化Flask对象
app.send_file_max_age_default = timedelta(seconds=1)  # 设置静态文件缓存过期时间

@app.route('/upload', methods=['POST', 'GET'])  # 添加路由
def upload():
    if request.method == 'POST':
        f = request.files['file']  # 从表单的 file 字段获取文件,file为该表单的name值
        print("user_input:", f.filename)  # tiger02.png
        if not (f and allowed_file(f.filename)):  # 检查图片类型
            return jsonify({"error": 1001, "msg": "上传图片必须是 png/jpg/jpeg/bmp 类型"})

        user_input = request.form.get("name")  # 获取表单输入的 name 值, png/jpg/jpeg/bmp
        basepath = os.path.dirname(__file__)  # 当前文件所在路径 C:\Users\David\cvFlask\
        # upload_filepath = os.path.join(basepath, 'static\images', secure_filename(f.filename))
        upload_filepath = os.path.join(basepath, 'static\images', 'upload.jpg')  # 合成上传图片的保存路径
        print("upload_filepath", upload_filepath)  # upload_path, C:\Users\David\cvFlask\static\images\upload.jpg
        f.save(upload_filepath)  # 将上传的图片保存到 upload_path 路径

        # OpenCV 图像处理
        dst = imageProcessing(upload_filepath)  # 调用图片处理子程序
        cv2.imwrite(os.path.join(basepath, 'static/images', 'processed.jpg'), dst)  # 保存处理后的图片
        user_input = f.filename  # 上传图片的文件名
        return render_template('processed.html', userinput=user_input, val1=time.time())

    return render_template('upload.html')

def imageProcessing(filepath):  # 图片处理子程序
    imgCV = cv2.imread(filepath)  # 从 filepath 路径读取图片
    dst = cv2.stylization(imgCV, sigma_s=60, sigma_r=0.07)  # 图片卡通化处理
    return dst

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

if __name__ == '__main__':
    # 启动一个本地开发服务器,激活该网页
    app.run(host='0.0.0.0', port=5000, debug=True)  # 绑定 IP 和端口

3.2.4 运行脚本

(5)接下来运行此脚本。
进入cvFlask02项目的根目录,运行程序cvFlask02.py,启动流媒体服务器。控制台将显示如下消息。

 * Serving Flask app 'cvFlask02'
 * Debug mode: on

 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://192.168.3.249:5000

在浏览器输入URL(http://192.168.3.249:5000/upload),打开upload.html网页,显示如下。

在浏览器点击页面上的选择按钮,选择本地的图片上传,上传的图片保存到static\images目录。
程序cvFlask02.py对上传的图片进行卡通化处理,然后激活processed.html网页,显示原始图像和处理后的图像。

在移动手机打开浏览器,输入URL(http://192.168.3.249:5000/upload),也可以上传手机中的图片进行处理,结果如下图所示。不同网络设备运行时的IP地址不同,具体可以参考控制台显示输出的内容。


【本节完】

下节我们将讨论:在浏览器运行 OpenCV DNN 人脸检测。


欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:
【OpenCV DNN】Flask 视频监控目标检测教程 02(https://blog.csdn.net/youcans/article/details/130809121)

Copyright 2023 youcans, XUPT
Crated:2023-05-22

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++学习之路-开始

引言 C在人们的眼中通常是“复杂”一词的代表&#xff0c;但其实C有严谨的体系结构&#xff0c;以C构建起来的工程不仅严谨并且执行速度非常快。计算机科学本就是一门工程学科&#xff0c;C就相当于是一种搭建房子的基础方法&#xff0c;学完C我们将得到一把强而有力武器来武装…

2023-5-22-C++异常处理机制学习

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

Go语言核心编程-函数、包和错误处理

第 6 章 函数、包和错误处理 6.1 为什么需要函数 6.1.1请大家完成这样一个需求: 输入两个数,再输入一个运算符(,-,*,/)&#xff0c;得到结果.。 6.1.2使用传统的方法解决 走代码 分析一下上面代码问题 上面的写法是可以完成功能, 但是代码冗余同时不利于代码维护函数可以解…

跟卖又被“抄家”了,亚马逊新手要怎么做?

今天网上看到又有一家跟卖的被砸了&#xff0c;图片大致是下面这样的&#xff08;网上找的图&#xff0c;跟我看到的图片类似&#xff09;。 图片下方还有几句话&#xff1a;“事已办完&#xff0c;跟卖的窝点被我端了&#xff01;” 然后整个群里是一片欢腾&#xff0c;各种“…

网络安全是一个好专业吗

前言 网络安全作为一个专业领域&#xff0c;在当今数字时代正变得越发重要和关键。无论是企业还是个人&#xff0c;面对着越来越频繁的网络威胁和攻击&#xff0c;网络安全领域的专业人员扮演着至关重要的角色。那么&#xff0c;从一个资深网安工程师的角度来看&#xff0c;网…

SpringBoot——Bean属性绑定

简单介绍&#xff1a; 之前我们介绍过我们如何在Bean中获取配置文件的方式&#xff0c;就是通过将类注册到Spring容器中&#xff0c;然后通过ConfigurationProperties()注解&#xff0c;这个注解有一个参数叫做prefix&#xff0c;参数的值就是我们在配置文件中配置的一组数据的…

成为移动测试高手!本文教你掌握移动APP测试的关键知识和技巧,提升测试水平,轻松获取高薪工作!(上)

目录 引言 首先搭建android-sdk环境 一.兼容性测试【原生APP】 1.WEB 2.APP 2.1操作系统 2.2分辨率 2.3不同厂家 2.4网络类型 (1)h5小程序类型&#xff1a; 如何测试APP在不同手机的情况 如何测试弱网络 &#xff08;2&#xff09;.小程序 二.功能测试点 (另外)…

备战2023年秋招,一套吃透全部技术栈.....

今天跟大家分享这份测试工程师全套面试攻略包含了软件测试基础 、MySQL基础、Liunx、web测试、接口测试、App测试、Python、selenium、管理工具、性能测试、LordRunner、计算机网络、组成原理、数据结构与算法、ab测试等。这些都是我在各个大厂总结出来的面试真题&#xff0c;很…

SSM框架-Spring的学习

1.Spring简介 Spring是什么&#xff08;理解&#xff09; 官网地址: https://spring.io/ ​ Spring框架由Rod Johnson开发&#xff0c;2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架&#xff0c;因此它完成了大量开发中的通用步骤&#xff0c;留给…

多个Filter的执行顺序 | 职责链模式应用

文章目录 前言一、多个Filter的执行顺序实操1. 配置web.xml方式注册Filter结论&#xff1a; 2. 注解方式注册Filter结论&#xff1a; 二、职责链模式的应用1. 回顾职责链模式2. Filter职责链模式的应用 总结 前言 Filter(过滤器) 是 Java Servlet 规范中定义的一种组件&#xf…

【计算机组成】三分钟了解顺序存储、直接存储、随机存储和相联存储的区别

一.按地址访问和按内容访问的区别 按地址访问&#xff08;顺序存储、直接存储和随机存储&#xff09;&#xff1a;我知道这个数据存在哪个地址中&#xff0c;现在我把这个地址给你&#xff0c;麻烦你帮我找出我要的数据来 按内容访问&#xff08;相联存储&#xff09;&#xff…

Netty编解码机制(一)

1.编码和解码基本介绍 1>.编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码; 2>.codec(编解码器)的组成部分有两个: decoder(解码器)和 encoder(编码器).encoder(编码器)负责把业务数据转换成字节码数据,而…

BurpSuite—-Scanner模块(漏洞扫描)

本文主要BurpSuite—-Scanner模块(漏洞扫描)介绍的相关内容 关于BurpSuite的安装可以看一下之前这篇文章&#xff1a; http://t.csdn.cn/cavWt 一、简介 Burp Scanner 是一个进行自动发现 web 应用程序的安全漏洞的工具。它是为渗透测试人员设计的&#xff0c;并且它和你现有…

Revit幕墙:这些命令在幕墙嵌板中的妙用及快速幕墙

一、Revit中这些命令在幕墙嵌板中的妙用 在我们做幕墙时&#xff0c;通常会有不同种类的幕墙&#xff0c;比如材质不同&#xff0c;颜色不同。这时我们就需要去选中嵌板进行替换新样式的嵌板。 1.通常我们在替换嵌板时都是通过Tab切换&#xff0c;然后选中嵌板。这样进行来回切…

windows免费版切割pdf拆分pdf提取pdf指定页码小工具

如图所示&#xff1a;选择pdf文件&#xff0c;输入指定页码区间&#xff0c;使用逗号分隔&#xff0c;逗号不区分中英文。如输入1-10&#xff0c;11-20&#xff0c;21-21&#xff0c;点击开始分割&#xff0c;会拆分出1-10.pdf&#xff0c;11-20.pdf&#xff0c;21-21.pdf&…

短视频矩阵源码-智能剪辑生成技术数值组如何编程?

短视频混剪生成时长逻辑一般采用根据用户设定的总时长、视频数量、时长比例等参数计算出每个视频在混剪中所占的时长&#xff0c;然后根据视频的总时长与所占比例来划分每个视频在混剪中的时长&#xff0c;最后将各个视频拼接起来形成混剪视频。此算法可以进行灵活的时长调整和…

rt下降40%?程序并行优化六步法 | 京东云技术团队

1 背景 性能优化是我们日常工作中很重要的一部分&#xff0c;主要有以下原因&#xff1a; 降低服务器和带宽等硬件成本&#xff1a;用更少的资源处理更多的请求提高现实世界的运行效率&#xff1a;人机处理效率存在数量级的偏差&#xff0c;同样机器世界的效率提升能带来现实…

十一、配置内网穿透实现消息模块和授权登陆模块

开通内网穿透的服务&#xff08;后端8333&#xff0c;前端8080&#xff09;&#xff1a; 启动内网穿透服务&#xff1a; 创建CourseApiController来实现关键词查询课程信息&#xff1a; package com.lxl.ggkt.vod.api;import com.baomidou.mybatisplus.core.conditions.query.…

2023年认证杯SPSSPRO杯数学建模D题(第一阶段)立体车库的自动调度问题全过程文档及程序

2023年认证杯SPSSPRO杯数学建模 D题 立体车库的自动调度问题 原题再现&#xff1a; 随着人们生活水平的提高&#xff0c;汽车保有量日益增加&#xff0c;而城市土地资源有限&#xff0c;传统平面停车场土地面积利用率低, 这样便形成了交通拥挤、停车困难的现象。为解决该问题…