Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >web端实现AR人脸特效

web端实现AR人脸特效

作者头像
程序猿川子
发布于 2022-12-15 08:57:28
发布于 2022-12-15 08:57:28
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

前言

直播、短视频、在线会议等应用越来越多地进入人们的生活,随之诞生的是丰富的各类创意玩法与新鲜体验,其中大量应用了以AI检测和图形渲染为基础的AR技术。

而随着Web技术的不断成熟,AR技术在Web上的实现成为了一种可能。今天就总结了在Web端实现此功能的几个技术要点,跟大家一起探讨一下。

架构和概念

抽象整体的实现思路如下

#bytemd-mermaid-1671094042756-0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#bytemd-mermaid-1671094042756-0 .error-icon{fill:#552222;}#bytemd-mermaid-1671094042756-0 .error-text{fill:#552222;stroke:#552222;}#bytemd-mermaid-1671094042756-0 .edge-thickness-normal{stroke-width:2px;}#bytemd-mermaid-1671094042756-0 .edge-thickness-thick{stroke-width:3.5px;}#bytemd-mermaid-1671094042756-0 .edge-pattern-solid{stroke-dasharray:0;}#bytemd-mermaid-1671094042756-0 .edge-pattern-dashed{stroke-dasharray:3;}#bytemd-mermaid-1671094042756-0 .edge-pattern-dotted{stroke-dasharray:2;}#bytemd-mermaid-1671094042756-0 .marker{fill:#333333;stroke:#333333;}#bytemd-mermaid-1671094042756-0 .marker.cross{stroke:#333333;}#bytemd-mermaid-1671094042756-0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#bytemd-mermaid-1671094042756-0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#bytemd-mermaid-1671094042756-0 .cluster-label text{fill:#333;}#bytemd-mermaid-1671094042756-0 .cluster-label span{color:#333;}#bytemd-mermaid-1671094042756-0 .label text,#bytemd-mermaid-1671094042756-0 span{fill:#333;color:#333;}#bytemd-mermaid-1671094042756-0 .node rect,#bytemd-mermaid-1671094042756-0 .node circle,#bytemd-mermaid-1671094042756-0 .node ellipse,#bytemd-mermaid-1671094042756-0 .node polygon,#bytemd-mermaid-1671094042756-0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#bytemd-mermaid-1671094042756-0 .node .label{text-align:center;}#bytemd-mermaid-1671094042756-0 .node.clickable{cursor:pointer;}#bytemd-mermaid-1671094042756-0 .arrowheadPath{fill:#333333;}#bytemd-mermaid-1671094042756-0 .edgePath .path{stroke:#333333;stroke-width:1.5px;}#bytemd-mermaid-1671094042756-0 .flowchart-link{stroke:#333333;fill:none;}#bytemd-mermaid-1671094042756-0 .edgeLabel{background-color:#e8e8e8;text-align:center;}#bytemd-mermaid-1671094042756-0 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#bytemd-mermaid-1671094042756-0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#bytemd-mermaid-1671094042756-0 .cluster text{fill:#333;}#bytemd-mermaid-1671094042756-0 .cluster span{color:#333;}#bytemd-mermaid-1671094042756-0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80,100%,96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#bytemd-mermaid-1671094042756-0:root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#bytemd-mermaid-1671094042756-0 flowchart{fill:apa;}

调取Camera获得相机画面

使用tensorflow加载人脸识别模型生成FaceMesh

根据FaceMesh生成三角网格并进行UV贴图

FaceMesh

MediaPipe Face Mesh是一种脸部几何解决方案,即使在移动设备上,也可以实时估计468个3D脸部界标。它采用 机器学习 (ML)来推断3D表面几何形状,只需要单个摄像机输入,而无需专用的深度传感器。该解决方案利用轻量级的模型架构以及整个管线中的GPU加速,可提供对实时体验至关重要的实时性能。

UVMap

UV是二维纹理坐标,U代表水平方向,V代表垂直方向。UV Map用来描述三维物体表面与图像纹理(Texture) 的映射关系,有了UV Map,我们就可以将二维的图像纹理粘贴到三维的物体表面。

