千家信息网

OpenCV4Android中怎么获取卡号轮廓显示

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章为大家展示了OpenCV4Android中怎么获取卡号轮廓显示,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们在OpenCVCaremaActivi
千家信息网最后更新 2026年11月03日OpenCV4Android中怎么获取卡号轮廓显示

本篇文章为大家展示了OpenCV4Android中怎么获取卡号轮廓显示,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

我们在OpenCVCaremaActivity中的ImgView里面加入拍照事件

首先加一个boolean的变量,这样在按钮的时候实时动态显示先不进行处理了

按钮事件流程

  1. 将获取的Mat图像进行处理,处理方法我们都写在了OpenCvUtil里面了,一会儿说GetAreaMat的方法

  2. 然后将处理好的Mat转成bitmap的图像.

  3. 再把bitmap的图像转为byte的数组,传递到我们的主页界面

  4. 关闭本页面.

  5. 最后主页面的onActivityResulty的方法把byte的数组转回成bmp显示在页面上

Mat图像处理方法

我们摄像头获取卡号时,拍下的照片进行处理,把多余部分尽量去掉,获取一个完整的卡片信息,以便于我们后序的图像识别.

获取卡片图像的操作原理

  1. 原图像的梯度求取

  2. 然后把梯度图像进行二值化处理

  3. 然后在轮廓的发现与过滤

  4. 返回图像


OpenCvUtils里的GetAreaMat方法,就是按照我们上面的原理流程写出的处理方法,直接贴出来,里面的Matgradient方法是图像梯度化的方法,仔细看了下就是整个流程:

public class OpenCvUtils {

//获取需要的区域
public static Mat GetAreaMat(Mat src) {
Mat dst = new Mat();
Mat area = new Mat();

src.copyTo(dst);

//首先将资源梯度化
Matgradient(dst);
//先改为灰度图像
Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2GRAY);
//二值化图像处理
Imgproc.threshold(dst, dst, 40, 255, Imgproc.THRESH_BINARY);
//对图像进行开操作(先腐蚀后膨胀)
Mat strElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
Imgproc.morphologyEx(dst, dst, Imgproc.MORPH_OPEN, strElement);

//寻找轮廓
List contours = new ArrayList<>();
Mat hireachy = new Mat();
/**
* Imgproc.RETR_EXTERNAL代表寻找轮廓外层最大的轮廓
*/
Imgproc.findContours(dst, contours, hireachy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0));
/**
* 获取宽和高
* 用于除2是为了占总图像一半,用于分析想找到的区域
*/
int hw = dst.cols()/2;
Rect roi = new Rect();
for(int i=0;iRect rect = Imgproc.boundingRect(contours.get(i));
if (rect.width > hw ) {
roi.x = rect.x;
roi.y = rect.y;
roi.width = rect.width;
roi.height = rect.height;
break;
}
}

//为0说明未找到区域
if (roi.width == 0 || roi.height == 0) {
src.copyTo(area);
} else {
src.submat(roi).copyTo(area);
}
dst.release();
return area;
}

//将Mat对象梯度化
private static void Matgradient(Mat src) {
//先计算梯度
Mat grad_x = new Mat();
Mat grad_y = new Mat();
Mat abs_grad_x = new Mat();
Mat abs_grad_y = new Mat();
//先把X方向梯度化
Imgproc.Scharr(src, grad_x, CvType.CV_32F, 1, 0);
//再把Y方向梯度化
Imgproc.Scharr(src, grad_y, CvType.CV_32F, 0, 1);
//绝对值
/**
* 因为获取的grad_x和grad_y有可能是负值,我们要求的是0-255之间的数值
* 所以需要把原来的梯度化的生成绝对值
*/
Core.convertScaleAbs(grad_x, abs_grad_x);
Core.convertScaleAbs(grad_y, abs_grad_y);
grad_x.release(); //处理完记得及时释放节省资源
grad_y.release(); //处理完记得及时释放节省资源
//梯度图像
/**
* 根据最后获取的两个绝对值,把图像重新合并,两个0.5的参数就是图像的比重
*/
Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, src);
abs_grad_x.release(); //处理完记得及时释放节省资源
abs_grad_y.release(); //处理完记得及时释放节省资源
}
}

上述内容就是OpenCV4Android中怎么获取卡号轮廓显示,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

图像 处理 梯度 方法 轮廓 资源 就是 卡号 区域 流程 绝对值 两个 主页 事件 内容 卡片 原理 图像处理 技能 按钮 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 没上市的科技互联网公司 猪兼强互联网科技 百单互联网科技有限公司 互联网科技的未来发展 长亮科技互联网金融 互联网金融监管科技 汉立互联网科技有限公司联系电话 重庆威客帮互联网科技 受益于互联网科技的高速发展 科技类公司包括互联网吗 民营互联网公司国防科技 华夏恒生互联网科技013171 世界互联网领先科技成果获奖 科技赋能视角下互联网保险发展 银行科技岗属于互联网吗 互联网科技快讯热点 上海互联网科技公司ppt 科技互联网经济论坛 互联网 科技节活动 微视频大赛 九亚互联网科技 深圳期待互联网科技 互联网科技股有哪些 海南购全球互联网科技 深圳互联网科技怎么样 互联网科技公司的市场部门 知域互联网科技有限公司大骗子 新氧科技和美国互联网有关系吗 保山互联网科技靠谱吗 河南商务圈互联网科技有限公司
0