springboot虹软人脸识别集成
准备工作
虹软开放平台中创建一个新的应用
虹软开发平台【点我跳转】
开始上代码
基本配置
将下载的jar包放到src同级目录下
<!-- 虹软--><dependency><groupId>com.arcsoft.face</groupId><artifactId>arcsoft-sdk-face</artifactId><version>3.0.0.0</version><scope>system</scope><systemPath>${basedir}/libs/arcsoft-sdk-face-3.0.0.0.jar</systemPath></dependency><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 加入下面这一行 --><includeSystemScope>true</includeSystemScope></configuration><version>2.3.4.RELEASE</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin>
配置类初始化
@Data
@Configuration
@ConfigurationProperties(prefix = "arcsoft")
public class ArcSoftConfig {private String appid;// win平台sdk 此处为了开发时调试 生产一般linux 不需要此设置private String winsdkkey;// linux平台sdk private String linuxsdkkey;// dll/so库路径private String libpath;/*** 装载FaceEngine交给spring托管* * @return*/@Beanpublic FaceEngine faceEngine() {String sdkkey = "";String os = System.getProperty("os.name");if (os.toLowerCase().startsWith("win")) {sdkkey = winsdkkey;String projectPath = System.getProperty("user.dir");libpath = projectPath + "\\libs\\WIN64";} else {sdkkey = linuxsdkkey;}FaceEngine faceEngine = new FaceEngine(libpath);int errorCode = faceEngine.activeOnline(appid, sdkkey);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {throw new RuntimeException("引擎注册失败");}EngineConfiguration engineConfiguration = getFaceEngineConfiguration();// 初始化引擎errorCode = faceEngine.init(engineConfiguration);if (errorCode != ErrorInfo.MOK.getValue()) {throw new RuntimeException("初始化引擎失败");}return faceEngine;}/*** 初始化引擎配置* * @return*/private EngineConfiguration getFaceEngineConfiguration() {EngineConfiguration engineConfiguration = new EngineConfiguration();// 配置引擎模式if ("IMAGE".equals(EngineConfigurationProperty.DETECT_MODE)) {engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);} else {engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_VIDEO);}// 配置人脸角度 全角度 ASF_OP_ALL_OUT 不够准确且检测速度慢switch (EngineConfigurationProperty.DETECT_FACE_ORIENT_PRIORITY) {case "ASF_OP_0_ONLY":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);break;case "ASF_OP_90_ONLY":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_90_ONLY);break;case "ASF_OP_270_ONLY":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_270_ONLY);break;case "ASF_OP_180_ONLY":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_180_ONLY);break;case "ASF_OP_ALL_OUT":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);break;default:engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);}// 设置识别的最小人脸比engineConfiguration.setDetectFaceScaleVal(EngineConfigurationProperty.DETECT_FACE_SCALE);engineConfiguration.setDetectFaceMaxNum(EngineConfigurationProperty.DETECT_FACE_MAX_NUM);// 功能配置initFuncConfiguration(engineConfiguration);return engineConfiguration;}/*** 功能配置* * @param engineConfiguration*/private void initFuncConfiguration(EngineConfiguration engineConfiguration) {FunctionConfiguration functionConfiguration = new FunctionConfiguration();// 是否支持年龄检测functionConfiguration.setSupportAge(FunConfigurationProperty.SUPPORT_AGE);// 是否支持3d 检测functionConfiguration.setSupportFace3dAngle(FunConfigurationProperty.SUPPORT_FACE_3D_ANGLE);// 是否支持人脸检测functionConfiguration.setSupportFaceDetect(FunConfigurationProperty.SUPPORT_FACE_DETECT);// 是否支持人脸识别functionConfiguration.setSupportFaceRecognition(FunConfigurationProperty.SUPPORT_FACE_RECOGNITION);// 是否支持性别检测functionConfiguration.setSupportGender(FunConfigurationProperty.SUPPORT_GENDER);// 是否支持活体检测functionConfiguration.setSupportLiveness(FunConfigurationProperty.SUPPORT_LIVENESS);// 是否支持IR活体检测functionConfiguration.setSupportIRLiveness(FunConfigurationProperty.SUPPORT_IR_LIVENESS);engineConfiguration.setFunctionConfiguration(functionConfiguration);}
}
yml配置文件
其他配置
引擎类
public class EngineConfigurationProperty {/*** 引擎模式*/public static final String DETECT_MODE = "IMAGE";/*** 配置人脸角度*/public static final String DETECT_FACE_ORIENT_PRIORITY = "ASF_OP_ALL_OUT";/*** 设置识别的最小人脸比*/public static final Integer DETECT_FACE_SCALE = 32;/*** 最大检测人脸数*/public static final Integer DETECT_FACE_MAX_NUM = 8;
}
功能类
public class FunConfigurationProperty {/*** 是否支持3d 检测*/public static final Boolean SUPPORT_FACE_3D_ANGLE = true;/*** 是否支持人脸检测*/public static final Boolean SUPPORT_FACE_DETECT = true;/*** 是否支持人脸识别*/public static final Boolean SUPPORT_FACE_RECOGNITION = true;/*** 性别检测*/public static final Boolean SUPPORT_GENDER = true;/*** 年龄检测*/public static final Boolean SUPPORT_AGE = true;/*** 是否支持活体检测*/public static final Boolean SUPPORT_LIVENESS = true;/*** 是否至此IR活体检测*/public static final Boolean SUPPORT_IR_LIVENESS = true;
}
人脸相关方法
@Component
public class ArcFaceMothodUtils {@Autowiredprivate FaceEngine faceEngine;/*** 人脸检测*/public List<FaceInfo> detectFace(ImageInfoEx imageInfoEx) {if (imageInfoEx == null) {return null;}List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();int i = faceEngine.detectFaces(imageInfoEx, DetectModel.ASF_DETECT_MODEL_RGB, faceInfoList);checkEngineResult(i, ErrorInfo.MOK.getValue(), "人脸检测失败");return faceInfoList;}/*** 特征提取*/public FaceFeature extractFaceFeature(List<FaceInfo> faceInfoList, ImageInfoEx imageInfoEx) {if (faceInfoList == null || imageInfoEx == null) {return null;}FaceFeature faceFeature = new FaceFeature();int i = faceEngine.extractFaceFeature(imageInfoEx, faceInfoList.get(0), faceFeature);checkEngineResult(i, ErrorInfo.MOK.getValue(), "人脸特征提取失败");return faceFeature;}/*** 特征比对*/public FaceSimilar compareFaceFeature(FaceFeature target, FaceFeature source, CompareModel compareModel) {FaceSimilar faceSimilar = new FaceSimilar();int i = faceEngine.compareFaceFeature(target, source, compareModel, faceSimilar);checkEngineResult(i, ErrorInfo.MOK.getValue(), "人脸特征对比失败");return faceSimilar;}/*** 错误检测*/private void checkEngineResult(int errorCode, int sourceCode, String errMsg) {if (errorCode != sourceCode) {throw new RuntimeException(errMsg);}}
}
虹软图片处理工具类
@Slf4j
public class ArcfaceUtils {/*** 处理 File 的图片流* * @param img* @return*/public static ImageInfoMeta packImageInfoEx(File img) {ImageInfo imageInfo = ImageFactory.getRGBData(img);return packImageInfoMeta(imageInfo);}/*** 处理 byte[] 的图片流* * @param img* @return*/public static ImageInfoMeta packImageInfoMeta(byte[] img) {ImageInfo imageInfo = ImageFactory.getRGBData(img);return packImageInfoMeta(imageInfo);}/*** 处理 InpuStream 的图片流* * @param img* @return*/public static ImageInfoMeta packImageInfoMeta(InputStream img) {ImageInfo imageInfo = ImageFactory.getRGBData(img);return packImageInfoMeta(imageInfo);}/*** 处理 网络图片 的图片流** @param path* @return*/public static ImageInfoMeta packImageInfoURL(String path) {try {InputStream inputStream = getImageInputStream(path);ImageInfo imageInfo = ImageFactory.getRGBData(inputStream);return packImageInfoMeta(imageInfo);} catch (Exception e) {log.error("处理网络图片处理失败", e);}return null;}/*** 处理 base图片 的图片流** @param base64* @return*/public static ImageInfoMeta packImageInfoBase64(String base64) {try {ImageInfo imageInfo = ImageFactory.getRGBData(removeBase64Prefix(base64));return packImageInfoMeta(imageInfo);} catch (Exception e) {log.error("处理网络图片处理失败", e);}return null;}public static byte[] removeBase64Prefix(String base64String) {if (base64String.startsWith("data:image/jpeg;base64,")) {base64String = base64String.replace("data:image/jpeg;base64,", "");}if (base64String.startsWith("data:image/png;base64,")) {base64String = base64String.replace("data:image/png;base64,", "");}return Base64.getDecoder().decode(base64String);}public static InputStream getImageInputStream(String imageUrl) throws Exception {URL url = new URL(imageUrl);URLConnection connection = url.openConnection();return connection.getInputStream();}/*** 打包生成 ImageInfoMeta* * @param imageInfo* @return*/private static ImageInfoMeta packImageInfoMeta(ImageInfo imageInfo) {ImageInfoMeta imageInfoMeta = new ImageInfoMeta(imageInfo);return imageInfoMeta;}/*** 对imageInfo 和 imageInfoEx 的打包对象* * @return*/@Datapublic static class ImageInfoMeta {private ImageInfo imageInfo;private ImageInfoEx imageInfoEx;public ImageInfoMeta(ImageInfo imageInfo) {this.imageInfo = imageInfo;imageInfoEx = new ImageInfoEx();imageInfoEx.setHeight(imageInfo.getHeight());imageInfoEx.setWidth(imageInfo.getWidth());imageInfoEx.setImageFormat(imageInfo.getImageFormat());imageInfoEx.setImageDataPlanes(new byte[][] { imageInfo.getImageData() });imageInfoEx.setImageStrides(new int[] { imageInfo.getWidth() * 3 });}}}
实际业务使用
// 开始使用虹软人脸识别ArcfaceUtils.ImageInfoMeta imageInfoMeta1 = ArcfaceUtils.packImageInfoURL(photo);if (null == imageInfoMeta1) {throw new ValidatorException("您的人脸信息在系统内已失效请重新录入");}// 系统的人脸库信息List<FaceInfo> faceInfo1 = arcFaceMothodUtils.detectFace(imageInfoMeta1.getImageInfoEx());FaceFeature faceFeature1 = arcFaceMothodUtils.extractFaceFeature(faceInfo1, imageInfoMeta1.getImageInfoEx());// 当前需要对比的人脸ArcfaceUtils.ImageInfoMeta imageInfoMeta2 = ArcfaceUtils.packImageInfoBase64(dto.getFacePic());if (null == imageInfoMeta2) {throw new ValidatorException("您的人脸信息人脸特征提取失败,请重试");}List<FaceInfo> faceInfo2 = arcFaceMothodUtils.detectFace(imageInfoMeta2.getImageInfoEx());FaceFeature faceFeature2 = arcFaceMothodUtils.extractFaceFeature(faceInfo2, imageInfoMeta2.getImageInfoEx());FaceSimilar faceSimilar = arcFaceMothodUtils.compareFaceFeature(faceFeature1, faceFeature2,CompareModel.LIFE_PHOTO);// 相似度float score = faceSimilar.getScore();log.info("当前匹配的身份证信息【{}】,相似度:{}", dto.getUserId(), score);
希望对大家能够有所帮助 仅作为个人笔记使用
相关文章:
springboot虹软人脸识别集成
准备工作 虹软开放平台中创建一个新的应用 虹软开发平台【点我跳转】 开始上代码 基本配置 将下载的jar包放到src同级目录下 <!-- 虹软--><dependency><groupId>com.arcsoft.face</groupId><artifactId>arcsoft-sdk-face</artifactI…...
Element+vue3.0 tabel合并单元格span-method
Elementvue3.0 tabel合并单元格 span-method :span-method"objectSpanMethod"详解: 在 objectSpanMethod 方法中,rowspan 和 colspan 的值通常用来定义单元格的行跨度和列跨度。 一般来说,rowspan 和 colspan 的值应该是大于等于…...
Python学习笔记第七十九天(OpenCV轨迹栏)
Python学习笔记第七十九天 OpenCV轨迹栏cv.createTrackbarcv.getTrackbarPos两者合并运用 后记 OpenCV轨迹栏 cv.getTrackbarPos 和 cv.createTrackbar 是 OpenCV 库中用于创建和获取跟踪条位置的函数。这些函数通常用于在视频处理或图像处理应用程序中创建用户界面࿰…...
uniapp自定义顶部导航并解决打包成apk后getMenuButtonBoundingClientRect方法失效问题
需求:要在app上的顶部导航提示哪里添加一些东西进去,用uniapp自带的肯定不行啊,所以自定义了所有的页面的顶部导航,之后自定义后用手机调试发现 uni.getMenuButtonBoundingClientRect()这个方法的top获取不到....网上找了很多种方…...
C++入门【26-C++ Null 指针】
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。 NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序: 实例 #include <iostream> using…...
Linux第14步_安装FTP服务器
安装“vim编辑器”后,我们紧接着“安装FTP服务器”。 1、在安装前,要检查虚拟机可以上网,否则可能会导致安装失败。 2、在虚拟机界面右击鼠标,弹出下面的对话框 3、点击“打开终端(E)”,得到下面的界面 :…...
Linux截图方法推荐
因为经常会遇到以图为证的情况,而办公设备基本都是linux,所以汇总一下常见的linux截图方式。 1:在 Linux 中系统集成的截图的默认方式 你想要截取整个屏幕?屏幕中的某个区域?某个特定的窗口? 如果只需要获取一张屏幕…...
在Gitee上维护Erpnext源
在Gitee上维护Erpnext源 官方的frappe和erpnext地址: GitHub - frappe/frappe: Low code web framework for real world applications, in Python and Javascript GitHub - frappe/erpnext: Free and Open Source Enterprise Resource Planning (ERP) 1, 仓库地址输入frappe的官…...
2024.1.9 基于 Jedis 通过 Java 客户端连接 Redis 服务器
目录 引言 RESP 协议 Redis 通信过程 实现步骤 步骤一 步骤二 步骤三 步骤四 引言 在 Redis 命令行客户端中手敲命令并不是我们日常开发中的主要形式而更多的时候是使用 Redis 的 API 来实现定制化的 Redis 客户端程序,进而操作 Redis 服务器即使用程序来操…...
软件测试|SQL ORDER BY排序利器使用
简介 在SQL查询语言中,ORDER BY子句是一项重要的功能,它允许我们按照指定的列或表达式对查询结果进行排序。本文将详细介绍SQL ORDER BY子句的用法、常见排序方式以及在实际应用中的应用场景。 ORDER BY子句 SQL是一种用于管理和操作关系型数据库的强…...
苹果手机IOS软件应用IPA砸壳包提取完整教程
我们有很多小伙伴可能想要获取到苹果手机软件的安装包但又不知该如何获取,本文就教你如何获取到IOS软件的IPA砸壳包 首先我们需要准备一台越狱的苹果IOS设备,如果不知如何越狱的可以参考这篇苹果手机越狱教程:https://www.hereitis.cn/artic…...
「 网络安全术语解读 」内容安全策略CSP详解
引言:什么是CSP,它为什么可以防御一些常见的网络攻击,比如XSS攻击,具体原理是什么?以及如何绕过CSP? 1. CSP定义 CSP(Content Security Policy,内容安全策略)是一种网络…...
Docker与微服务实战(基础篇)
Docker与微服务实战(基础篇) 1、Docker简介2、Docker安装步骤1.Centos7及以上的版本2.卸载旧版本3.yum安装gcc相关4.安装需要的软件包5.设置stable镜像仓库【国内aliyun】6.更新yum软件包索引--以后安装更快捷7.安装Docker-Ce8.启动Docker9.测试10.卸载1…...
「实用分享」如何用Telerik UI组件创建可扩展的企业级WPF应用?
Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成Visual Studio…...
【Docker基础三】Docker安装Redis
下载镜像 根据自己需要下载指定版本镜像,所有版本看这:Index of /releases/ (redis.io) 或 https://hub.docker.com/_/redis # 下载指定版本redis镜像 docker pull redis:7.2.0 # 查看镜像是否下载成功 docker images 创建挂载目录 # 宿主机上创建挂…...
【Flink精讲】Flink数据延迟处理
面试题:Flink数据延迟怎么处理? 将迟到数据直接丢弃【默认方案】将迟到数据收集起来另外处理(旁路输出)重新激活已经关闭的窗口并重新计算以修正结果(Lateness) Flink数据延迟处理方案 用一个案例说明三…...
vue项目心得(复盘)
在编写项目过程中,首先是接手一个需要优化的项目,需要查看vue.config.js环境配置地址,确认好测试地址后进行开发,目前在开发过程中,遇到的最多的问题就是关于组件间的, 组件间传值 1、父组件异步传值&…...
Linux——firewalld防火墙(一)
一、Linux防火墙基础 Linux 的防火墙体系主要工作在网络层.针对TCP/P数据包实时过滤和限制.属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现.具有非常稳定的性能和高效率,也因此获得广泛的应用.在CentOS 7系统中几种…...
JMeter之Windows安装
JMeter之Windows安装 一、安装JDK二、安装JMeter1、下载JMeter2、配置环境变量3、验证JMeter 三、扩展知识1、汉化 一、安装JDK 略 二、安装JMeter 1、下载JMeter 官网地址:https://jmeter.apache.org/download_jmeter.cgi 放到本地目录下 2、配置环境变量 变量…...
用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战
Retrieval-Augmented Generation(RAG)是一种强大的技术,能够提高大型语言模型(LLM)的性能,使其能够从外部知识源中检索信息以生成更准确、具有上下文的回答。 本文将详细介绍 RAG 在 LangChain 中的应用&a…...
正则表达式的语法
如果要想灵活的运用正则表达式,必须了解其中各种元素字符的功能,元字符从功能上大致分为: 限定符 选择匹配符 分组组合和反向引用符 特殊字符 字符匹配符 定位符 我们先说一下元字符的转义号 元字符(Metacharacter)-转义号 \\ \\ 符号…...
MyBatis分页插件的实现原理
MyBatis 分页插件的实现原理是通过拦截器(Interceptor)来实现的。拦截器可以在 SQL 执行前后对 SQL 进行拦截和处理。 简单来说,就是通过在查询语句中添加额外的参数和逻辑,以支持分页功能。它的核心思想是将分页参数传递给插件&…...
Winform、WPF如何解决前端卡死问题
在WinForms和WPF中,前端卡死问题通常是由于长时间的计算或阻塞操作导致的。以下是一些解决前端卡死问题的常见方法: 使用异步操作:将长时间的计算或阻塞操作放在后台线程中执行,以避免阻塞UI线程。可以使用Task、async/await等异步…...
python内app自动化测试的局限性,该如何破局?
Python在App自动化测试方面非常流行,尤其对于移动应用(Android和iOS)的测试,可以借助于像Appium、Robot Framework等工具进行跨平台自动化。然而,即使使用Python这样的强大语言,App自动化测试也存在一些局限…...
k8s的node亲和性和pod亲和性和反亲和性 污点 cordon drain
node亲和性和pod亲和性和反亲和性 污点 cordon drain 集群调度: schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配,不走调度策略,node01 nodeSelector:根据节点的标签选择,会走调度的算法 只…...
IntelliJ IDEA如何使用固定地址公网远程访问本地Mysql数据库
文章目录 1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql小结 5. 固定连接公网地址6. 固定地址连接测试 IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如Mysql数据库,但是在IDEA中只能连接本…...
GIT - 清除历史 Commit 瘦身仓库
目录 一.引言 二.仓库清理 ◆ 创建一个船新分支 ◆ 提交最新代码 ◆ 双指针替换分支 三.总结 一.引言 由于项目运行时间较长,分支较多,且分支内包含很多不同的大文件,随着时间的推移,历史 Git 库的容量日渐增发,…...
物联网产品中,终端、网关、协议、PaaS、SaaS之间的关系
在互联网产品中,经常提到的终端、网关、协议、PaaS、SaaS之间,到底有什么关系呢? 一、基本概念 在百度/其他地方搜集的信息中,对于终端、网关、协议、PaaS、SaaS的解释各有不同,整理如下: 终端࿱…...
6款实用的Git可视化管理工具
前言 俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用门槛。我们在团队开发中统一某个开发工具能够降低沟通成本,提高协作效率。今天给大家分享6款实用的Git可视化管理工具。 Git是什么&…...
python_selenium零基础爬虫学习案例_知网文献信息
案例最终效果说明: 去做这个案例的话是因为看到那个博主的分享,最后通过努力,我基本实现了进行主题、关键词、更新时间的三个筛选条件去获取数据,并且遍历数据将其导出到一个CSV文件中,代码是很简单的,没有…...
成都科技网站建设服务热线/大泽山seo快速排名
原文:Understanding Property Wrappers in SwiftUI 12 Jun 2019 上周,我们介绍了一系列关于 SwiftUI 框架的新帖子。今天,我将继续这个话题,介绍 SwiftUI 的属性包装器 Property Wrapper。SwiftUI 提供的属性包装器包括 State, Bi…...
如何创建网站的详细步骤/公司网站推广怎么做
现在有n个人要排成一列,编号为1->n 。但由于一些不明原因的关系,人与人之间可能存在一些矛盾关系,具体有m条矛盾关系(u,v),表示编号为u的人想要排在编号为v的人前面。要使得队伍和谐,最多不能违背k条矛盾关系(即不能…...
景德镇建设局网站/查询关键词网站
磁盘设备命名: /dev/sda1 s 硬件的接口类型(sata/scsi),ddisk(硬盘),a第一块硬盘,b第二块,2第几个分区 磁盘分区划分思路: 1.进入分区表 新建分区 fdisk 2.更新分区表 …...
上海网站设计制作公司/浏览器观看b站视频的最佳设置
抄书 (二分查找贪心) 提示:二分查找一般写成非递归形式 时间复杂度:O(logn) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid85904#problem/B Description Co…...
b站网站大全下载/网站seo优化方法
1、声明Bean的注解: Component : 组件,没有明确的角色 Service : 在业务逻辑层(service层)使用 Repository : 在数据访问层(dao层)使用. Controller : 在展现层(MVC--SpringMVC)使用 2、注入Bean的注解: Aautowired : Spring提供的注解. Inject : JSR-330提供的注解…...
郑州做网站推广电话/百度链接收录
求二分图最大完备匹配数和序最大的方案,匈牙利算法解决。 1 /*2 ID:esxgx13 LANG:C4 PROG:hdu37295 */6 #include <cstdio>7 #include <cstring>8 #include <iostream>9 #include <stack> 10 #include <algorithm> 11 using namespac…...