Node.js开发ANPR项目:找到车牌轮廓后如何实现遮罩及裁剪操作
ANPR车牌遮罩与裁剪实现方案
你已经成功获取到了车牌的四边形轮廓,只需补充填充掩码、应用遮罩、裁剪ROI三个步骤即可实现需求。
原实现效果

期望遮罩效果

核心修改逻辑
- 你之前创建的mask没有实际使用,需要用填充模式把车牌轮廓内部涂白,作为遮罩依据
- 调用
bitwiseAnd时传入遮罩参数,仅保留遮罩白色区域的原图内容 - 通过轮廓外接矩形属性直接裁剪得到独立的车牌图像
修改后完整代码
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
相关产品推荐
相关产品推荐

