额额。。。 2024-01-16 20:02 采纳率: 54.8%
浏览 23
已结题

前端拍照太快,导致后端无法获取正确图片

我遇到的问题
前端中,使用了tracking.js库来检测人脸并拍照,然后将照片传到后端时无法正常识别图片
后端使用腾讯云的人脸识别接口,判断图片时提示我图片中没有人脸

img

然后我去在线转了一下base64图片

img

发现确实是没有人脸😅

img

我认为可能就是因为调用摄像头时有点延迟,在有画面之前已经检测到人脸,这个event.data被存入了一张黑屏的照片,然后就调用了这个screenshotAndUpload()上传图片的接口,到后端就是一张黑屏照片了。但是又说不通,黑屏不是没有检测到人脸嘛,所以还是寻求帮助一下。

之前使用的是百度智能云的SDK,那个还没有问题,因为免费次数用完了,就换了腾讯云的,但是突然识别不了图片,想问一下有没有合适的解决办法?

第二天

我和一位老哥交流了一下,他认为是页面图像转图片的时候出了问题,我就在img上显示我的人脸帧照片,ok,还是黑屏

img

所以问题就是这里了,因为我是初学者,所以不明白哪里有问题,代码记得没有改动过,并且和gitee上的一样,就很疑惑,这是我的代码:

监听事件

 tracker.on('track', function(event) {

        // 检测出人脸 绘画人脸位置
        context.clearRect(0, 0, canvas.width, canvas.height);
        event.data.forEach(function(rect) {
            context.strokeRect(rect.x, rect.y, rect.width, rect.height);
        });

        if(uploadLock && event.data.length){
          //上传图片
          screenshotAndUpload();
        }else{
          console.log('no face');
        }
    });

上传图片

const screenshotAndUpload=async ()=> {
        // // 上锁避免重复发送请求
        setUploadLock(false)
        // // 绘制当前帧图片转换为base64格式
        let img=document.getElementById('face')
        let canvas = document.getElementById('cameraCanvas');
        let base64Img = canvas.toDataURL('image/jpeg');
        let newFaceImg=base64Img.split(',')[1]
        img.src=base64Img;
        // console.log(base64Img);
 
    }

将img显示为我截取的base64的图片就是黑屏的,不知道哪儿的问题

1月19号记录

网上还是没有找到合适的办法,我在mdn上找到HTMLCanvasElement.toDataURL()方法说明,第一个参数默认是png格式,这个没关系,第二个参数在指定图片格式为 image/jpeg 或 image/webp 的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他参数会被忽略。
起初我认为是这里的原因,但是好像也不对,在tracker.on()监听事件中,会一直打印 event.data 数组,我以为是数组的长度为0或者1,没有一个固定的长度值,所以图片质量是黑屏的,但是他说的是图片质量,不是数组长度,这下又不知道从哪里入手了。

这是遮挡人脸和有人脸生成的 提示信息 和 base64图片

img


在网页上预览效果还是黑屏照片

img

  • 写回答

1条回答 默认 最新

  • 是大刚啊 2024-01-17 10:18
    关注

    这个问题?clearRect 之后重新调一个beginPath试试

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月26日
  • 修改了问题 1月19日
  • 修改了问题 1月17日
  • 修改了问题 1月16日
  • 展开全部