JavaScript(JS)+OpenCV+OSS,JS整合OpenCV实现拍照,并把照片上传到OSS(Demo)

之前用Java整合了一个opencv实现拍照上传的功能,考虑到后台代码都是部署到服务器上的,没办法控制用户的电脑摄像头,所以有重新开发一个JavaScript版的
链接: Java版整合opencv

1.前期准备

1.安装 OpenCV.js

首先,你需要在你的项目中引入 OpenCV.js。你可以通过 CDN 或者下载库文件。

<script async src="https://docs.opencv.org/4.x/opencv.js" type="text/javascript"></script>

注:也可以将opencv.js下载下来放到本地来引用

2.上传图片到 OSS

你需要使用阿里云的 OSS SDK 来上传图片。首先确保你已经在项目中引入了 OSS SDK。

<script src="https://cdn.jsdelivr.net/npm/ali-oss/dist/aliyun-oss-sdk.min.js"></script>

3.打开摄像头并拍照方法

使用 HTML5 的 getUserMedia API 来访问摄像头。

<video id="video" width="640" height="480" autoplay></video>
   <button id="snap">拍照</button>
   <canvas id="canvas" width="640" height="480"></canvas>

   <script>
       const video = document.getElementById('video');

       // 请求摄像头权限
       navigator.mediaDevices.getUserMedia({ video: true })
           .then(stream => {
               video.srcObject = stream;
           })
           .catch(err => {
               console.error("Error accessing the camera: ", err);
           });

       document.getElementById('snap').addEventListener('click', () => {
           const canvas = document.getElementById('canvas');
           const context = canvas.getContext('2d');
           context.drawImage(video, 0, 0, canvas.width, canvas.height);
           const imageData = canvas.toDataURL('image/png'); // 获取图片数据
           uploadToOSS(imageData); // 上传到 OSS
       });
   </script>

4.上传图片方法

async function uploadToOSS(imageData) {
       const client = new OSS({
           region: '<your-region>',
           accessKeyId: '<your-access-key-id>',
           accessKeySecret: '<your-access-key-secret>',
           bucket: '<your-bucket-name>'
       });

       const base64Data = imageData.replace(/^data:image\/png;base64,/, "");
       const fileName = `photo_${Date.now()}.png`;

       try {
           const result = await client.put(fileName, Buffer.from(base64Data, 'base64'));
           console.log('Upload Success:', result);
       } catch (e) {
           console.error('Upload Error:', e);
       }
   }

2.整合

1.完整版

<!DOCTYPE html>
<html lang="zh-Hans-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/ali-oss/dist/aliyun-oss-sdk.min.js"></script>
  <script async src="opencv.js" type="text/javascript"></script>
</head>

<body>
  <video id="video" width="640" height="480" autoplay></video>
  <button id="snap">拍照</button>
  <canvas id="canvas" width="640" height="480"></canvas>
  <script>
    const video = document.getElementById('video');

    // 请求摄像头权限
    navigator.mediaDevices.getUserMedia({ video: true })
      .then(stream => {
        video.srcObject = stream;
      })
      .catch(err => {
        console.error("Error accessing the camera: ", err);
      });

    document.getElementById('snap').addEventListener('click', () => {
      const canvas = document.getElementById('canvas');
      const context = canvas.getContext('2d');
      context.drawImage(video, 0, 0, canvas.width, canvas.height);
      const imageData = canvas.toDataURL('image/png'); // 获取图片数据
      uploadToOSS(imageData); // 上传到 OSS
    });

    async function uploadToOSS(imageData) {
      const client = new OSS({
        region: '<your-region>',
        accessKeyId: '<your-access-key-id>',
        accessKeySecret: '<your-access-key-secret>',
        bucket: '<your-bucket-name>'
      });

      const base64Data = imageData.replace(/^data:image\/png;base64,/, "");
      const fileName = `photo_${Date.now()}.png`;

      try {
        const result = await client.put(fileName, Buffer.from(base64Data, 'base64'));
        console.log('Upload Success:', result);
      } catch (e) {
        console.error('Upload Error:', e);
      }
    }
  </script>
</body>
</html>

2.效果

在这里插入图片描述
注:目前只整合了一个oss的功能,后期还可以在上面拓展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值