汉字验证码识别——OpenCV(JAVA环境)

本文介绍了一种识别扭曲和旋转处理的汉字验证码的方法,通过分割、去干扰和SIFT算法匹配特征点,实现了从六个汉字中识别出两个相同汉字的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

1.1 问题描述

       验证码类型如图1所示,需要从图中六个汉字中识别出两个相同的汉字,汉字中有繁体字,字体经过扭曲和旋转处理,汉字周围存在粗细不同,颜色各异的干扰线。

图1

1.2 背景概述

       识别常见的验证码一般需要经过以下步骤:

  1. 预处理,包括去灰度、调节亮度以及对比度、腐蚀膨胀、滤波去噪点、去干扰、二值化等,其中去干扰的方式有很多种,例如干扰线比较细而验证码比较粗,可以检测单个像素点相邻像素与该像素间是否有颜色突变,若有则认为是干扰线,或者干扰线与验证码之间有明显的颜色差异,可以根据颜色加以区分;
  2. 分割,位置固定的可以按确定尺寸分割,不固定位置的可以利用轮廓检测技术确定大致位置,再进行分割,分割效果受验证码图片中字符间的紧密程度以及预处理效果的影响;
  3. 训练,将分割得到的样本利用相应算法进行训练,提高识别率;
  4. 识别

       验证码形式各异,基本没有统一的方式解决所有类型的验证码识别问题,需要根据具体情况具体分析。

1.3 解决思路

      对于图1所示的验证码类型,背景颜色为白色,汉字颜色鲜明,噪点也非常少,可以把重点放在如何去除干扰线的问题上,仔细观察可以发现干扰线的颜色基本与汉字的颜色不同,且图片基本可以划分为6个区域,不同验证码图片在相同区域内,汉字颜色是相同的。而最终的目的也只是找出相同的汉字,所以可以把问题简化为从六张图片中找出两个最相似的图片。具体的解决思路如下:

  1. 将一张验证码图片等比例分割成6张含有单个汉字的图片;
  2. 对每张图片进行预处理,拾取汉字颜色作为目标颜色,去除图片中其他颜色以达到去干扰的目的,由于图片颜色通常都会进行渐变处理,所以按照RGB方式处理将不太方便,而本文采用HSV方式来表征颜色——HSV对肉眼可见的颜色可以通过具体的范围值加以区分。最后将去除干扰后的图片进行二值化处理;
  3. 由于图片中的汉字进行了扭曲和旋转处理,汉字在图片中的相对位置也有所变化,所以无法通过比较对应位置像素点颜色的方式加以比较。本文采用图像识别中的SIFT算法——SIFT算法具有尺度不变性和旋转不变性,分别提取图片中的特征值并两两比较,找出并统计两张图片中相似的特征点个数,个数最多的就认为是相似度最高的两张图片,即两个相同的汉字。

二、具体过程

2.1 配置opencv(JAVA环境)

  1. 下载opencv 2.4.13.6并配置环境变量https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.13/opencv-2.4.13.6-vc14.exe/download
    由于需要用到SIFT算法,而opencv 3.0以上版本将SIFT算法移至第三方库中,需要重新编译才能使用,为了方便,本文使用opencv 2.4.13.6 这一版本。
    ——path配置到opencv的bin目录下。
  2. 添加opencv的jar包,并静态加载dll文件
  	String x64 = " .../opencv/build/java/x64/";
  	System.load(x64 + "opencv_java2413.dll");

       或者在添加jar包后再在IDEA中配置Edit Configuration–VM options:-Djava.library.path= …\opencv\build\java\x64,再静态加载library

	System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

2.2 分割

	//读取图片
	Mat src = imread(file.getAbsolutePath());
    int eachHeight=src.rows()/2;
	int eachWidth=src.cols()/3;
	Rect rect;
	Mat dst;
	for (int i = 0; i < 6
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值