java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)

目录

1、七牛云内容审核介绍

2、查看内容审核官方文档

2.1、文本内容审核

2.1.1、文本内容审核的请求示例

2.1.2、文本内容审核的返回示例

2.2、图片内容审核

2.2.1、请求参数

2.2.2、返回参数

2.3、视频内容审核

3、代码实现

3.1、前期代码准备

3.2、文本内容审核

3.3、图片内容审核

3.4、视频内容审核

1、七牛云内容审核介绍

        在之前做的一个项目中,用了七牛云的内容审核API,感觉很有意思。所以在这里写一下在JavaWeb项目中怎么使用七牛云的内容审核功能。

        七牛云的内容审核服务是一套综合性的解决方案,旨在帮助用户在不同的应用场景中实现对多媒体内容的智能审核和管理。无论是在社交平台、直播、短视频、在线社区,还是在电商、教育等领域,七牛云的审核服务都能提供全面的支持,确保用户上传、存储、分发或展示的内容符合合规要求。

        在这篇博客中主要是探讨对文本、图片和视频这三类的内容审核在java中的实现。

2、查看内容审核官方文档

        在七牛云的官方文档中,详细的写了相关内容审核API的【使用限制、功能描述、请求参数、返回参数】等。还有相关的代码示例提供参考。

        在这些文档中,我们最需要了解的是怎么正确的去请求我们想使用的API,并接收API返回的结果。

        这个大概的代码思路就是,不管是文本、图片还是视频的审核,我们都需要创建HTTP请求来发送请求到相应的API,然后再接收API审核后的结果。在这个结果中就有对每一种场景审核的详细信息,这三种审核的结果还是有些差异的,所以放到后面详细讨论。

        请求又分为了请求头和请求体。

在请求头部分:这三种审核除了各自需要访问的七牛云内部接口不同,其他参数都是一样的。

文本内容审核访问内部接口:v3/text/censor

图片内容审核访问内部接口:/v3/image/censor

视频内容审核访问内部接口:/v3/video/censor

本内容审核请求头为例:

POST /v3/text/censor HTTP/1.1
Host: ai.qiniuapi.com
Content-Type: application/json
Authorization: Qiniu YnxrxOSvGotRZpqkZnMzl_euuoqRzOKUd6zwbRju:r6a-o2UpBg6A4puIMnkCExH8lE8=

 对请求头的解释:

POST:请求方式

/v3/text/censor:七牛云内容审核 API 的一个具体端点路径,用于调用文本内容的审核功能

HTTP/1.1:网络协议

Host: ai.qiniuapi.com:域名,这个域名是七牛云提供的一个特定服务入口,专门处理与人工智能相关的 API 请求,包括文本、图片、视频等内容的审核

Content-Type: application/json:告诉服务器请求的消息主体(body)中包含的数据类型。在这个请求中,它指示消息主体的内容是 JSON 格式。

Authorization: Qiniu YnxrxOSvGotRZpqkZnMzl_euuoqRzOKUd6zwbRju:r6a-o2UpBg6A4puIMnkCExH8lE8=

Authorization是 HTTP 头字段,用于携带认证信息,让服务器知道请求来自哪里,以及它是否有权限执行该请求。

Qiniu YnxrxOSvGotRZpqkZnMzl_euuoqRzOKUd6zwbRju:r6a-o2UpBg6A4puIMnkCExH8lE8= 是将 AccessKey 和签名字符串通过冒号 : 拼接在一起,形成最终的认证字符串,作为 Authorization 头的值发送给服务器

2.1、文本内容审核

文本内容审核官方文档:API调用文本审核_API 文档_内容审核 - 七牛开发者中心 (qiniu.com)

2.1.1、文本内容审核的请求示例

POST /v3/text/censor HTTP/1.1
Host: ai.qiniuapi.com
Content-Type: application/json
Authorization: Qiniu YnxrxOSvGotRZpqkZnMzl_euuoqRzOKUd6zwbRju:r6a-o2UpBg6A4puIMnkCExH8lE8=
{"data": {"text": "七牛文本审核示例"},"params": {"scenes": ["antispam"]}
}

