关于uniapp中使用opencv.js拍照提取纸张轮廓

这篇具有很好参考价值的文章主要介绍了关于uniapp中使用opencv.js拍照提取纸张轮廓。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.效果图片

uniapp opencv.js,html5,前端,uniapp,图像处理uniapp opencv.js,html5,前端,uniapp,图像处理uniapp opencv.js,html5,前端,uniapp,图像处理uniapp opencv.js,html5,前端,uniapp,图像处理

2.下载opencv.js  

比如下载 4.5.0 版本的 opencv.js 文件

https://docs.opencv.org/4.5.0/opencv.js

3.引入

opencv.js放在static文件夹下

页面中引入

let cv = require('../../static/opencv/opencv.js');

4.进入正题

   //页面先放一个隐藏图片

   <img id="imageUrl" alt="No Image" style="display: none;" />

   //获取图片

   var imgSrcElement = document.getElementById('imageUrl');

   //读取图片,将彩色图转为灰度图
   let img = cv.imread(imgSrcElement)

   let gray = new cv.Mat();
   cv.cvtColor(img, gray, cv.COLOR_RGBA2GRAY);

   const binary = new cv.Mat();
   cv.threshold(gray, binary, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU);

   //高斯模糊去除噪点
   let blur = new cv.Mat();
   cv.GaussianBlur(gray, blur, new cv.Size(5, 5), 0, 0, cv.BORDER_DEFAULT);

    //边缘检测,使用

   let edges = new cv.Mat();
   cv.Canny(blur, edges, 50, 150, 3, false);


    //查找轮廓
   const contours = new cv.MatVector();
   const hierarchy = new cv.Mat();
   cv.findContours(edges, contours, hierarchy, cv.RETR_EXTERNAL, cv
   .CHAIN_APPROX_SIMPLE);


   //计算最大面积
   let maxContourIndex = -1;
   let maxContourArea = 0;
   for (let i = 0; i < contours.size(); i++) {
        const contourArea = cv.contourArea(contours.get(i));
        if (contourArea > maxContourArea) {
          maxContourIndex = i;
          maxContourArea = contourArea;
       }
    }

    const contour = contours.get(maxContourIndex );
    const area = cv.contourArea(contour);
    const perimeter = cv.arcLength(contour, true);
    const approx = new cv.Mat();
   
// 近似轮廓
    cv.approxPolyDP(contour, approx, 0.02 * perimeter, true);

   const rect1 = cv.minAreaRect(contour);
   const vertices = cv.RotatedRect.points(rect1);

   // 获取提取纸张的四个坐标点
   const corners = [];
    for (let i = 0; i < vertices.length; ++i) {
          corners.push({
                  x: vertices[i].x,
                  y: vertices[i].y
               });
    }
   console.log("输出新坐标1", corners)
    this.newPint = corners
                                    // 矩形的四个顶点坐标
                                    const pints = [{
                                            x: this.newPint[0].x,
                                            y: this.newPint[0].y
                                        }, //左上角
                                        {
                                            x: this.newPint[1].x,
                                            y: this.newPint[1].y
                                        }, //右上角
                                        {
                                            x: this.newPint[2].x,
                                            y: this.newPint[2].y
                                        }, //右下角
                                        {
                                            x: this.newPint[3].x,
                                            y: this.newPint[3].y
                                        } //左下角
                                    ];



                                    //显示图片(效果测试)
                                    // document.getElementsByTagName("canvas")[0].setAttribute("id",
                                    //     "canvas1");
                                    // cv.imshow('canvas1', img);

                                    const ctx = uni.createCanvasContext('canvas', this);
                                    //先清除上一次的
                                    ctx.clearRect(0, 0, this.innerWidth, this
                                        .innerHeight - 360);
                                    // 绘制图片
                                    ctx.drawImage(res.tempFilePaths[0], 0, 0, this.innerWidth, this
                                        .innerHeight - 360);
                                    // 创建蒙层
                                    ctx.fillStyle = 'rgba(0, 0, 0, 0.4)';
                                    ctx.fillRect(0, 0, this.innerWidth, this
                                        .innerHeight - 360);
                                    // 设置蒙层混合模式
                                    ctx.globalCompositeOperation = 'destination-out';
                                    ctx.beginPath();
                                    for (let i = 0; i < pints.length; i++) {
                                        const screenX = pints[i].x * $this.innerWidth / img
                                            .cols;
                                        const screenY = pints[i].y * ($this.innerHeight -
                                                360) / img
                                            .rows;
                                        if (i === 0) {
                                            ctx.moveTo(screenX, screenY);
                                        } else {
                                            ctx.lineTo(screenX, screenY);
                                        }
                                    }
                                    ctx.closePath();
                                    // 描边路径
                                    ctx.stroke();
                                    // 使用反向路径绘制,将未连接线外的区域作为裁剪区域
                                    ctx.globalCompositeOperation = 'destination-out';
                                    // 填充路径
                                    ctx.fillStyle = "rgba(255,255,255,0.2)"; // 设置填充颜色
                                    ctx.fill();

                                    //填充节点颜色
                                    for (let i = 0; i < pints.length; i++) {
                                        ctx.beginPath();
                                        //计算屏幕坐标
                                        const screenX = pints[i].x * $this.innerWidth / img
                                            .cols;
                                        const screenY = pints[i].y * ($this.innerHeight -
                                                360) / img
                                            .rows;
                                        let temp = {}
                                        temp.x = screenX
                                        temp.y = screenY
                                        $this.pintList.push(temp)
                                        ctx.arc(screenX, screenY, 6, 0, 2 * Math
                                            .PI);

                                     // 绘制圆 参数依次为 圆的横坐标/纵坐标/半径/绘制圆的起始位置/绘制圆的弧度大小
                                        ctx.closePath();
                                        ctx.stroke();
                                        ctx.fill();
                                    }
                                    ctx.globalCompositeOperation = 'source-over'; // 恢复默认混合模式
                                    ctx.draw();
                                    approx.delete();
                                }
                            }

      文章来源地址https://www.toymoban.com/news/detail-762221.html

