直接上代码,代码每一步都是解释与插图,一步步实现,如果不清楚opencv的环境如何搭建,可上网查或者参见我的前几篇博客,不多说了, java代码如下:

package com.zmx.opencvtest;import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.IOException;/*** Created by zhangwenchao on 2017/9/27.*/
public class FirstOpenCVTest {static {//注意程序运行的时候需要在VM option添加该行 指明opencv的dll文件所在路径//-Djava.library.path=$PROJECT_DIR$\opencv\x64System.loadLibrary(Core.NATIVE_LIBRARY_NAME);   //载入opencv all库}public static void main(String[] args) throws InterruptedException {/*** 1. 读取原始图像转换为OpenCV的Mat数据格式*/Mat srcMat = Imgcodecs.imread("E:/srcImage.jpg");  //原始图像/*** 2. 强原始图像转化为灰度图像*/Mat grayMat = new Mat(); //灰度图像Imgproc.cvtColor(srcMat, grayMat, Imgproc.COLOR_RGB2GRAY);BufferedImage grayImage =  toBufferedImage(grayMat);saveJpgImage(grayImage,"E:/grayImage.jpg");System.out.println("保存灰度图像!");/*** 3、对灰度图像进行二值化处理*/Mat binaryMat = new Mat(grayMat.height(),grayMat.width(),CvType.CV_8UC1);Imgproc.threshold(grayMat, binaryMat, 20, 255, Imgproc.THRESH_BINARY);BufferedImage binaryImage =  toBufferedImage(binaryMat);saveJpgImage(binaryImage,"E:/binaryImage.jpg");System.out.println("保存二值化图像!");/*** 4、图像腐蚀---腐蚀后变得更加宽,粗.便于识别--使用3*3的图片去腐蚀*/Mat destMat = new Mat(); //腐蚀后的图像Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));Imgproc.erode(binaryMat,destMat,element);BufferedImage destImage =  toBufferedImage(destMat);saveJpgImage(destImage,"E:/destImage.jpg");System.out.println("保存腐蚀化后图像!");/*** 5 图片切割*///获取截图的范围--从第一行开始遍历,统计每一行的像素点值符合阈值的个数,再根据个数判断该点是否为边界//判断该行的黑色像素点是否大于一定值(此处为150),大于则留下,找到上边界,下边界后立即停止int a =0, b=0, state = 0;for (int y = 0; y < destMat.height(); y++)//行{int count = 0;for (int x = 0; x < destMat.width(); x++) //列{//得到该行像素点的值byte[] data = new byte[1];destMat.get(y, x, data);if (data[0] == 0)count = count + 1;}if (state == 0)//还未到有效行{if (count >= 150)//找到了有效行{//有效行允许十个像素点的噪声a = y;state = 1;}}else if (state == 1){if (count <= 150)//找到了有效行{//有效行允许十个像素点的噪声b = y;state = 2;}}}System.out.println("过滤下界"+Integer.toString(a));System.out.println("过滤上界"+Integer.toString(b));//参数,坐标X,坐标Y,截图宽度,截图长度Rect rect = new Rect(0,a,destMat.width(),b - a);Mat resMat = new Mat(destMat,rect);BufferedImage resImage =  toBufferedImage(resMat);saveJpgImage(resImage,"E:/resImage.jpg");System.out.println("保存切割后图像!");/*** 识别-*//* try {Process  pro = Runtime.getRuntime().exec(new String[]{"D:/Program Files (x86)/Tesseract-OCR/tesseract.exe", "E:/resImage.jpg","E:/result"});pro.waitFor();} catch (IOException e) {e.printStackTrace();}*/try {String result =  TesseractOCRUtil.recognizeText(new File("E:/resImage.jpg"));System.out.println(result);} catch (Exception e) {e.printStackTrace();}}/*** 将Mat图像格式转化为 BufferedImage* @param matrix  mat数据图像* @return BufferedImage*/private static BufferedImage toBufferedImage(Mat matrix) {int type = BufferedImage.TYPE_BYTE_GRAY;if (matrix.channels() > 1) {type = BufferedImage.TYPE_3BYTE_BGR;}int bufferSize = matrix.channels() * matrix.cols() * matrix.rows();byte[] buffer = new byte[bufferSize];matrix.get(0, 0, buffer); // 获取所有的像素点BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type);final byte[] targetPixels = ((DataBufferByte)image.getRaster().getDataBuffer()).getData();System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);return image;}/*** 将BufferedImage内存图像保存为图像文件* @param image BufferedImage* @param filePath  文件名*/private static void saveJpgImage(BufferedImage image, String filePath) {try {ImageIO.write(image, "jpg", new File(filePath));} catch (Exception e) {throw new RuntimeException(e);}}}

对于图片识别,我单独写了一个工具类,本文也有引用,java代码如下:

package com.zmx.opencvtest;/*** Created by zhangwenchao on 2017/9/28.*/import java.io.BufferedReader;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;public class TesseractOCRUtil{private static final String LANG_OPTION = "-l";private static final String EOL = System.getProperty("line.separator");/*** @param imageFile*            传入的图像文件* @return 识别后的字符串*/public static String recognizeText(File imageFile) throws Exception {/*** 设置输出文件的保存的文件目录*/File outputFile = new File(imageFile.getParentFile(), "output");StringBuffer strB = new StringBuffer();Process  pro = Runtime.getRuntime().exec(new String[]{"D:/Program Files (x86)/Tesseract-OCR/tesseract.exe",imageFile.getPath(),outputFile.getPath()});int w = pro.waitFor();if (w == 0) // 0代表正常退出{BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath() + ".txt"),"UTF-8"));String str;while ((str = in.readLine()) != null){strB.append(str).append(EOL);}in.close();} else{String msg;switch (w){case 1:msg = "Errors accessing files. There may be spaces in your image's filename.";break;case 29:msg = "Cannot recognize the image or its selected region.";break;case 31:msg = "Unsupported image format.";break;default:msg = "Errors occurred.";}throw new RuntimeException(msg);}new File(outputFile.getAbsolutePath() + ".txt").delete();return strB.toString().replaceAll("\\s*", "");}public static void main(String[] args) {try {String result =  recognizeText(new File("E:/resImage.jpg"));System.out.println(result);} catch (Exception e) {e.printStackTrace();}}
}

运行结果如下:

1、原始图像(网上不知哪位仁兄的银行卡):

2、保存灰度图像!

3、保存二值化图像!

4、保存腐蚀化后图像!

5、获取的截取图像的上下边界
       过滤上界386
       过滤下界447

6、保存切割后图像!


7、识别的卡号:
         6228482298797273578

搞了一天的时间,总算大功告成,效果还不错!

Java使用OpenCV和Tesseract-OCR实现银行卡图片处理与卡号识别相关推荐

  1. iOS实践:OpenCV、Tesseract OCR结合 识别图片中文字

    前言: 前天领导问,类似扫描文件识别图中文字的功能如何实现,找一下第三方的开源库,尝试下,于是有了这篇文章: 分析: 识别场景中,识别身份证信息当属典型,查阅了几篇文章,后续的实现中也多导入了其代码: ...

  2. OpenCV OCR实战:卡号识别

    本文主要介绍通过OpenCV- python实现简单的银行卡卡号识别的思路和具体实现过程. 目录 知识准备 项目概述 实现过程 代码讲解 1.自定义函数 2.模版读入与预处理 3.银行卡读入与形态学操 ...

  3. OpenCv NDK 银行卡/身份证号识别(3) 银行卡/身份证图像处理和卡号区域剪切

    通过前两篇我们已经对Opencv有所了解了,接下来就要真正的来处理我们的图像,然后把卡号给提取出来.首先我们先简单分析以下银行卡然后把处理流程列出来: 由上图我们很容易知道既然我们要找到卡号,银行卡的 ...

  4. Tesseract OCR+Tess4j实现图片中英文识别

    文章目录 Tesseract 简介 环境搭建 下载语言库 tess4j 依赖 demo Tesseract 简介 Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经 ...

  5. java实现OpenCV 4.1.0人脸相似度对比

    需要opencv的jar,从opencv的安装路径中可以获取. package com.ahies.dit.management.util;import org.opencv.core.*; impo ...

  6. [升级版]支付宝扫码付款直接到银行卡最新教程, 自动填写卡号

    目前业界普遍使用的微信.支付宝.第三方.第四方收款渠道,正遭大规模的封号.冻结.卡钱等等等等...您是否也是为此头疼已久?是否还有真正稳定的收款渠道?别急!试试支付宝快捷充值技术!支付宝扫一扫直接到账 ...

  7. php微信绑定银行卡号,《微信》免输卡号绑定银行卡方法介绍

    在当我们使用<微信>绑定银行卡的时候,是不是都感觉输入银行卡号非常的麻烦呢?而现在,<微信>已经宣布今后绑定银行卡不需要输入复杂的卡号了.那么大家知道这一个梗的真实意思吗?接下 ...

  8. 关于Tesseract OCR 中文训练识别小试(java调用Tess4j)

    2017.9.20日小结 最近接到是关于消防系统协议解析仪器的项目,目的是从协议解析仪器获取有效数据,并解析数据(目的是不希望消防主机的数据信息再传给主机厂商而是最后能给自己收集调用).由于各个消防器 ...

  9. OCR-基于OpenCV、Tesseract的银行卡号识别

    title: 'OCR:基于OpenCV.Tesseract的银行卡号识别' type: categories date: 2016-12-01 16:50:30 categories: OC tag ...

最新文章

  1. python分数运算使用Fraction模块
  2. virtualBox使用nat模式下ssh连接
  3. ffmpeg实现摄像头拉流_[FFmpeg] 如何通过实时摄像头帧图片生成 rtmp 直播流?
  4. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170328
  5. Android获取屏幕尺寸大小
  6. opensuse 42.2 mysql_【Linux】Grub模式硬盘安装openSUSE 42.2
  7. 解释afterPropertiesSet
  8. 2014年9月28日 18:35:01
  9. python坐标定位_如何利用Python识别并定位图片中某一个色块的坐标?
  10. Spring中拦截/和拦截/*的区别
  11. 中国水密门市场趋势报告、技术动态创新及市场预测
  12. Fortran与C/C++混合编程示例
  13. wireshark显示过滤器和捕获过滤器
  14. Handler机制整理
  15. 时域、频域、时频域+三种频域变换的理解
  16. cdr圆形渐变填充怎么设置_cdr渐变怎么设置?CorelDRAW渐变设置方法
  17. 机器学习实战之朴素贝叶斯与垃圾邮件分类
  18. 罗克韦尔编程软件RSLogix5000 win7 64位那什么的方法
  19. 把笔记本变为无线路由器使用(win7无需软件)
  20. CVE-2018-2628漏洞复现

热门文章

  1. 「Adobe国际认证」考证的意义,是能力还是标签?
  2. 这款开源项目能一秒还原 “马赛克” 图片
  3. linux阻断设备接收,阻断P2P通信
  4. 【[BJOI2017]魔法咒语】
  5. java取得汉字拼音(pinyin4j)
  6. 数据结构基本框架思维导图
  7. ueditor百度编辑器destoon的word图片转存功能
  8. PHP实现好友生日邮件提醒
  9. 算法题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半
  10. 2020DCIC智慧海洋建设算法赛学习02-数据分析