{ }里面的就是请求体了,在这个示例当中的请求体是JSON格式的。
其中的 "data"是需要审核的内容,"params" 是审核类型

文本内容审核支持的审核类型只有 antispam,其对应的label如下:

2.1.2、文本内容审核的返回示例

{"message": "OK","code": 200,"result": {"scenes": {"antispam": {...... // 详细信息}},"suggestion": "pass"}
}

上面示例中结果的字段含义如下: 

2.2、图片内容审核

图片内容审核官方文档:API调用图片审核_API 文档_内容审核 - 七牛开发者中心 (qiniu.com)
 

下面是这个个文档中主要的几个部分

2.2.1、请求参数

请求参数有两个字段,分别是代表需要进行审核的图片资源访问路径(data.uri)和 代表需要审核哪些类型的场景(params.scenes)例如:图片鉴黄(pulp)、图片鉴暴恐(terror)、图片敏感人物识别(politician)等。更多的场景类型可以从官方文档了解
 

具体信息如下:

请求示例:

POST /v3/image/censor HTTP/1.1
Host: ai.qiniuapi.com
Content-Type: application/json
Authorization: Qiniu YnxrxOSvGotRZpqkZnMzl_euuoqRzOKUd6zwbRju:r6a-o2UpBg6A4puIMnkCExH8lE8=
{"data": {"uri": "https://mars-assets.qnssl.com/resource/gogopher.jpg"},"params": {"scenes": ["pulp","terror","politician"]}
}

在这个请求示例中:

需要进行审核的图片访问路径就是:"https://mars-assets.qnssl.com/resource/gogopher.jpg"

而选择的审核场景类型是:"pulp" , "terror" , "politician"

图片内容审核的API在接收到我们的这个请求后,就会去对这个指定路径的图片进行审核,并且只会审核这个图片有没有涉及黄色、涉及暴恐、涉及敏感人物

2.2.2、返回参数

返回示例:

{"message": "OK","code": 200,"result": {"scenes": {"terror": {......// 详细信息},"politician": {......// 详细信息},"pulp": {......// 详细信息}},"suggestion": "pass"}
}

1、result.suggestion:这是对这张图片审核后,API给出的最终建议,主要的取值为 通过(pass)、人工复核(review)、违规(block)这三种。

2、result.scenes:这里面包含了对每种场景审核后的详细信息

2.3、视频内容审核

视频内容审核官方文档:API调用视频审核_API 文档_内容审核 - 七牛开发者中心 (qiniu.com)

视频审核的场景类型和图片审核的差不多,这里就不讲了。主要还是讲一下请求体种携带的参数。

请求示例中的请求体:解释直接以注释的形式写在代码中了

{"data": {// uri是视频文件的URL地址。这个URI指向你希望审核的具体视频文件"uri": "https://mars-assets.qnssl.com/scene.mp4",// id是该次视频审核请求的唯一标识符。这是一个自定义参数,// 用于跟踪和管理审核任务。这个参数不是必选的,如果你没有指定,他会自己生成一个唯一标识返回给你"id": "video_censor_test"},"params": {// scenes是要审核的场景类型列表。每个场景代表一个审核类别,系统会根据这些场景进行相应的内容检查"scenes": ["pulp","terror","politician"],// cut_params是视频截帧参数,用于配置视频在审核过程中如何进行截帧分析。// 通过这个参数,可以控制视频审核的截帧频率"cut_param": {"interval_msecs": 5000}}
}

当我们创建好请求并发送给视频内容审核的API后,他会立即返回这次审核任务的唯一标识符 "job_id" ,视频审核结果需要通过job_id获得。因为视频审核的时间是取决于视频的时长以及视频审核的截帧频率,所以时间会比较长,那么就需要以异步或者是循环等待的方式通过"job_id"去获取视频审核的结果

通过"job_id"去获取视频审核的结果的请求如下:请求路径就是 "/v3/jobs/video/" 再加上 "job-id"

GET /v3/jobs/video/<job-id> HTTP/1.1
Host: ai.qiniuapi.com
Authorization: Qiniu <AccessKey>:<Sign>

通过"job_id"去获取视频审核的返回结果示例:

{"status": "FINISHED", // 这是任务的当前状态"rescheduled_at": "2019-02-22T20:15:49.931+08:00", // 这是任务被重新调度的时间戳"created_at": "2019-02-22T20:15:49.931+08:00","request": {...... // 请求信息},"updated_at": "2019-02-22T20:15:52.426+08:00","result": {"message": "OK","code": 200,"result": {"scenes": {"terror": {...... // 详细信息},"politician": {...... // 详细信息},"pulp": {...... // 详细信息},"suggestion": "pass"}},"id": "5c6fe7f59a0b0500082b774f" // 唯一标识符,标识这个特定的视频内容审核任务
}

在获取返回结果后,判断结果中的 "status" 是否是 ‘FINISHED’ ,当状态为 FINISHED 时,你可以查看并使用响应中的审核结果。最后再判断视频内容审核API对此次进行审核的视频给出的建议。

3、代码实现

3.1、前期代码准备

首先需要在项目的pom文件中引入七牛云的依赖

<dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.12.0</version>
</dependency>

然后需要创建一个类七牛云的相关配置,比如公钥(access-key)和私钥(secret-key)

 

import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import lombok.Data;
import org.springframework.stereotype.Component;/*** @Author 小涛Tao* @Date: 2024/05/29/20:04* version 1.0 注释:七牛云配置**/
@Data
@Component
public class QiNiuConfig {// 公钥(AK)private String accessKey = "填自己的";// 密钥(SK)private String secretKey = "填自己的";// 对象存储空间private String bucketName = "填自己的";/*** Auth 类的用途* Auth 类的主要用途包括:* (1)生成上传凭证:在上传文件到七牛云时,需要生成上传凭证(token),以便七牛云验证请求的合法性。* (2)生成下载凭证:在下载受保护的资源时,需要生成下载凭证,以便七牛云验证请求的合法性。* (3)生成请求签名:在调用七牛云 API 时,需要对请求进行签名,以便七牛云验证请求的合法性。** @return 通过AK和SK生成的Auth*/public Auth buildAuth() {String accessKey = this.getAccessKey();String secretKey = this.getSecretKey();return Auth.create(accessKey, secretKey);}/*** 获取包含认证信息的令牌 token ,来访问参数中的 url 这个路径, 并且只能用来访问这个 API* @param url 要访问的 API* @param method 请求的方法* @param body 请求主体* @param contentType 表示请求主体的数据格式,比如 JSON 格式* @return*/public String getToken(String url, String method, String body, String contentType) {final Auth auth = buildAuth();String qiniuToken = "Qiniu " + auth.signQiniuAuthorization(url, method, body == null ? null : body.getBytes(), contentType);return qiniuToken;}}

创建一个公共的父类,包含文本、图片、视频这三种审核共同需要用到的属性等。

import com.example.lt.config.QiNiuConfig;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @Author 小涛Tao* @Date: 2024/05/29/20:25* version 1.0 注释:三种审核方式的父类* **/
@Service
public class AuditService<T,R> {@Autowiredprotected QiNiuConfig qiNiuConfig;// DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES: 这是 Jackson 的一个配置选项,控制在反序列化过程中遇到未知属性(即 JSON 中存在而目标 Java 类中没有定义的属性)时的行为。// false: 将这个选项设置为 false 表示在反序列化过程中,如果 JSON 中存在未知属性,Jackson 不会抛出异常,而是忽略这些属性。默认情况下,这个选项是 true,即如果遇到未知属性会抛出 UnrecognizedPropertyException 异常。protected ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 请求体内容的数据结构类型,比如:JSON 数据结构static final String contentType = "application/json";}

创建接收审核结果的类,根据官方文档中返回结果示例内的字段来创建

(1)ResultChildJson类,用于封装 "result" 下的 "scenes" 和 "suggestion"

@Data
@ToString
public class ResultChildJson implements Serializable {String suggestion; // 建议ScenesJson scenes; // 场景 scenes 下包含具体的审核类型(场景)结果}

文本内容审核返回示例 

图片内容审核返回示例

(2)ResultJson类,用于封装状态码、结果体等信息

@Data
@ToString
public class ResultJson implements Serializable {Integer code; // 状态码String message; // 提示信息ResultChildJson resultChile; // 结果体 resultChile}

 视频内容审核返回示例

(3)BodyJson类,用于封装视频内容审核的结果

@Data
@ToString
public class BodyJson implements Serializable {String id; // 这次视频审核请求任务的唯一标识符String status; // 这个审核任务的状态,有没有完成ResultJson result; // 结果JSON结果中的 "result"}

 视频内容审核返回示例

3.2、文本内容审核

直接给代码了,代码中有注释

/*** @Author 小涛Tao* @Date: 2024/05/29/21:08* version 1.0 注释:文本内容审核**/
@Service
public class TextAuditService extends AuditService<String, Integer>{// 文本内容审核 API 地址static String textUrl = "http://ai.qiniuapi.com/v3/text/censor";// 根据官方文档的示例来自定义请求体static String textBody = "{\n" +"    \"data\": {\n" +"        \"text\": \"${text}\"\n" +"    },\n" +"    \"params\": {\n" +"        \"scenes\": [\n" +"            \"antispam\"\n" +"        ]\n" +"    }\n" +"}";/*** 暴露出去的文本审核方法* @param text 需要进行审核的文本** @return 0:代表审核通过    1:代表审核不通过*/@Overridepublic Integer audit(String text) {Integer auditState = 0; // 暂时先设置为审核成功String body = textBody.replace("${text}", text);// 把需要审核的文本放入请求体数据部分中String method = "POST";// 获取包含认证信息的 token,调用 qiNiuConfig 中的 getToken 方法获取final String token = qiNiuConfig.getToken(textUrl, method, body, contentType);// 设置访问审核文本 API 的请求头StringMap header = new StringMap();header.put("Host", "ai.qiniuapi.com");header.put("Authorization", token);header.put("Content-Type", contentType);Configuration cfg = new Configuration(Region.region2());final Client client = new Client(cfg);try {Response response = client.post(textUrl, body.getBytes(), header, contentType);// 获取响应的详细信息并按照 "\n" 进行分割,然后获取第三部分,因为文本审核结果中的 result 就是第三部分// 然后通过 objectMapper 将字符串转换成 Map 对象final Map map = objectMapper.readValue(response.getInfo().split("\n")[2], Map.class);// 将 map 中 key 为 "result" 的值转换成 ResultChildJson.class 类型的对象final ResultChildJson resultChild = objectMapper.convertValue(map.get("result"), ResultChildJson.class);// 文本审核直接审核 suggestion ,如果返回结果中的 suggestion 不是 pass 的话,就是不通过if (!resultChild.getSuggestion().equals("pass")) {auditState = 1;  // 设置审核结果为不通过}} catch (Exception e) {e.printStackTrace();}// 返回审核结果return auditState;}}

3.3、图片内容审核

/*** @Author 小涛Tao* @Date: 2024/05/30/14:44* version 1.0 注释:图片内容审核**/
@Service
public class ImageAuditService extends AuditService<String, Ingeter> {// 图片的内容审核 API 地址static String imageUlr = "http://ai.qiniuapi.com/v3/image/censor";// 根据官方文档的示例来自定义请求体static String imageBody = "{\n" +"    \"data\": {\n" +"        \"uri\": \"${url}\"\n" +"    },\n" +"    \"params\": {\n" +"        \"scenes\": [\n" +"            \"pulp\",\n" +"            \"terror\",\n" +"            \"politician\"\n" +"        ]\n" +"    }\n" +"}";/*** 暴露出去的图片审核方法* @param url 需要进行审核的图片资源路径** @return 0:代表审核通过    1:代表审核不通过*/@Overridepublic Ingeter audit(String url) {Integer auditState = 0; // 暂时先设置为审核成功try {String body = imageBody.replace("${url}", url); // 把自定义请求体中的 $url 替换成 url 参数String method = "POST";// 获取token,这个token只能用于请求 imageUlr ,且请求方法是形参 method 真实的方法,请求体也是必须是形参 body 一样,还有内容类型 contentTypefinal String token = qiNiuConfig.getToken(imageUlr, method, body, contentType);StringMap header = new StringMap();header.put("Host", "ai.qiniuapi.com");header.put("Authorization", token); // 设置 Authorization 为包含认证信息的 tokenheader.put("Content-Type", contentType);Configuration cfg = new Configuration(Region.region2());final Client client = new Client(cfg);Response response = client.post(imageUlr, body.getBytes(), header, contentType);// 获取响应的详细信息并按照 "\n" 进行分割,然后获取第三部分,因为图片审核结果中的 result 是第三部分// 然后通过 objectMapper 将字符串转换成 Map 对象final Map map = objectMapper.readValue(response.getInfo().split("\n")[2], Map.class);final ResultChildJson result = objectMapper.convertValue(map.get("result"), ResultChildJson.class);// 直接判断 suggestion ,如果返回结果中的 suggestion 不是 pass 的话,就是不通过if (!resultChild.getSuggestion().equals("pass")) {auditState = 1;  // 设置审核结果为不通过}} catch (Exception e) {e.printStackTrace();}return auditState;}}

3.4、视频内容审核

/*** @Author 小涛Tao* @Date: 2024/05/30/14:56* version 1.0 注释:视频审核**/
@Service
public class VideoAuditService extends AbstractAuditService<String, AuditResponse> {// 视频内容审核 API 地址static String videoUrl = "http://ai.qiniuapi.com/v3/video/censor";// 根据官方文档的示例来自定义请求体static String videoBody = "{\n" +"    \"data\": {\n" +"        \"uri\": \"${url}\",\n" +"        \"id\": \"video_censor_test\"\n" +"    },\n" +"    \"params\": {\n" +"        \"scenes\": [\n" +"            \"pulp\",\n" +"            \"terror\",\n" +"            \"politician\"\n" +"        ],\n" +"        \"cut_param\": {\n" +"            \"interval_msecs\": 5000\n" +"        }\n" +"    }\n" +"}";/*** 暴露出去的视频审核方法* @param url 需要进行审核的视频资源路径** @return 0:代表审核通过    1:代表审核不通过*/@Overridepublic AuditResponse audit(String url) {Integer auditState = 0; // 暂时先设置为审核成功String body = videoBody.replace("${url}", url);String method = "POST";// 获取包含认证信息的 tokenfinal String token = qiNiuConfig.getToken(url, method, body, contentType);StringMap header = new StringMap();header.put("Host", "ai.qiniuapi.com");header.put("Content-Type", contentType);header.put("Authorization", token);final Configuration config = new Configuration(Region.region2());final Client client = new Client(config);try {final Response response = client.post(videoUrl, body.getBytes(), header, contentType);// 解析返回结果,里面有这次视频审核任务的唯一 id(job-id)final Map map = objectMapper.readValue(response.getInfo().split("\n")[2], Map.class);final Object job = map.get("job");// 生成访问这次视频审核任务的 urlurl = "http://ai.qiniuapi.com/v3/jobs/video/" + job.toString();method = "GET";header = new StringMap();header.put("Host", "ai.qiniuapi.com");// 获取包含认证信息的 token,并放入请求头中的 "Authorization"header.put("Authorization", qiNiuConfig.getToken(url, method, null, null));// 获取视频审核结果while (true) {Response response1 = client.get(url, header);final BodyJson bodyJson = objectMapper.readValue(response1.getInfo().split("\n")[2], BodyJson.class);// 如果从七牛云获取到的审核结果的状态【status】不是 “FINISHED”,则不进行校验(audit)方法,而是等待 2 秒再去获取一次,知直到状态为 “FINISHED”if (bodyJson.getStatus().equals("FINISHED")) {// 直接判断 suggestion ,如果返回结果中的 suggestion 不是 pass 的话,就是不通过if (!bodyJson.getResult().getResultChile().getSuggestion().equals("pass")) {auditState = 1;  // 设置审核结果为不通过}return auditState; // 返回审核结果}// 否则就等待两秒,然后再去获取并判断审核结果的状态【status】是不是 “FINISHED”Thread.sleep(2000L);}} catch (Exception e) {e.printStackTrace();}return auditState; // 返回审核结果}}

后续可以再将这些代码该进一下,使得对内容审核的判断更加的灵活 !

推荐: 

【Spring】Spring AOP底层原理前置知识:代理模式中的静态代理-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/139106845?spm=1001.2014.3001.5501
【Spring】Spring AOP底层原理:JDK动态代理和CGLIB动态代理_spring cglib和jdk动态代理-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/139243897?spm=1001.2014.3001.5501【Spring】RestTemplete工具类_resttemplate工具类-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/140543400?spm=1001.2014.3001.5501

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scrapy框架进行数据采集详细实现

摘要 本项目是python课程的课程项目&#xff0c;在简要学习完python和爬虫相关的Scrapy框架后&#xff0c;基于这两者的运用最终完成了对于北京链家网站新房页面的信息进行爬取&#xff0c;并将爬取的数据存放于excel之中&#xff0c;可使用excel或者wps进行查看。 1 引言 1…

HYDRUS2D/3D模型技术教程

原文链接&#xff1a;HYDRUS2D/3D模型技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247612514&idx6&snadf080ddb3394d2f758fc269fa6ce9dc&chksmfa827985cdf5f093af1410f151e11fb6d4b39e7533f401624dc2a2375bdcc74b4b0f6160c58b&token1585…

论文分享 | Fuzz4All: 基于大语言模型的通用模糊测试

大语言模型是当前最受关注的研究热点&#xff0c;基于其生成和理解能力&#xff0c;对现有领域在提升性能和效果上做更多尝试。分享一篇发表于2024年ICSE会议的论文Fuzz4All&#xff0c;它组合多个大语言模型以非常轻量且黑盒的方式&#xff0c;实现了一种跨语言和软件的通用模…

适合所有人的生成式人工智能-学习先导课

欢迎来到为所有人提供的生成式人工智能课(generative AI )。自ChatGPT发布以来&#xff0c;人工智能特别是生成式人工智能引起了许多个人、企业和政府的关注。 这是一项非常颠覆性的技术&#xff0c;已经在改变许多人的学习和工作方式。许多开发者认为生成式AI将使许多人得以赋…

[240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能

目录 &#x1f4c3;Changelog✨ gtb✨ cd✨ chat✨ hashdir &#x1f4c3;Changelog ✨ gtb 调整了 fzf 预览窗口中书籍文本的显示效果&#xff0c;通过识别文本中的特殊字符、日期、章节标题等信息&#xff0c;为其赋予不同的颜色。 ✨ cd cd 模块新增功能&#xff1a;在找…

RS®ZN-Z8x 开关矩阵

R&SZN-Z8x 开关矩阵 专为多端口矢量网络分析仪测量而设计 R&SZN-Z8x 开关矩阵经过优化设计&#xff0c;专门用于罗德与施瓦茨的矢量网络分析仪。这款经济高效的多方位解决方案可用于多端口设备或多个设备的简单和复杂的测量任务。开关矩阵支持宽频率范围&#xff0…

【论文阅读】YOLOv10: Real-Time End-to-End Object Detection

题目&#xff1a;YOLOv10: Real-Time End-to-End Object Detection 作者&#xff1a;Ao Wang Hui Chen∗ Lihao Liu Kai Chen Zijia Lin Jungong Han Guiguang Ding∗ 清华大学的 motivation: 作者觉得YOLO系列的NMS和某些结构非常的耗时&#xff0c;提出NMS-free和一些列高效…

Qt编译配置OpenCV+opencv_contrib(使用cmake)

本文使用环境 OpenCV: 4.7.0 cmake: 3.30.2 Qt: 5.12.1一、配置环境变量 安装好OpenCV、Qt、cmake后&#xff0c;应配置好一下环境变量&#xff1a; 二、编译OpenCV 打开cmake&#xff0c;编译的源码路径选择opencv文件夹中的sources目录&#xff0c;在opencv文件夹下新建一…

视频汇聚平台智能边缘分析一体机分析平台摄像头异常位移算法识别检测

智能边缘分析一体机在摄像头异常位移检测方面扮演着关键角色&#xff0c;它利用先进的图像处理技术和机器学习算法来实时监测摄像头状态&#xff0c;判断是否发生了非预期的位移。下面是智能边缘分析一体机如何检测摄像头异常位移的详细步骤&#xff1a; 1. 图像帧对比&#x…

SpringBoot中生成条形码的方案实战

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 ZXing库介绍 ZXing库是一个用于解析和生成多种格式的一维和二维条形码的开源Java库。 ZXing&#xff08;“zebra crossing”的缩写&#xff09;库提供了多种条形码格式的支持&#xff0c;包括但不限于QR码、…

Vue3 el-tabs 切换记录选项卡,离开前提示

最近做了一个项目&#xff0c;tabs选项卡 需要在离开当前的选中的项时进行提示并且当取消时定位原位置。 看效果图 当我进行编辑时 触发编辑 但是没有进行保存即提示信息。取消后返回原tabs ,否则确认后进入下个tab。 上代码 tab 一般默认会有一个值&#xff0c;一把是第一…

经典算法题总结:二叉树篇

二叉树解题的思维模式分两类&#xff1a; 是否可以通过遍历一遍二叉树得到答案&#xff1f;如果可以&#xff0c;用一个 traverse 函数配合外部变量来实现&#xff0c;这叫「遍历」的思维模式。是否可以定义一个递归函数&#xff0c;通过子问题&#xff08;子树&#xff09;的…

如何平衡冷数据(历史库)的成本与性能?| OceanBase应用实践

随着数据量的迅猛增长&#xff0c;企业和组织在数据库管理方面遭遇的挑战愈发凸显。数据库性能逐渐下滑、存储成本节节攀升&#xff0c;以及数据运维复杂性的增加&#xff0c;这些挑战使得DBA和开发者在数据管理上面临更大的压力。 为了应对这些挑战&#xff0c;对数据生命周期…

Jeecgboot3.6.3的vue3版本的一种flowable动态增加一个用户任务节点的方法(三)后端代码实现

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 这部分主要讲后端实现部分 1、增加一个AddTaskVo 类型,提供新增任务需要的数据结构 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.D…

C#使用Puppeteer

Puppeteer Puppeteer是一个Node.js库&#xff0c;它提供了高级API来通过DevTools协议(Chrome DevTools Protocol https://devtools.chrome.com)控制Chrome或Chromium。 Puppeteer默认情况下无头运行(headless)。 可以配置为运行完整的Chrome或Chromium&#xff0c;运行效果如…

spring02-springbean生命周期(实例化过程)

【README】 本文总结自《spring揭秘》&#xff0c;作者王福强&#xff0c;非常棒的一本书&#xff0c;墙裂推荐&#xff1b; spring容器根据配置元素组装可用系统分2个阶段&#xff0c;包括spring容器启动&#xff0c; springbean实例化阶段&#xff1b; 本文详细分析springbe…

单播---广播---组播

单播 单播&#xff08;Unicast&#xff09;是一种网络通信方式&#xff0c;其中数据包被发送到特定的网络接口。与广播&#xff08;Broadcast&#xff09;不同&#xff0c;单播只将数据包发送到目标地址指定的单个接收者。 单播的工作原理&#xff1a; 源地址&#xff1a;发…

DATAX自定义KafkaWriter

因为datax目前不支持写入数据到kafka中&#xff0c;因此本文主要介绍如何基于DataX自定义KafkaWriter&#xff0c;用来同步数据到kafka中。本文偏向实战&#xff0c;datax插件开发理论宝典请参考官方文档&#xff1a; https://github.com/alibaba/DataX/blob/master/dataxPlug…

240810-Gradio通过HTML组件打开本地文件+防止网页跳转到about:blank

A. 最终效果 B. 可通过鼠标点击打开文件&#xff0c;但会跳转到about:blank import gradio as gr import subprocessdef open_pptx():pptx_path /Users/liuguokai/Downloads/240528-工业大模型1.pptxtry:subprocess.Popen([open, pptx_path])return "PPTX file opened s…

【npm】如何将开发的vite插件发布到npm

前言 简单说下 npm 是什么&#xff1a; npm 是一个 node 模块管理工具&#xff0c;也是全球最大的共享源。 npm 工具与 nodejs 配套发布&#xff0c;便利开发人员共享代码。npm 主要包括 npm 官方网站、CLI&#xff08;控制台命令行工具&#xff09;、和 registry&#xff08;…