当前位置:首页 > JavaScript

cvfindcontours js实现

2026-04-05 16:48:04JavaScript

cv.findContours 的 JavaScript 实现

在 JavaScript 中实现类似 OpenCV 的 findContours 功能,可以使用 HTML5 的 Canvas API 或第三方库(如 OpenCV.js)。以下是两种实现方式:

使用 OpenCV.js

  1. 加载 OpenCV.js 库 在 HTML 文件中引入 OpenCV.js:

    <script async src="https://docs.opencv.org/4.5.5/opencv.js" onload="onOpenCvReady();"></script>
  2. 实现 findContours

    function findContours() {
     let src = cv.imread('inputImage');
     let dst = new cv.Mat();
     let contours = new cv.MatVector();
     let hierarchy = new cv.Mat();
    
     cv.cvtColor(src, src, cv.COLOR_RGBA2GRAY);
     cv.threshold(src, dst, 120, 200, cv.THRESH_BINARY);
     cv.findContours(dst, contours, hierarchy, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE);
    
     // 绘制轮廓
     for (let i = 0; i < contours.size(); ++i) {
         let color = new cv.Scalar(0, 255, 0);
         cv.drawContours(src, contours, i, color, 2, cv.LINE_8, hierarchy, 0);
     }
    
     cv.imshow('outputCanvas', src);
     src.delete(); dst.delete(); contours.delete(); hierarchy.delete();
    }

使用纯 JavaScript 和 Canvas

  1. 获取图像数据

    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');
    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  2. 实现轮廓查找算法

    cvfindcontours js实现

    function findContours(imageData) {
     const width = imageData.width;
     const height = imageData.height;
     const data = imageData.data;
     const visited = new Array(width * height).fill(false);
     const contours = [];
    
     for (let y = 0; y < height; y++) {
         for (let x = 0; x < width; x++) {
             const index = y * width + x;
             if (data[index * 4] < 128 && !visited[index]) {
                 const contour = [];
                 const stack = [[x, y]];
                 visited[index] = true;
    
                 while (stack.length > 0) {
                     const [cx, cy] = stack.pop();
                     contour.push([cx, cy]);
    
                     for (let dy = -1; dy <= 1; dy++) {
                         for (let dx = -1; dx <= 1; dx++) {
                             const nx = cx + dx;
                             const ny = cy + dy;
                             if (nx >= 0 && nx < width && ny >= 0 && ny < height) {
                                 const nIndex = ny * width + nx;
                                 if (data[nIndex * 4] < 128 && !visited[nIndex]) {
                                     visited[nIndex] = true;
                                     stack.push([nx, ny]);
                                 }
                             }
                         }
                     }
                 }
                 contours.push(contour);
             }
         }
     }
     return contours;
    }

注意事项

  • OpenCV.js 需要从官方 CDN 加载,文件较大(约 8MB),适合需要完整 OpenCV 功能的场景。
  • 纯 JavaScript 实现适用于简单轮廓检测,但性能和精度可能不如 OpenCV.js。
  • 两种方法均需在浏览器中运行,不支持 Node.js 环境。

分享给朋友:

相关文章

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…