前端实现人物背景抠图(用bodypix实现)

打印 上一主题 下一主题

主题 835|帖子 835|积分 2505

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

  

  • 前言
  • 一、bodypix简介
  • 二、使用步骤

    • 1.引入库

  

前言

本代码部分参考B站up 球球的前端奶茶屋 uid:25424697

提示:以下是本篇文章正文内容,下面案例可供参考
一、bodypix

BodyPix 可用于将图像分割为人物像素和非人物像素。人物像素又可进一步分类为 24 个身材部位中的任一部位。紧张的是,此模子仅实用于单个人物,因此请确保您的输入数据不包罗多个人。
二、使用步骤

1.引入并加载bodypix模子

引用代码如下:
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/body-pix"></script>
 var bodypix = await bodyPix.load();
注意:加载bodypix需要用异步调用
2.代码

代码如下:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <video id="video" width="800" height="600" muted autoplay playsinline></video>
  10.     <canvas id="canvas" width="800" height="600"></canvas>
  11. </body>
  12. <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
  13. <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/body-pix"></script>
  14. <!-- <script>
  15.     bodypix.load().then(function (net) {
  16.         // BodyPix model loaded
  17.     });
  18. </script> -->
  19. <script>
  20.     var video = document.getElementById('video');
  21.     var canvas = document.getElementById("canvas");
  22.     var ctx = canvas.getContext('2d');
  23.     var cantmp=document.createElement("canvas");
  24.     var ctxtmp=cantmp.getContext("2d",{ willReadFrequently: true });
  25.     async function a() {
  26.         var stream = await navigator.mediaDevices.getUserMedia({ video: true });
  27.         video.srcObject = stream;
  28.     }
  29.     a();
  30.     async function b() {
  31.         var bodypix = await bodyPix.load();
  32.         cantmp.width = video.width;
  33.         cantmp.height = video.height;
  34.         
  35.        async function an() {
  36.             ctxtmp.drawImage(video, 0, 0, video.width, video.height);
  37.             var frame = ctxtmp.getImageData(0, 0, video.width, video.height);
  38.             var seg = await bodypix.segmentPerson(canvas,{segmentationThreshold:0.6});
  39.             console.log(seg);
  40.             // var ing = bodyPix.toMask(seg);
  41.             // console.log(ing.data.length);
  42.             
  43.             for (let i = 0; i < seg.data.length; i++) {
  44.                 if (seg.data[i]===0) {
  45.                     // console.log(1);
  46.                     frame.data[(i*4 )+3] = 1;
  47.                 }
  48.             }
  49.             ctx.putImageData(frame,0,0);
  50.             requestAnimationFrame(an);
  51.         }
  52.         an();
  53.     }
  54.     b();
  55. </script>
  56. </html>
复制代码
结果演示


后言

易错点:调用segmentPerson模子时,也需要异步调用

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表