FastAPI Python照片打马赛克API

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、FastAPI是什么?
  • 二、使用步骤
    • 1.安装FastAPI及Uvicorn
    • 2.编写马赛克核心代码
    • 3.编写照片上传接口
    • 4.编写马赛克处理接口
  • 三、测试
  • 总结


前言

现代社会大家对于自己的隐私越来越注重,我们平时在外拍摄风景照片的时候难免会有其他人入镜。在发朋友圈或者微博的时候,为了保证这些人的肖像权我一般都会做马赛克处理。
使用python库加fastapi可以做一个快速处理的webapi,具体介绍如下。


一、FastAPI是什么?

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。它具有快速,高效,简单及标准化的特点。

二、使用步骤

1.安装FastAPI及Uvicorn

命令如下:

pip install fastapi
pip install "uvicorn[standard]"

2.编写马赛克核心代码

代码如下:

from fastapi import HTTPException
import cv2
import osdef do_mosaic(frame, x, y, w, h, neighbor=9):fh, fw = frame.shape[0], frame.shape[1]if (y + h > fh) or (x + w > fw):returnfor i in range(0, h - neighbor, neighbor): for j in range(0, w - neighbor, neighbor):rect = [j + x, i + y, neighbor, neighbor]color = frame[i + y][j + x].tolist()left_up = (rect[0], rect[1])right_down = (rect[0] + neighbor - 1, rect[1] + neighbor - 1)cv2.rectangle(frame, left_up, right_down, color, -1)

3.编写照片上传接口

代码如下:

from fastapi import FastAPI, UploadFile, Form, File, HTTPException, Request
from model import PicItem, PicReq
import time
import os
import mosaic
import logging
import pickleapp = FastAPI()# setup loggers
logger = logging.getLogger("uvicorn.access")
logger.setLevel(logging.INFO)
handler = logging.handlers.RotatingFileHandler("api.log",mode="a",maxBytes = 100*1024, backupCount = 5)
handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
logger.addHandler(handler)@app.get("/")
async def hello():logger.info("enter hello")logger.error("error test")return {"message":"hello world!"}@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(), uid: str = Form()):logger.info("enter create_upload_file uid:%s" % uid)#checkif uid == "":logger.error("create_upload_file 未获取到UID")raise HTTPException(status_code=500, detail="未获取到UID")if not file:logger.error("create_upload_file 未获取到文件")raise HTTPException(status_code=500, detail="未获取到文件")mime = file.content_typeif mime != "image/jpeg":logger.error("create_upload_file 只允许图片格式文件")raise HTTPException(status_code=500, detail="只允许图片格式文件")#set file save path and namedata = await file.read()timestr = time.strftime("%Y%m%d%H%M%S",time.localtime())fname = file.filename.split('.')folderpath = "files/" + uidnewfname = "%s.%s" % (timestr, fname[1])try:if not os.path.exists(folderpath):os.makedirs(folderpath)filepath = "%s/%s" % (folderpath, newfname)with open(filepath,"wb") as f:#save filef.write(data)f.close()except e:raise HTTPException(status_code=500, detail= e)#set result bodyresult = PicItem()result.uid = uidresult.filename = newfname#resultstr = pickle.dumps(result).decode('UTF-8','ignore')#logger.info("return create_upload_file uid:%s response:%s" % (uid, resultstr))return result

4.编写马赛克处理接口

代码如下:

@app.post("/go/")
async def mosaic_pic(picReq: PicReq):logger.info("enter go request:%s" % picReq)savedname =  mosaic.use_mosaic(picReq.uid, picReq.filename)logger.info("return go savedname:%s" % savedname)return savednamedef use_mosaic(uid, fname):print("enter use_mosaic")filepath = "files/%s/%s" % (uid, fname)if not os.path.exists(filepath):raise HTTPException(status_code=500, detail="文件不存在")img = cv2.imread(filepath)fixsize = 128 # declare fix sizegray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # convert to greyprint("read file success")# laod opencv schemaclassifier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")color = (0, 255, 0)# begin to identify facefaceRects = classifier.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3, minSize=(32, 32))print(faceRects)if len(faceRects):  # get faces if above zeroprint("get faces")for faceRect in faceRects:  # loop each facex, y, w, h = faceRectdo_mosaic(img, x, y, w, h)print("finish use_mosaic")sfname = fname.split(".")donename = "%s_done.%s" % (sfname[0], sfname[1])cv2.imwrite("files/%s/%s" % (uid, donename) , img)return donename

三、测试

原照片:
在这里插入图片描述

处理后的照片:
在这里插入图片描述

总结

以上就是今天要讲的内容,本文仅仅简单介绍了python是如何将照片马赛克化的,然后使用fastapi开发接口暴露给用户使用。

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

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

相关文章

【数据结构初阶】六、线性表中的队列(链式结构实现队列)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【数据结构初阶】五、线性表中的栈(顺序表实现栈)_高高的胖子的博客-CSDN博客 1 . 队列(Queue) 队列的概念和结构: 队列…

单日 5000 亿行 / 900G 数据接入,TDengine 3.0 在中国地震台网中心的大型应用

