HivisionIDPhoto Docker部署以及Springboot接口对接(AI证件照制作)

项目简介

项目以及官方文档地址

HivisionIDPhoto 旨在开发一种实用、系统性的证件照智能制作算法。

它利用一套完善的AI模型工作流程,实现对多种用户拍照场景的识别、抠图与证件照生成。

HivisionIDPhoto 可以做到:

  1. 轻量级抠图(纯离线,仅需 CPU 即可快速推理)
  2. 根据不同尺寸规格生成不同的标准证件照、六寸排版照
  3. 支持 纯离线 或 端云 推理
  4. 美颜
  5. 智能换正装(waiting)

Docker 部署

拉取镜像

官方再docker hub是有镜像源的,但是因为某些原因可能pull失败,我备份了一份到阿里云镜像仓库(官方版本为1.2.9),如下拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/zr-dev/hivision_idphotos:v1.0

启动 Gradio Demo 服务

运行下面的命令,在你的本地访问 http://127.0.0.1:7860 即可使用。

docker run -d -p 7860:7860 registry.cn-hangzhou.aliyuncs.com/zr-dev/hivision_idphotos:v1.0

启动 API 后端服务

此处我将容器内部的8080端口映射到本机的8087,读者可以自定义想要映射的端口

docker run -d -p 8087:8080 registry.cn-hangzhou.aliyuncs.com/zr-dev/hivision_idphotos:v1.0 python3 deploy_api.py

服务启动后咱们就可以调用服务的接口了**(为了防止特殊原因,api文档也备份了一份在文章末尾,并附上官方接口文档地址)**

Springboot 进行接口对接

抽取配置文件,将HivisionIDPhoto后端服务的地址抽取为配置类

photo:id-photo-base-url: http://127.0.0.1:8087

