You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js开发ANPR项目:找到车牌轮廓后如何实现遮罩及裁剪操作

ANPR车牌遮罩与裁剪实现方案

你已经成功获取到了车牌的四边形轮廓,只需补充填充掩码、应用遮罩、裁剪ROI三个步骤即可实现需求。

原实现效果

当前效果

期望遮罩效果

期望效果


核心修改逻辑

  1. 你之前创建的mask没有实际使用,需要用填充模式把车牌轮廓内部涂白,作为遮罩依据
  2. 调用bitwiseAnd时传入遮罩参数,仅保留遮罩白色区域的原图内容
  3. 通过轮廓外接矩形属性直接裁剪得到独立的车牌图像

修改后完整代码

import cv from 'opencv4nodejs';

// 读取图像、灰度化
const img = cv.imread('./images/img2.jpg');
const grayImg = img.bgrToGray();

const bfilter = grayImg.bilateralFilter(11, 17, 17);
const edged = bfilter.canny(30, 200);

const getContour = (handMask) => {
    const mode = cv.RETR_TREE;
    const method = cv.CHAIN_APPROX_SIMPLE;
    const contours = handMask.findContours(mode, method);

    return contours
        .sort((c0, c1) => c1.area - c0.area)
        .slice(0, 10)
        .find((contour) => {
            // 阈值改为按轮廓面积比例计算,适配不同大小的车牌
            const x = contour.approxPolyDP(contour.area * 0.02, true);
            return x.length === 4;
        });
};
let edgeContour = getContour(edged);

// 1. 生成遮罩:填充车牌轮廓区域为白色
let mask = new cv.Mat(grayImg.rows, grayImg.cols, cv.CV_8UC1, 0);
// thickness设为-1代表填充轮廓内部
mask.drawContours([edgeContour.getPoints()], 0, new cv.Vec(255), { thickness: -1 });

// 2. 应用遮罩,得到仅保留车牌区域的图像
const maskedImg = img.bitwiseAnd(img, mask);

// 3. 裁剪车牌:获取轮廓外接矩形后裁剪对应区域
const plateRect = edgeContour.boundingRect();
const croppedPlate = img.getRegion(plateRect).copy();

// 展示结果
cv.imshow('遮罩效果', maskedImg);
cv.imshow('裁剪后的车牌', croppedPlate);

cv.waitKey();
cv.destroyAllWindows();

补充说明

  • 如果需要保留绿色的轮廓标注,可以在maskedImg上再调用一次drawContours,thickness设为正数绘制边框即可
  • 裁剪得到的croppedPlate可直接保存或送入后续字符识别环节

内容的提问来源于stack exchange,提问作者Sabakakado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:06:06