小T导读:为满足地震预警数据存储、检索和处理的建设与集成需求,以及响应国家国产软件自主可控的号召,中国地震台网中心决定选用国产数据库 TDengine 来存储和处理地震波形数据。本文将针对 TDengine 3.0 在地震领域的应用展开详细讲解。 关于…

C#求100-999之间的水仙花数,你知道多少个?让我们一起来探索!

目录 背景: 扩展: 水仙花数例子: 效果展示:​ 总结: 背景: 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong…

基于微信小程序的新闻发布平台小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

MySQL MMM高可用架构

MySQL MMM高可用架构一、MMM概述1、MMM简介2、MMM高可用架构3、MMM故障切换流程 二、MMM高可用双主双从架构部署1、配置主主复制(master),主从复制(slave)1)修改 Master1的MySQL配置文件2)把配置…

软件设计师笔记系列(四)

😀前言 随着技术的快速发展,软件已经成为我们日常生活中不可或缺的一部分。从智能手机应用到大型企业系统,软件都在为我们提供便利、增强效率和创造价值。然而,随之而来的是对软件质量的日益增长的关注。软件的质量不仅关乎其功能…

基于微信小程序的高校宿舍管理系统设计与实现(亮点:选择宿舍、宿舍评分、宿舍报修)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

云原生微服务治理 第四章 Spring Cloud Netflix 服务注册/发现组件Eureka

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 文章目录 系列文章目录[TOC](文章目录) 前言1、Eureka 两大组件2、Eureka 服务注册与发现3、案例3.1、创建主工程3.1.1、主…

【Java 进阶篇】深入理解 SQL 聚合函数

在 SQL 数据库中,聚合函数是一组强大的工具,用于处理和分析数据。它们可以帮助您对数据进行统计、计算总和、平均值、最大值、最小值等操作。无论您是数据库开发者、数据分析师还是希望更好地了解 SQL 数据库的用户,了解聚合函数都是非常重要…

Android12之Codec2.0配置编解码器为H264实现(四十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Qt使用I.MX6U开发板上的按键(原理:将电脑键盘方向键↓在Qt中的枚举值与开发板中按键定义的枚举值一致,这样电脑端测试效果就与开发板的一致)

在上篇介绍了Qt点亮I.MX6U开发板的一个LED,对于Qt控制I.MX6U开发板的一个蜂鸣器原理也是一样的,就不做详细介绍,具体可参考Qt控制I.MX6U开发板的一个蜂鸣器,本篇介绍Qt使用I.MX6U开发板上的按键的相关内容。 文章目录 1. 开发板硬…

李宏毅机器学习第一课(结尾附作业模型详细分析)

机器学习就是让机器找一个函数f,这个函数f是通过计算机找出来的 如果参数少的话,我们可以使用暴搜,但是如果参数特别多的话,我们就要使用Gradient Descent Regression (输出的是一个scalar数值) Classification (在…

QT配置MySQL数据库 ninja: build stopped: subcommand failed

QT配置MySQL数据库 我当前的软件版本:QT Creator 10.0.2 (community),MingW 6.4.3 (QT6),MySQL 8.0。 MySQL不配置支持的数据库有QList("QSQLITE", "QODBC", "QPSQL"),这个时候是不支持MYSQL数据…

数据集笔记:2015上海地铁一卡通数据

数据地址:上海地铁数据_免费高速下载|百度网盘-分享无限制 (baidu.com) 数据介绍 上海2015年几天的地铁一卡通出入站信息 卡号、交易日期、交易时间、公交线路/地铁站点中文名称、行业名称(公交、地铁、出租、轮渡、PR停车场)、交易金额、交易性质(非优惠、优惠、…

PHP生成二维码带图标代码实例

PHP生成二维码带图标代码实例(PHP QR Code二维码生成类库) public static function png($text, $outfilefalse, $levelQR_ECLEVEL_L, $size3, $margin4, $saveandprintfalse) { $enc QRencode::factory($level, $size, $margin); return $enc->…

token登录的实现

token登录的实现 我这种token只是简单的实现token,就是后端利用UUID 生成简单随机码,利用随机码作为在Redis中的键,然后存储的用户信息作为值,在每次合理请求的时候对token的有效时间进行刷新(利用拦截器)&…

第P7周—咖啡豆识别(1)

数据集及wen件目录介绍: 数据集:工作台 - Heywhale.com 一、前期工作 1.1 数据详情 import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasets import os,…

笔试强训Day7

T1&#xff1a;合法括号序列判断 链接&#xff1a;合法括号序列判断__牛客网 给定一个字符串A和其长度n&#xff0c;请返回一个bool值代表它是否为一个合法的括号串&#xff08;只能由括号组成&#xff09;。 经典括号匹配问题&#xff0c;考察栈的使用 #include<iostre…

Pytest+Allure+Excel接口自动化测试框架实战

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具&#xff0c;它不仅以 Web 的方式展示了简介的测试结果&#xff0c;而且允许参与开发过程的每个人可以从日常执行的测试中&#xff0c;最大限度地提取有用信息。 Allure 是由 Java 语言开发的…

常识判断 --- 科技常识

目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型