矩形贴图和球面的映射图

技术实现

调取Camera获得相机画面

通过navigator.mediaDevices.getUserMedia获取stream,放到video查看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function setupWebcam() {
    return new Promise( ( resolve, reject ) => {
        const webcamElement = document.getElementById( "webcam" );
        const navigatorAny = navigator;
        navigator.getUserMedia = navigator.getUserMedia ||
        navigatorAny.webkitGetUserMedia || navigatorAny.mozGetUserMedia ||
        navigatorAny.msGetUserMedia;
        if( navigator.getUserMedia ) {
            navigator.getUserMedia( { video: true },
                stream => {
                    webcamElement.srcObject = stream;
                    webcamElement.addEventListener( "loadeddata", resolve, false );
                },
            error => reject());
        }
        else {
            reject();
        }
    });
}
人脸识别
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建模型
createModel() {
    return new Promise(async resolve => {
        await tf.setBackend('webgl')
        const model = faceLandmarksDetection.SupportedModels.MediaPipeFaceMesh;
        const detectorConfig = {
            maxFaces: 1, //检测到的最大面部数量
            refineLandmarks: true, //可以完善眼睛和嘴唇周围的地标坐标,并在虹膜周围输出其他地标
            runtime: 'mediapipe',
            solutionPath: 'https://unpkg.com/@mediapipe/face_mesh', //WASM二进制文件和模型文件所在的路径
        };
        this.model = await faceLandmarksDetection.createDetector(model, detectorConfig);
        resolve(this.model);
    })
},
//识别
async recognition() {
    try {
        const video = this.$refs.video;
        const faces = await this.model.estimateFaces(video, {
            flipHorizontal: false, //镜像
        });
        if (faces.length > 0) {
            const keypoints = faces[0].keypoints;
            this.render3D({
                scaledMesh:keypoints.reduce((acc, pos) =>{
                    acc.push([pos.x,pos.y,pos.z])
                    return acc
                }, [])
            });
        }else{
            this.render3D({scaledMesh:[]})
        }
    } catch (error) {
        console.log(error);
    }
}
3D场景贴图
  1. TRIANGULATION
  2. UV_COORDS
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //3D场景
    const scene = new THREE.Scene();

    //添加一些光照
    scene.add( new THREE.AmbientLight( 0xcccccc, 0.4 ) );
    camera.add( new THREE.PointLight( 0xffffff, 0.8 ) );
    
    //正交相机
    scene camera = new THREE.PerspectiveCamera( 45, 1, 0.1, 2000 );
    camera.position.x = videoWidth / 2;
    camera.position.y = -videoHeight / 2;
    camera.position.z = -( videoHeight / 2 ) / Math.tan( 45 / 2 )
    scene.add( camera ); 
    
    //渲染器
    const renderer = new THREE.WebGLRenderer({
        canvas: document.getElementById( "overlay" ),
        alpha: true
    });
    
    //创建geometry,将468个人脸特征点按照一定的顺序(TRIANGULATION)组成三角网格,并加载UV_COORDS
    const geometry = new THREE.BufferGeometry()
    geometry.setIndex(TRIANGULATION)
    geometry.setAttribute('uv', new THREE.Float32BufferAttribute(UV_COORDS.map((item, index) => index % 2 ? item : 1 - item), 2))
    geometry.computeVertexNormals()
                
    //创建material
    const textureLoader = new THREE.TextureLoader();
    const meshImg = this.meshList[meshIndex].src;//材质图片地址
    textureLoader.load(meshImg,texture=>{
        texture.encoding = THREE.sRGBEncoding
        texture.anisotropy = 16
        const material = new THREE.MeshBasicMaterial({
            map: texture,
            transparent: true,
            color: new THREE.Color(0xffffff),
            reflectivity: 0.5
        });
        const mesh = new THREE.Mesh(geometry, material)
        scene.add(mesh)
    })
    // 根据face mesh实时更新geometry
    updateGeometry(prediction){
        let w = canvasWidth;
        let h = canvasWidth;
        const faceMesh = resolveMesh(prediction.scaledMesh, w, h)
        const positionBuffer = faceMesh.reduce((acc, pos) => acc.concat(pos), [])
        geometry.setAttribute('position', new THREE.Float32BufferAttribute(positionBuffer, 3))
        geometry.attributes.position.needsUpdate = true
    }
   resolveMesh(faceMesh, vw, vh){
       return faceMesh.map(p => [p[0] - vw / 2, vh / 2 - p[1], -p[2]])
   }
   
   //渲染
   render3D(prediction){
        if (prediction) {
            updateGeometry(prediction)
        }
        renderer.render(scene, threeCamera)
    }
