使用 TensorFlow 和 OpenCV 时 JavaScript 中未捕获的 Promise 错误

问题描述 投票:0回答:1

我正在开发一个 Web 应用程序,该应用程序使用 TensorFlow 和 OpenCV 在实时视频流中进行对象检测。但是,我遇到了“未捕获(承诺)”错误,我正在努力解决该错误。这是错误消息和我的代码的相关部分:

错误信息:

(index):87 Uncaught (in promise) 1073690080

代码片段:

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test</title>
    <style>
        body { margin: 20; overflow: hidden; }
        video { position: absolute; top: 0; left: 0; width: 100vw; height: 100vh; object-fit: cover; z-index: -1; }
        canvas { position: absolute; top: 0; left: 0; width: 100vw; height: 100vh; }
    </style>
</head>
<body>
    <video id="video" autoplay playsinline></video>
    <canvas id="canvas"></canvas>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd"></script>
    <script>
        let opencvjs;
    
        async function setupCamera() {
            const video = document.getElementById('video');
            const stream = await navigator.mediaDevices.getUserMedia({ video: true });
            video.srcObject = stream;
            return new Promise((resolve) => {
                video.onloadedmetadata = () => {
                    console.log("Video Feed Loaded");
                    resolve(video);
                };
            });
        }

        async function loadModel() {
            console.log("Loading Model");
            return await cocoSsd.load();
        }
        
        async function loadOpencv() {
            return new Promise((resolve, reject) => {
                opencvjs = document.createElement("script");
                opencvjs.setAttribute("src", "https://docs.opencv.org/4.10.0/opencv.js");
                opencvjs.onload = () => {
                    cv['onRuntimeInitialized'] = () => {
                        resolve();
                    };
                };
                opencvjs.onerror = () => {
                    reject(new Error("Failed to load OpenCV.js"));
                };
                console.log("OpenCV Loaded");
                document.body.appendChild(opencvjs);
            });
        }

        function detectObjects(video, model, canvas) {
            const context = canvas.getContext('2d');
            canvas.width = video.videoWidth;
            canvas.height = video.videoHeight;
            
            async function detectFrame() {
                context.clearRect(0, 0, canvas.width, canvas.height);
                context.drawImage(video, 0, 0, canvas.width, canvas.height);
                var img = cv.imread(canvas);
                requestAnimationFrame(detectFrame);
            }
            detectFrame();
        }

        async function main() {
            await loadOpencv();
            const video = await setupCamera();
            const model = await loadModel();
            const canvas = document.getElementById('canvas');
            detectObjects(video, model, canvas);
        }

        main();
    </script>
</body>
</html>

当使用

detectFrame
递归调用
requestAnimationFrame
函数时,似乎会发生该错误。我怀疑这个问题可能与 OpenCV 如何处理图像数据有关,但我不确定如何调试或修复这个问题。

有人遇到过类似的问题或者可以提供有关如何处理此错误的见解吗?任何有关如何正确捕获和处理此承诺拒绝的建议将不胜感激。

javascript opencv html5-canvas
1个回答
0
投票

我解决了这个问题。在 requestanimationframe 调用之前,我没有删除(img.delete())使用 cv.imread() 读取的图像矩阵。成功删除后,错误消失了。

© www.soinside.com 2019 - 2024. All rights reserved.