惊蛰 - 2016年7月
type: channel
link: http://forthxu.com/blog/2016/07/
description: Just So So ...
items: libc.so.6误删后的修复方法
items: 验证码识别

libc.so.6误删后的修复方法
type: item
date: 2016-07-12T12:44:00+08:00
description: 因为测试Selenium的chromedriver需要2.15以上的libc.so，因此自己编译安装，删除再做软链时发现ls、dir一系列命名不能使用的情况，提示： rm: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory 才意识到动到了系统核心的动态库，补救方法： LD_PRELOAD=/lib64/libc-2.12.so ln -sf /lib64/libc-2.12.so /lib64/libc.so.6 原理就是优先查找指定动态库。 扩展阅读： libstdc++.so.6升级 https://github.com/FezVrasta/ark-server-tools/wiki/Install-of-required-versions-of-glibc-and-gcc-on-RHEL-CentOS https://centos.pkgs.org/5/centos-x86_64/libstdc++-4.1.2-55.el5.x86_64.rpm.html ftp://ftp.gwdg.de/pub/misc/gcc/releases/gcc-4.9.4/ http://www.mudbest.com/centos%E5%8D%87%E7%BA%A7gcc4-4-7%E5%8D%87%E7%BA%A7gcc4-8%E6%89%8B%E8%AE%B0/

验证码识别
type: item
date: 2016-07-05T15:51:00+08:00
description: 对验证码识别大致分这几个过程， 第一步获取验证码， 第二对验证码处理，如果颜色单一没什么背景杂色就直接二值化处理，注意阙值，有干扰线的把干扰线和背景去掉，最终变为背景为白色，验证码前景色为黑色。 第三步就是切割，把验证码从图片中切割出来， 第四建立识别库，切割后的图片分类存入识别库，让后需要让程序学习一些验证码后，识别库就有了样例。第四步就是那当前是别的验证码和识别库的验证码进行比对，达到识别验证码的结果。 实例程序代码： using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Net; using System.Collections; using System.IO; namespace CheckCodeRecognizeLib { public class CheckCodeRecognize { #region 成员变量 //色差阀值 越小消除的杂色越多 private double threshold = 150; //二值阀值 越大效果越不明显 private double ezFZ = 0.6; //背景近似度阀值 private double bjfz = 80; //图片路径 private string imgPath = string.Empty; //每个字符最小宽度 public int MinWidthPerChar = 7; //每个字符最大宽度 public int MaxWidthPerChar = 18; //每个字符最小高度 public int MinHeightPerChar = 10; //学习库保存的路径 private readonly string samplePath = AppDomain.CurrentDomain.BaseDirectory + "Sample\\"; #endregion #region 图片处理 /// /// 对传入的图片二值化 /// /// 传入的原图片 /// 处理过后的图片 private Bitmap EZH(Bitmap bitmap) { if (bitmap != null) { var img = new Bitmap(bitmap); for (var x = 0; x < img.Width; x++) { for (var y = 0; y < img.Height; y++) { Color color = img.GetPixel(x, y); if (color.GetBrightness() < ezFZ) { img.SetPixel(x, y, Color.Black); } else { img.SetPixel(x, y, Color.White); } } } return img; } return null; } /// /// 去背景 /// 把图片中最多的一部分颜色视为背景色 选出来后替换为白色 /// /// 将要处理的图片 /// 返回去过背景的图片 private Bitmap RemoveBackGround(Bitmap bitmapImg) { if (bitmapImg == null) { return null; } //key 颜色 value颜色对应的数量 Dictionary<Color, int> colorDic = new Dictionary<Color, int>(); //获取图片中每个颜色的数量 for (var x = 0; x < bitmapImg.Width; x++) { for (var y = 0; y < bitmapImg.Height; y++) { //删除边框 if (y == 0 || y == bitmapImg.Height) { bitmapImg.SetPixel(x, y, Color.White); } var color = bitmapImg.GetPixel(x, y); var colorRGB = color.ToArgb(); if (colorDic.ContainsKey(color)) { colorDic[color] = colorDic[color] + 1; } else { colorDic[color] = 1; } } } //图片中最多的颜色 Color maxColor = colorDic.OrderByDescending(o => o.Value).FirstOrDefault().Key; //图…