到了这里,关于关于uniapp中使用opencv.js拍照提取纸张轮廓的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓

    这篇博客将介绍如何使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓。 使用Python绘制端午dragboat消消乐 美轮美奂的界面效果 选了我最爱的小林老师的漫画图~ 纵有千种风情,更与谁人说。 端午粽子原始图VS素描图: 端午粽子

    2024年02月08日
    浏览(46)
  • 【OpenCV实现图像:使用OpenCV进行物体轮廓排序】

    在图像处理中,经常需要进行与物体轮廓相关的操作,比如计算目标轮廓的周长、面积等。为了获取目标轮廓的信息,通常使用OpenCV的findContours函数。然而,一旦获得轮廓信息后,可能会发现轮廓的顺序是无序的,如下图左侧所示: 在这个图中,每个轮廓都被找到,但它们的

    2024年02月03日
    浏览(44)
  • js将Excel转成PDF(纸张、分页、铺满、提高清晰度)

    依赖: 示例html DOM: 核心js: - - -

    2024年02月11日
    浏览(41)
  • 在uniapp中从本地相册选择图片或使用相机拍照

    在uniapp中从本地相册选择图片或使用相机拍照,可以使用uniapp中内置的API uni.chooseImage 。 参数 名称 类型 必填 默认值 描述 options ChooseImageOptions 是 - - ChooseImageOptions 属性值 名称 类型 必备 默认值 描述 count number 否 9 最多可以选择的图片张数,app端不限制,微信小程序最多可

    2024年02月04日
    浏览(45)
  • Opencv算法记录:如何使用Opencv求解圆与轮廓、直线的交点

    GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解 GUN C编译器拓展语法学习笔记(二)属性声明 GUN C编译器拓展语法学习笔记(三)内联函数、内建函数与可变参数宏 数组存储与指针学习笔记(一)数据类型与存储、数据对齐、数据移植、typedef   最近涉及到Opencv用来求

    2024年02月11日
    浏览(47)
  • uniapp 安卓使用live-pusher实现人脸识别(拍照)功能

    nvue页面可以直接使用 live-pusher 组件。 由于live-pusher是矩形的,一般人脸识别使用圆形,所以添加 cover-image 可覆盖在live-pusher上层,修改样式。 vue页面直接使用 live-pusher 组件将无法进入方法的回调中。 可见:官方描述 需要使用 plus.video.createLivePusher 方法 使用该方法, cover

    2024年02月11日
    浏览(44)
  • Python进阶,使用 opencv 调用摄像头进行拍照

             opencv 支持 Python 版本的模块叫作 opencv-p hon ,可直接使用 pip install opencv-python 令进行安装,但常常会因为网络等问题导致失败。推荐使用离线模式来安装 opencv 模块。 下载完安装包后,使用如下命令进行安装: D: pip install opencv

    2024年02月11日
    浏览(69)
  • [C++] opencv - drawContours(绘制轮廓)函数介绍和使用场景

    OpenCV中的drawContours函数用于在图像上绘制轮廓。其函数原型如下: 比较复制插入新建 参数说明: image: 输出图像,即绘制轮廓后的图像。 contours: 轮廓集合,每个轮廓由一系列点组成。 contourIdx: 轮廓索引数组,指定要绘制哪些轮廓。如果为NULL,则绘制所有轮廓。 contourC

    2024年01月19日
    浏览(55)
  • uniapp 开发微信小程序用相机拍照后使用Canvas翻转图片

    傻逼了,兄弟们,uniapp和微信都有一个专门调用手机拍照和相册的api ,拍完照片后会自动根据设备方向翻转,从而始终是正面。如果还想看canvas翻转下面也有    离谱,canvas实例要在onReady里面定义,我找了几个小时才找到。  由于开发需求是要竖着拍照横着返回,所以就必须

    2024年02月13日
    浏览(55)
  • 微信camera拍照组件的使用(uniapp小程序)代码可直接复制看效果

    微信camera官方文档:https://developers.weixin.qq.com/miniprogram/dev/component/camera.html html 整体效果 样式可以自行定义的一个拍照组件 未找到摄像头是因为台式机电脑没有摄像头 真机测试可以使用 2)方法 cameraError方法进入拍照页面时会提醒授权相机。如果用户点击不同意授权就会打回上

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包