生成证件照(底透明)+添加背景色

  1. 此处我只需要实现生成证件照的功能,总共需要对接如下两个接口,如果读者还有其他需求可以,参考官方文档
  2. callIdPhotoApi
    1. inputPath: 将图片上传到/ai/img/input/2024/10/24/60182299d7d371cbe2b0b7c9f9c8234_20241024111616A001.jpg(即代码中的inputPath)
      1. 上传代码可以参考我的另一篇文章SpringBoot 上传图片-指定目录按照日期存储
    2. height: 生成证件照的高
    3. width: 生成证件照的宽
    4. human_matting_model和face_detect_model可以根据自己的需求更换
  3. addBackground
    1. inputImageBase64: 生成的结果(base64图片)
    2. color: 背景色HEX值,默认为000000
    3. fileService.upload() :将生成的证件照上传到阿里云oss,生成url
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSONObject;
import com.aliyun.openservices.shade.com.alibaba.fastjson.JSON;
import com.hss.common.utils.uuid.UUID;
import com.hss.system.service.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.io.File;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;/*** @author zr 2024/10/24*/@Service
@Slf4j
public class ImageProcessor {@Autowiredprivate FileService fileService;@Value("${photo.id-photo-base-url}")private String idPhotoBaseUrl;public String callIdPhotoApi(String inputPath,Integer height,Integer width) {String url = idPhotoBaseUrl+"/idphoto";Map<String, String> headers = new HashMap<>();// 根据需要添加头部信息,例如:// headers.put("Content-Type", "multipart/form-data");Map<String, Object> parameters = new HashMap<>();parameters.put("input_image", new File(inputPath));parameters.put("height", height);parameters.put("width", width);parameters.put("human_matting_model", "rmbg-1.4"); //人像分割模型,默认为modnet_photographic_portrait_matting。可选值为modnet_photographic_portrait_matting、hivision_modnet、rmbg-1.4、birefnet-v1-liteparameters.put("face_detect_model", "mtcnn"); //人脸检测模型,默认为mtcnn。可选值为mtcnn、face_plusplus、retinaface-resnet50parameters.put("hd", true);parameters.put("dpi", 300);parameters.put("face_alignment", true);HttpResponse response = httpPost(url, headers, parameters);// 处理响应String body = response.body();JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(body);Boolean status = jsonObject.getBoolean("status");if (status){String imageData = jsonObject.getString("image_base64_hd");return imageData;} else {log.info("请求失败{}");return null;}}public String addBackground(String inputImageBase64,String color) {String url = idPhotoBaseUrl+"/add_background";Map<String, String> headers = new HashMap<>();// 根据需要添加头部信息,例如:// headers.put("Content-Type", "multipart/form-data");Map<String, Object> parameters = new HashMap<>();// 添加请求参数parameters.put("input_image_base64", inputImageBase64);parameters.put("color", color);
//        parameters.put("kb", kb); //输出照片的 KB 值,默认为None,即不对图像进行KB调整。
//        parameters.put("render", render); //渲染模式,默认为0。可选值为0、1、2,分别对应纯色、上下渐变、中心渐变。
//        parameters.put("dpi", dpi); //图像分辨率,默认为300HttpResponse response = httpPost(url, headers, parameters);// 处理响应String body = response.body();JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(body);Boolean status = jsonObject.getBoolean("status");if (status){String imageData = jsonObject.getString("image_base64");// 检查并去掉 Base64 前缀if (imageData.startsWith("data:image/")) {imageData = imageData.substring(imageData.indexOf(",") + 1);}byte[] imageBytes = Base64.getDecoder().decode(imageData);String upload = fileService.upload(imageBytes, UUID.fastUUID() + ".jpg");return upload;} else {log.info("请求失败{}");return null;}}private HttpResponse httpPost(String url,Map<String, String> headers,Map<String, Object> parameter) {HttpRequest httpRequest = HttpUtil.createPost(url).form(parameter).addHeaders(headers);HttpResponse response = httpRequest.execute();log.info("Url: "+httpRequest.getUrl());log.info("head: "+JSON.toJSONString(httpRequest.headers()));log.info("parame: "+JSON.toJSONString(httpRequest.form()));log.info("res: "+response.body());return response;}
}

测试

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;/*** @author zr 2024/10/24*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HssApplication.class)
@Slf4j
public class IdPhotoTest {@Autowiredprivate ImageProcessor imageProcessor;@Testpublic void callIdPhotoApi() {String s = imageProcessor.callIdPhotoApi("/ai/img/input/2024/10/24/60182299d7d371cbe2b0b7c9f9c8234_20241024111616A001.jpg",413,295);log.info(s);}@Testpublic void addBackground() {String s = imageProcessor.addBackground(imageProcessor.callIdPhotoApi("/ai/img//input/2024/10/24/23-Authentic-Chinese-Hairstyle-Ideas-00-scaled_20241024133448A001.jpg",413,295), "638cce");log.info(s);}
}

测试结果

  1. 原图

  1. callIdPhotoApi测试结果

  1. addBackground测试结果

API Docs

官方api文档地址

目录

  • 开始之前:开启后端服务
  • 接口功能说明
    • 1.生成证件照(底透明)
    • 2.添加背景色
    • 3.生成六寸排版照
    • 4.人像抠图
    • 5.图像加水印
    • 6.设置图像KB大小
    • 7.证件照裁切
  • cURL 请求示例
  • Python 请求示例

开始之前:开启后端服务

在请求 API 之前,请先运行后端服务

python deploy_api.py

接口功能说明

1.生成证件照(底透明)

接口名:idphoto

生成证件照接口的逻辑是发送一张 RGB 图像,输出一张标准证件照和一张高清证件照:

  • 高清证件照:根据size的宽高比例制作的证件照,文件名为output_image_dir增加_hd后缀
  • 标准证件照:尺寸等于size,由高清证件照缩放而来,文件名为output_image_dir

需要注意的是,生成的两张照片都是透明的(RGBA 四通道图像),要生成完整的证件照,还需要下面的添加背景色接口。

问:为什么这么设计?
答:因为在实际产品中,经常用户会频繁切换底色预览效果,直接给透明底图像,由前端 js 代码合成颜色是更好体验的做法。

请求参数:

参数名类型必填说明
input_imagefileinput_image_base64二选一传入的图像文件,图像文件为需为RGB三通道图像。
input_image_base64strinput_image二选一传入的图像文件的base64编码,图像文件为需为RGB三通道图像。
heightint标准证件照高度,默认为413
widthint标准证件照宽度,默认为295
human_matting_modelstr人像分割模型,默认为modnet_photographic_portrait_matting。可选值为modnet_photographic_portrait_mattinghivision_modnetrmbg-1.4birefnet-v1-lite
face_detect_modelstr人脸检测模型,默认为mtcnn。可选值为mtcnnface_plusplusretinaface-resnet50
hdbool是否生成高清证件照,默认为true
dpiint图像分辨率,默认为300
face_alignmentbool是否进行人脸对齐,默认为true
head_measure_ratiofloat面部面积与照片面积的比例,默认为0.2
head_height_ratiofloat面部中心与照片顶部的高度比例,默认为0.45
top_distance_maxfloat头部与照片顶部距离的比例最大值,默认为0.12
top_distance_minfloat头部与照片顶部距离的比例最小值,默认为0.1

返回参数:

参数名类型说明
statusint状态码,true表示成功
image_base64_standardstr标准证件照的base64编码
image_base64_hdstr高清证件照的base64编码。如hd参数为false,则不返回该参数

2.添加背景色

接口名:add_background

添加背景色接口的逻辑是接收一张 RGBA 图像(透明图),根据color添加背景色,合成一张 JPG 图像。

请求参数:

参数名类型必填说明
input_imagefileinput_image_base64二选一传入的图像文件,图像文件为需为RGBA四通道图像。
input_image_base64strinput_image二选一传入的图像文件的base64编码,图像文件为需为RGBA四通道图像。
colorstr背景色HEX值,默认为000000
kbint输出照片的 KB 值,默认为None,即不对图像进行KB调整。
renderint渲染模式,默认为0。可选值为012,分别对应纯色上下渐变中心渐变
dpiint图像分辨率,默认为300

返回参数:

参数名类型说明
statusint状态码,true表示成功
image_base64str添加背景色之后的图像的base64编码

3.生成六寸排版照

接口名:generate_layout_photos

生成六寸排版照接口的逻辑是接收一张 RGB 图像(一般为添加背景色之后的证件照),根据size进行照片排布,然后生成一张六寸排版照。

请求参数:

参数名类型必填说明
input_imagefileinput_image_base64二选一传入的图像文件,图像文件为需为RGB三通道图像。
input_image_base64strinput_image二选一传入的图像文件的base64编码,图像文件为需为RGB三通道图像。
heightint输入图像的高度,默认为413
widthint输入图像的宽度,默认为295
kbint输出照片的 KB 值,默认为None,即不对图像进行KB调整。
dpiint图像分辨率,默认为300

返回参数:

参数名类型说明
statusint状态码,true表示成功
image_base64str六寸排版照的base64编码

4.人像抠图

接口名:human_matting

人像抠图接口的逻辑是接收一张 RGB 图像,输出一张标准抠图人像照和高清抠图人像照(无任何背景填充)。

请求参数:

参数名类型必填说明
input_imagefile传入的图像文件,图像文件为需为RGB三通道图像。
human_matting_modelstr人像分割模型,默认为modnet_photographic_portrait_matting。可选值为modnet_photographic_portrait_mattinghivision_modnetrmbg-1.4birefnet-v1-lite
dpiint图像分辨率,默认为300

返回参数:

参数名类型说明
statusint状态码,true表示成功
image_base64str抠图人像照的base64编码

5.图像加水印

接口名:watermark

图像加水印接口的功能是接收一个水印文本,然后在原图上添加指定的水印。用户可以指定水印的位置、透明度和大小等属性,以便将水印无缝地融合到原图中。

请求参数:

参数名类型必填说明
input_imagefileinput_image_base64二选一传入的图像文件,图像文件为需为RGB三通道图像。
input_image_base64strinput_image二选一传入的图像文件的base64编码,图像文件为需为RGB三通道图像。
textstr水印文本,默认为Hello
sizeint水印字体大小,默认为20
opacityfloat水印透明度,默认为0.5
angleint水印旋转角度,默认为30
colorstr水印颜色,默认为#000000
spaceint水印间距,默认为25
dpiint图像分辨率,默认为300

返回参数:

参数名类型说明
statusint状态码,true表示成功
image_base64str添加水印之后的图像的base64编码

6.设置图像KB大小

接口名:set_kb

设置图像KB大小接口的功能是接收一张图像和目标文件大小(以KB为单位),如果设置的KB值小于原文件,则调整压缩率;如果设置的KB值大于源文件,则通过给文件头添加信息的方式调大KB值,目标是让图像的最终大小与设置的KB值一致。

请求参数:

参数名类型必填说明
input_imagefileinput_image_base64二选一传入的图像文件,图像文件为需为RGB三通道图像。
input_image_base64strinput_image二选一传入的图像文件的base64编码,图像文件为需为RGB三通道图像。
kbint输出照片的 KB 值,默认为None,即不对图像进行KB调整。
dpiint图像分辨率,默认为300

返回参数:

参数名类型说明
statusint状态码,true表示成功
image_base64str设置KB大小之后的图像的base64编码

7.证件照裁切

接口名:idphoto_crop

证件照裁切接口的功能是接收一张 RBGA 图像(透明图),输出一张标准证件照和一张高清证件照。

请求参数:

参数名类型必填说明
input_imagefileinput_image_base64二选一传入的图像文件,图像文件为需为RGBA四通道图像。
input_image_base64strinput_image二选一传入的图像文件的base64编码,图像文件为需为RGBA四通道图像。
heightint标准证件照高度,默认为413
widthint标准证件照宽度,默认为295
face_detect_modelstr人脸检测模型,默认为mtcnn。可选值为mtcnnface_plusplusretinaface-resnet50
hdbool是否生成高清证件照,默认为true
dpiint图像分辨率,默认为300
head_measure_ratiofloat面部面积与照片面积的比例,默认为0.2
head_height_ratiofloat面部中心与照片顶部的高度比例,默认为0.45
top_distance_maxfloat头部与照片顶部距离的比例最大值,默认为0.12
top_distance_minfloat头部与照片顶部距离的比例最小值,默认为0.1

返回参数:

参数名类型说明
statusint状态码,true表示成功
image_base64str证件照裁切之后的图像的base64编码
image_base64_hdstr高清证件照裁切之后的图像的base64编码,如hd参数为false,则不返回该参数

cURL 请求示例

cURL 是一个命令行工具,用于使用各种网络协议传输数据。以下是使用 cURL 调用这些 API 的示例。

1. 生成证件照(底透明)

curl -X POST "http://127.0.0.1:8080/idphoto" \
-F "input_image=@demo/images/test0.jpg" \
-F "height=413" \
-F "width=295" \
-F "human_matting_model=modnet_photographic_portrait_matting" \
-F "face_detect_model=mtcnn" \
-F "hd=true" \
-F "dpi=300" \
-F "face_alignment=true"

2. 添加背景色

curl -X POST "http://127.0.0.1:8080/add_background" \
-F "input_image=@test.png" \
-F "color=638cce" \
-F "kb=200" \
-F "render=0" \
-F "dpi=300"

3. 生成六寸排版照

curl -X POST "http://127.0.0.1:8080/generate_layout_photos" \
-F "input_image=@test.jpg" \
-F "height=413" \
-F "width=295" \
-F "kb=200" \
-F "dpi=300"

4. 人像抠图

curl -X POST "http://127.0.0.1:8080/human_matting" \
-F "input_image=@demo/images/test0.jpg" \
-F "human_matting_model=modnet_photographic_portrait_matting" \
-F "dpi=300"

5. 图片加水印

curl -X 'POST' \'http://127.0.0.1:8080/watermark?size=20&opacity=0.5&angle=30&color=%23000000&space=25' \-H 'accept: application/json' \-H 'Content-Type: multipart/form-data' \-F 'input_image=@demo/images/test0.jpg;type=image/jpeg' \-F 'text=Hello' \-F 'dpi=300'

6. 设置图像KB大小

curl -X 'POST' \'http://127.0.0.1:8080/set_kb' \-H 'accept: application/json' \-H 'Content-Type: multipart/form-data' \-F 'input_image=@demo/images/test0.jpg;type=image/jpeg' \-F 'kb=50' \-F 'dpi=300'

7. 证件照裁切

curl -X 'POST' \'http://127.0.0.1:8080/idphoto_crop?head_measure_ratio=0.2&head_height_ratio=0.45&top_distance_max=0.12&top_distance_min=0.1' \-H 'accept: application/json' \-H 'Content-Type: multipart/form-data' \-F 'input_image=@idphoto_matting.png;type=image/png' \-F 'height=413' \-F 'width=295' \-F 'face_detect_model=mtcnn' \-F 'hd=true' \-F 'dpi=300'

Python 请求示例

1.生成证件照(底透明)
import requestsurl = "http://127.0.0.1:8080/idphoto"
input_image_path = "demo/images/test0.jpg"# 设置请求参数
params = {"head_measure_ratio": 0.2,"head_height_ratio": 0.45,"top_distance_max": 0.12,"top_distance_min": 0.1,
}
files = {"input_image": open(input_image_path, "rb")}
data = {"height": 413,"width": 295,"human_matting_model": "modnet_photographic_portrait_matting","face_detect_model": "mtcnn","hd": True,"dpi": 300,"face_alignment": True,
}response = requests.post(url, params=params, files=files, data=data).json()# response为一个json格式字典,包含status、image_base64_standard和image_base64_hd三项
print(response)
2.添加背景色
import requestsurl = "http://127.0.0.1:8080/add_background"
input_image_path = "test.png"files = {"input_image": open(input_image_path, "rb")}
data = {"color": '638cce',"kb": None,"render": 0,"dpi": 300,
}response = requests.post(url, files=files, data=data).json()# response为一个json格式字典,包含status和image_base64
print(response)
3.生成六寸排版照
import requestsurl = "http://127.0.0.1:8080/generate_layout_photos"
input_image_path = "test.jpg"files = {"input_image": open(input_image_path, "rb")}
data = {"height": 413,"width": 295,"kb": 200,"dpi": 300,
}response = requests.post(url, files=files, data=data).json()# response为一个json格式字典,包含status和image_base64
print(response)
4.人像抠图
import requestsurl = "http://127.0.0.1:8080/human_matting"
input_image_path = "test.jpg"files = {"input_image": open(input_image_path, "rb")}
data = {"human_matting_model": "modnet_photographic_portrait_matting","dpi": 300,
}response = requests.post(url, files=files, data=data).json()# response为一个json格式字典,包含status和image_base64
print(response)
5.图片加水印
import requests# 设置请求的 URL 和参数
url = "http://127.0.0.1:8080/watermark"
params = {"size": 20,"opacity": 0.5,"angle": 30,"color": "#000000","space": 25,
}# 设置文件和其他表单数据
input_image_path = "demo/images/test0.jpg"
files = {"input_image": open(input_image_path, "rb")}
data = {"text": "Hello", "dpi": 300}# 发送 POST 请求
response = requests.post(url, params=params, files=files, data=data)# 检查响应
if response.ok:# 输出响应内容print(response.json())
else:# 输出错误信息print(f"Request failed with status code {response.status_code}: {response.text}")

6. 设置图像KB大小

import requests# 设置请求的 URL
url = "http://127.0.0.1:8080/set_kb"# 设置文件和其他表单数据
input_image_path = "demo/images/test0.jpg"
files = {"input_image": open(input_image_path, "rb")}
data = {"kb": 50, "dpi": 300}# 发送 POST 请求
response = requests.post(url, files=files, data=data)# 检查响应
if response.ok:# 输出响应内容print(response.json())
else:# 输出错误信息print(f"Request failed with status code {response.status_code}: {response.text}")

7. 证件照裁切

import requests# 设置请求的 URL
url = "http://127.0.0.1:8080/idphoto_crop"# 设置请求参数
params = {"head_measure_ratio": 0.2,"head_height_ratio": 0.45,"top_distance_max": 0.12,"top_distance_min": 0.1,
}# 设置文件和其他表单数据
input_image_path = "idphoto_matting.png"
files = {"input_image": ("idphoto_matting.png", open(input_image_path, "rb"), "image/png")}
data = {"height": 413,"width": 295,"face_detect_model": "mtcnn","hd": "true","dpi": 300,
}# 发送 POST 请求
response = requests.post(url, params=params, files=files, data=data)# 检查响应
if response.ok:# 输出响应内容print(response.json())
else:# 输出错误信息print(f"Request failed with status code {response.status_code}: {response.text}")

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

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

相关文章

Mysql主主互备配置

在现有运行的mysql环境下&#xff0c;修改相关配置项&#xff0c;完成主主互备模式的部署。 下面的配置说明中设置的mysql互备对应服务器IP为&#xff1a; 192.168.1.6 192.168.1.7 先检查UUID 在mysql的数据目录下&#xff0c;检查主备mysql的uuid&#xff08;如下的server-…

Unity实现DBSCAN

参考连接 直接上代码&#xff0c;把脚本挂载到场景中的物体上&#xff0c;运行应该就就能看到效果。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestDBSCAN : MonoBehaviour {private List<GameObject> goList new…

【ARM】ARM架构参考手册_Part B 内存和系统架构(5)

目录 5.1关于缓存和写缓冲区 5.2 Cache 组织 5.2.1 集联性&#xff08;Set-associativity&#xff09; 5.2.2 缓存大小 5.3 缓存类型 5.3.1 统一缓存或分离缓存 5.3.2 写通过&#xff08;Write-through&#xff09;或写回&#xff08;Write-back&#xff09;缓存 5.3.3…

BFS解决FloodFill算法(4)_被围绕的区域

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 BFS解决FloodFill算法(4)_被围绕的区域 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c…

【R + Python】iNaturalist 网站图片下载 inat api

文章目录 一、iNaturalist 简介二、R语言API&#xff1a;rinat三、示例3.1 获取观测数据3.2 绘制可视化图像函数用法 3.4 在区域网格中搜索3.5 下载图片3.51 提取图片 url3.52 下载图片: R语言3.53 下载图片: python 四、获取详细rinat包的文档 一、iNaturalist 简介 &#x1…

8.three.js相机详解

8.three.js相机详解 1、 认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera&#xff1a; 正投影和透视投影的区别是&am…

深度学习技术演进:从 CNN、RNN 到 Transformer 的发展与原理解析

深度学习的技术演进经历了从卷积神经网络&#xff08;CNN&#xff09;到循环神经网络&#xff08;RNN&#xff09;再到 Transformer 的重要发展。这三个架构分别擅长处理图像、序列数据和多种任务的特征&#xff0c;标志着深度学习在不同领域取得的进步。 1. 卷积神经网络&…

java智能物流管理系统源码(springboot)

项目简介 智能物流管理系统实现了以下功能&#xff1a; 智能物流管理系统的主要使用者分为管理员&#xff0c;顾客&#xff0c;员工&#xff0c;店主。功能有个人中心&#xff0c;顾客管理&#xff0c;员工管理&#xff0c;店主管理&#xff0c;门店信息管理&#xff0c;门店…

Go 语言中的 for range 循环教程

在 Go 语言中&#xff0c;for range 循环是一个方便的语法结构&#xff0c;用于遍历数组、切片、映射和字符串。本教程将通过示例代码来帮助理解如何在 Go 中使用 for range 循环。 package mainimport "fmt"func main() {// 遍历切片并计算和nums : []int{2, 3, 4}…

OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集&#xff0c;以提…

Visual studio 下载安装

1&#xff0c;Visual stutdio 网址 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 2&#xff0c;下划页面&#xff0c;点击 较早的下载 3&#xff0c;选择对应的版本进行下载

蓝牙技术的多种模式详解

蓝牙作为一种广泛应用的无线通信技术&#xff0c;已经在我们的日常生活中无处不在。随着技术的发展&#xff0c;蓝牙已经不再仅限于传统的音频传输&#xff0c;而是扩展到了各种应用领域。本文将深入探讨蓝牙的各种模式及其应用场景。 1. 经典蓝牙&#xff08;BR/EDR&#xff…

单链表OJ题:移除链表元素(力扣)

目录 解法一&#xff1a;带头节点的新链表 解法二&#xff1a;不带头节点的新指向关系链表 总结 这是一道简单的力扣题目&#xff0c;关于解法的话&#xff0c;这里提供了二种思路&#xff0c;重点解释前两种&#xff0c;还有一种思路好想&#xff0c;但是时间复杂度为O(n^2…

一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步

文章目录 1. 初识 Shell 解释器1.1 Shell 类型1.2 Shell 的父子关系 2. 编写第一个 Shell 脚本3. Shell 脚本语法3.1 脚本格式3.2 注释3.2.1 单行注释3.2.2 多行注释 3.3 Shell 变量3.3.1 系统预定义变量&#xff08;环境变量&#xff09;printenv 查看所有环境变量set 查看所有…

SMT 生产可视化:提升电子组装流程效率

通过图扑 HT 对表面贴装技术&#xff08;SMT&#xff09;生产线的实时数据采集与可视化分析&#xff0c;实现对产品质量、产能利用率和流程优化的有效监控&#xff0c;助力生产效率最大化与质量提升。

听见文本的魅力:AI 与未来的语音交互

AI 与未来的语音交互 引言什么是文本转语音&#xff08;TTS&#xff09;&#xff1f;当前 TTS 技术现状国内海外文本转语音能力调研文本转语音能力说明多情感风格SSML语音合成标记语言 未来趋势 引言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;文本转…

OpenCV视觉分析之运动分析(4)背景减除类:BackgroundSubtractorKNN的一系列set函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 BackgroundSubtractorKNN类有一系列的set函数&#xff0c;下面我们一一列举他们的名字和用法。 一系列set函数 函数setDetectShadows() setDe…

笔记整理—linux驱动开发部分(1)驱动梗概

驱动可以分为广义上的和狭义上的驱动。广义上的驱动是用于操作硬件的代码&#xff0c;而狭义上的驱动为基于内核系统之上让硬件去被操作的逻辑方法。 linux体系架构&#xff1a; 1.分层思想 &#xff1a;在OS中间还会有许多层。 : 2.驱动的上面是系统调用&#xff08;API&…

JavaScript网页设计案例教程:从零开始构建一个响应式网页

JavaScript网页设计案例教程&#xff1a;从零开始构建一个响应式网页 前言 在当今互联网时代&#xff0c;网页设计已成为一项重要技能。JavaScript作为网页开发的核心技术之一&#xff0c;能够让网页变得更加生动和交互。本文将带您通过一个实际案例&#xff0c;逐步学习如何…

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f343; vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f…