加载3D模型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//加载3D模型
const loader = new GLTFLoader();
const Object3D = new THREE.Object3D();
loader.load(modelUrl, (gltf) => {
    const object = gltf.scene
    const box = new THREE.Box3().setFromObject(object)
    const size = box.getSize(new THREE.Vector3()).length()
    const center = box.getCenter(new THREE.Vector3())
    object.position.x += (object.position.x - center.x);
    object.position.y += (object.position.y - center.y + 1);
    object.position.z += (object.position.z - center.z - 15);
    Object3D.add(object)
    this.scene.add(Object3D)
})

//计算Matrix
const position = prediction.midwayBetweenEyes[0]
const scale = this.getScale(prediction.scaledMesh, 234, 454)
const rotation = this.getRotation(prediction.scaledMesh, 10, 50, 280)
object.position.set(...position)
object.scale.setScalar(scale / 20)
object.scale.x *= -1
object.rotation.setFromRotationMatrix(rotation)
object.rotation.y = -object.rotation.y
object.rotateZ(Math.PI)
object.rotateX(-Math.PI * .05)
if (this.morphTarget) {
    // flipped
    this.morphTarget['leftEye'] && this.morphTarget['leftEye'](1 - prediction.faceRig.eye.r)
    this.morphTarget['rightEye'] && this.morphTarget['rightEye'](1 - prediction.faceRig.eye.l)
    this.morphTarget['mouth'] && this.morphTarget['mouth'](prediction.faceRig.mouth.shape.A)
}

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
#mermaid-svg-zGLqSFRpGlvyy4qs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zGLqSFRpGlvyy4qs .error-icon{fill:#552222;}#mermaid-svg-zGLqSFRpGlvyy4qs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zGLqSFRpGlvyy4qs .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-zGLqSFRpGlvyy4qs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zGLqSFRpGlvyy4qs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zGLqSFRpGlvyy4qs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zGLqSFRpGlvyy4qs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zGLqSFRpGlvyy4qs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zGLqSFRpGlvyy4qs .marker.cross{stroke:#333333;}#mermaid-svg-zGLqSFRpGlvyy4qs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zGLqSFRpGlvyy4qs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zGLqSFRpGlvyy4qs .cluster-label text{fill:#333;}#mermaid-svg-zGLqSFRpGlvyy4qs .cluster-label span{color:#333;}#mermaid-svg-zGLqSFRpGlvyy4qs .label text,#mermaid-svg-zGLqSFRpGlvyy4qs span{fill:#333;color:#333;}#mermaid-svg-zGLqSFRpGlvyy4qs .node rect,#mermaid-svg-zGLqSFRpGlvyy4qs .node circle,#mermaid-svg-zGLqSFRpGlvyy4qs .node ellipse,#mermaid-svg-zGLqSFRpGlvyy4qs .node polygon,#mermaid-svg-zGLqSFRpGlvyy4qs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zGLqSFRpGlvyy4qs .node .label{text-align:center;}#mermaid-svg-zGLqSFRpGlvyy4qs .node.clickable{cursor:pointer;}#mermaid-svg-zGLqSFRpGlvyy4qs .arrowheadPath{fill:#333333;}#mermaid-svg-zGLqSFRpGlvyy4qs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zGLqSFRpGlvyy4qs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zGLqSFRpGlvyy4qs .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-zGLqSFRpGlvyy4qs .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-zGLqSFRpGlvyy4qs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zGLqSFRpGlvyy4qs .clust
ImAileen
2024/01/18
1520
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
ChatUI vs Ant Design X 技术选型对比
本文从核心功能、架构设计、易用性等维度对比分析阿里巴巴的 ChatUI 和 Ant Design 的 Ant Design X,帮助开发者选择适合的对话式 UI 开发方案。
井九
2025/04/19
1800
ChatUI vs Ant Design X 技术选型对比
Spring全家桶 源码 入门系列(二) --------AOP深度剖析
com.libin.a13.ProxyFastClass,com.libin.a13.TargetFastClass
猫头虎
2024/04/08
1160
CausalDiscoveryToolbox:因果建模、因果图代码实现
最近在分析观测数据的因果关系时,发现一个很好用的工具包——CausalDiscoveryToolbox(以下简称Cdt),功能齐全,轻松上手因果发现。 下面简单整理下该工具包的原理+用法。
全栈程序员站长
2022/09/21
1.6K0
CausalDiscoveryToolbox:因果建模、因果图代码实现
Postgresql源码(60)事务系统框架总结
用户命令触发状态机函数导致事务状态流转,流转时按对应状态调用底层事务处理函数干活。
mingjie
2022/07/14
6520
DeepSeek完全征服指南:从代码到多模态,解锁AI助手的终极形态
#mermaid-svg-Db64cg1rDdmuNzNB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Db64cg1rDdmuNzNB .error-icon{fill:#552222;}#mermaid-svg-Db64cg1rDdmuNzNB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Db64cg1rDdmuNzNB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Db64cg1rDdmuNzNB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Db64cg1rDdmuNzNB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Db64cg1rDdmuNzNB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Db64cg1rDdmuNzNB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Db64cg1rDdmuNzNB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Db64cg1rDdmuNzNB .marker.cross{stroke:#333333;}#mermaid-svg-Db64cg1rDdmuNzNB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Db64cg1rDdmuNzNB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Db64cg1rDdmuNzNB .cluster-label text{fill:#333;}#mermaid-svg-Db64cg1rDdmuNzNB .cluster-label span{color:#333;}#mermaid-svg-Db64cg1rDdmuNzNB .label text,#mermaid-svg-Db64cg1rDdmuNzNB span{fill:#333;color:#333;}#mermaid-svg-Db64cg1rDdmuNzNB .node rect,#mermaid-svg-Db64cg1rDdmuNzNB .node circle,#mermaid-svg-Db64cg1rDdmuNzNB .node ellipse,#mermaid-svg-Db64cg1rDdmuNzNB .node polygon,#mermaid-svg-Db64cg1rDdmuNzNB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Db64cg1rDdmuNzNB .node .label{text-align:center;}#mermaid-svg-Db64cg1rDdmuNzNB .node.clickable{cursor:pointer;}#mermaid-svg-Db64cg1rDdmuNzNB .arrowheadPath{fill:#333333;}#mermaid-svg-Db64cg1rDdmuNzNB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Db64cg1rDdmuNzNB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Db64cg1rDdmuNzNB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Db64cg1rDdmuNzNB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Db64cg1rDdmuNzNB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Db64cg1rDdmuNzNB .clust
用户11286421
2025/03/28
1800
DeepSeek完全征服指南:从代码到多模态,解锁AI助手的终极形态
【初探数据结构】带环链表:原理、判断与数学证明
由节点构成的链式结构中存在至少一个节点,其指针域指向链表中已存在的节点,形成闭合环路。特征:
我想吃余
2025/03/31
910
【初探数据结构】带环链表:原理、判断与数学证明
猫头虎博客带您使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
猫头虎
2024/04/09
1310
猫头虎博客带您使用Markdown编辑器
【C进阶】顺序表详解
线性表是一种常见的抽象数据类型:线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。
学习起来吧
2024/02/29
1400
【C进阶】顺序表详解
【C++】Chapter01 类与对象
封装的定义:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
Skrrapper
2025/03/25
830
【C++】Chapter01 类与对象
Spring全家桶 源码 入门系列(一) --------容器与 bean
可以看到,我们课上讲的,都是 BeanFactory 提供的基本功能,ApplicationContext 中的扩展功能都没有用到。
猫头虎
2024/04/08
1400
ES中文检索须知:分词器与中文分词器
分词即为将doc通过Analyzer切分成一个一个Term(关键字),es分词在索引构建和数据检索时均有体现:
Steve Wang
2024/04/22
8670
ES中文检索须知:分词器与中文分词器
赶走烦人的“if-else”,使用状态模式推动业务生命周期的流转
本文借助海外互金业务的借款流程展开。业务核心是借款的生命周期,相当于是电商中的订单一样。一笔借款的整个生命周期包含了提交,审批,确认,放款,还款。一笔借款的状态对应已上的操作,同样就很多了。如图是一笔借款的生命周期:
闻说社
2023/03/20
3830
Alpaca构建方式探秘:低成本构造指令数据增强LLM
Alpaca是斯坦福大学在Meta开源的大模型LLaMA 7B基础上使用自构建的52K指令数据重新训练得到的增强模型,它的数据构造和训练成本极低,总计约600美元(数据构建500美元+机器训练100美元),效果却逼近OpenAI的text-davinci-003(GPT 3.5),这篇博客和大家一起学习下alpaca的构建方法。
Steve Wang
2023/10/12
7860
Alpaca构建方式探秘:低成本构造指令数据增强LLM
【ChatGPT】一个凭借两百多年历史的公式崛起的巨星
托马斯·贝叶斯 (Thomas Baves,1701年一1761年),是18世纪的一位英国数学家、统计学家
THUNDER王
2023/10/13
3640
【ChatGPT】一个凭借两百多年历史的公式崛起的巨星
梳理一下各大平台使用的sample rate convert算法
转采样属于数字信号重建的范畴,整数倍的升降采样可以通过插值抽取+带限滤波的方法【1】,并且通过级联来实现任意比值的采样率转换。这里需要对奈奎斯特采样定理,以及数字信号时频关系有比较清晰的理解。还有一种方法是插值,插值的方法比较多,在参考里有一阶保持FOH、零阶保持ZOH、三次样条函数spline和sinc函数,引用的博文中有比较直观的分析和事例。那么在各大平台,最后都是用什么实现的resample重建呢?
全栈程序员站长
2022/11/03
1.2K0
梳理一下各大平台使用的sample rate convert算法
使用flask框架实现简单的图书管理(python 3.8)
flask是轻量级的web框架。 浏览器作为client发出HTTP请求,而web服务器负责处理逻辑,而flask帮助我们完成了安全性和数据流的控制,让我们只用关注于业务逻辑本身,避免重复造轮子
用户7886150
2020/12/30
7390
TensorFlow 深度学习框架详解
TensorFlow 是由 Google Brain 团队开发的开源机器学习框架,其名称源于处理多维数据数组(张量)的数据流图(Flow)的运行方式。
奶油话梅糖
2025/03/26
3840
Mybatis分页插件使用的详解[通俗易懂]
关于分页,一般来说rowBounds 这种假分页都上不了台面,我们往往都选哟真分页,那么还不想搞得很麻烦,Mybatis的分页插件就为后端程序员解决了这个问题
全栈程序员站长
2022/11/07
6750
Flowith:打造智能工作流的技术利器,别再求Manus邀请码了!
在AI智能体技术快速发展的2024年,工作流引擎正在经历从静态脚本到动态认知的范式转变。Flowith作为新一代智能体协作平台,通过其创新的分布式架构和模块化设计,在复杂任务处理领域展现出独特的技术优势。本文将从系统架构、核心特性到实践案例,深入解析这一前沿工具的技术实现。
鲲志说
2025/04/07
2290
Flowith:打造智能工作流的技术利器,别再求Manus邀请码了!
推荐阅读
相关推荐
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验