`
bjloveyb
  • 浏览: 5468 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

图片识别

阅读更多
package com.util; 

002   

003 //~--- JDK imports ------------------------------------------------------------ 

004   

005 import com.sun.image.codec.jpeg.JPEGCodec; 

006 import com.sun.image.codec.jpeg.JPEGEncodeParam; 

007 import com.sun.image.codec.jpeg.JPEGImageEncoder; 

008   

009 import java.awt.*; 

010 import java.awt.image.*; 

011   

012 import java.io.*; 

013 import java.io.FileOutputStream; 

014 import java.io.OutputStream; 

015   

016 import java.net.*; 

017   

018 import javax.imageio.*; 

019 import javax.imageio.ImageIO; 

020   

021 /** *//** 

022  *   登陆验证图片转换为数字 

023  * 

024  * 

025  * @version    1.0, 08/04/20 

026  * @author     张健滢 

027  */

028 public class ImgIdent { 

029   

030     // 数字字符比特表 

031     private final long[][] NUMERIC = { 

032         { 512104545, 562436190 },    // ''0'' 

033         { 148931080, 136348222 },    // ''1'' 

034         { 511971394, 69273663 },     // ''2'' 

035         { 511971406, 17045598 },     // ''3'' 

036         { 35168914, 586948743 },     // ''4'' 

037         { 1065486398, 17045598 },    // ''5'' 

038         { 239208494, 830871646 },    // ''6'' 

039         { 1065623684, 69239824 },    // ''7'' 

040         { 512104542, 562436190 },    // ''8'' 

041         { 512104547, 486805660 } 

042     };                               // ''9'' 

043   

044     // 字框高 

045     private int intCharHeight = 10; 

046   

047     // 字框横向间隙 

048     private int intCharSpaceH = 5; 

049   

050     // 字框纵向间隙 

051     private int intCharSpaceY = 1; 

052   

053     // 字框宽 

054     private int           intCharWidth = 5; 

055     private int           IntImgHeight; 

056     private BufferedImage img; 

057     private int           intBgColor; 

058     private int           intCharColor; 

059     private int           intImgWith; 

060     private int           intMaxX; 

061     private int           intMaxY; 

062     private int           intMinX; 

063     private int           intMinY; 

064   

065     // 座标原点 

066     private Point  pOrigin; 

067     private String strNum; 

068   

069     /** *//** 

070      * Constructs  

071      * 

072      * 

073      * @param img 

074      * 

075      * @throws IOException 

076      */

077     public ImgIdent(BufferedImage img) throws IOException { 

078         this.img = img; 

079         init(); 

080     } 

081   

082     /** *//** 

083      *   构造函数 

084      *   @param   file     本地文件 

085      *   @throws   IOException 

086      */

087     public ImgIdent(File file) throws IOException { 

088         img = ImageIO.read(file); 

089         init(); 

090     } 

091   

092     /** *//** 

093      *   构造函数 

094      *   @param   url    远程文件 

095      *   @throws   IOException 

096      */

097     public ImgIdent(URL url) throws IOException { 

098         img = ImageIO.read(url); 

099         init(); 

100     } 

101   

102     /** *//** 

103      *   类初始工作 

104      */

105     private void init() { 

106   

107         // 得到图象的长度和宽度 

108         intImgWith   = img.getWidth(); 

109         IntImgHeight = img.getHeight(); 

110   

111         // 得到图象的背景颜色 

112         intBgColor = img.getRGB(7, 4); 

113   

114         // System.out.println(intBgColor); 

115   

116         // 初始化图象原点座标 

117         pOrigin = new Point(0, 0); 

118     } 

119   

120     /** *//** 

121      * Method description 

122      * 

123      */

124     private void getBaseInfo() { 

125         System.out.println(intBgColor + "|" + intCharColor); 

126         System.out.println(intMinX + "|" + intMinY + "|" + intMaxX + "|" + intMaxY); 

127     } 

128   

129     /** *//** 

130      *   得到字符的左上右下点座标 

131      *   @param   intNo   int                                   第n个字符 

132      *   @return   int[] 

133      */

134     private Point[] getCharRange(int intNo) { 

135   

136         // 左上右下点座标 

137         Point pTopLeft     = new Point(0, 0); 

138         Point pBottomRight = new Point(0, 0); 

139   

140         // 左上点 

141         pTopLeft.x = pOrigin.x + intCharWidth * (intNo - 1) + intCharSpaceH * (intNo - 1); 

142         pTopLeft.y = pOrigin.y; 

143   

144         // 右下点 

145         pBottomRight.x = 1 + pOrigin.x + intCharWidth * intNo + intCharSpaceH * (intNo - 1) - 1; 

146         pBottomRight.y = pOrigin.y + intCharHeight - 1; 

147   

148         return new Point[] { pTopLeft, pBottomRight }; 

149     } 

150   

151     /** *//** 

152      *   与背景颜色比较返回相应的字符 

153      *   @param   x   int                                           横座标 

154      *   @param   y   int                                           纵座标 

155      *   @return   char                                           返回字符 

156      */

157     private char getBit(int x, int y) { 

158         int intCurtColor; 

159   

160         intCurtColor = img.getRGB(x, y); 

161   

162         // System.out.println("[" + x + "," + y + "]" + intCurtColor + "==" + intBgColor + "==>" + (Math.abs(intCurtColor) >7308252)); 

163 //      return (Math.abs(intCurtColor) >= 5689325) 

164 //              ? ''0'' 

165 //              : ''1''; 

166         return (intCurtColor == intBgColor) 

167                ? ''0''

168                : ''1''; 

169   

170         // 5689325    6008535 

171     } 

172   

173     /** *//** 

174      *   得到第n个字符对应的字符串 

175      *   @param   intNo   int                                   第n个字符 

176      *   @return   String                                       代表字符位的串 

177      */

178     private String getCharString(int intNo) { 

179   

180         // 本字符的左上右下点座标 

181         Point[] p            = getCharRange(intNo); 

182         Point   pTopLeft     = p[0]; 

183         Point   pBottomRight = p[1]; 

184   

185         // 换算边界值 

186         int intX1, intY1, intX2, intY2; 

187   

188         intX1 = pTopLeft.x; 

189         intY1 = pTopLeft.y; 

190         intX2 = pBottomRight.x; 

191         intY2 = pBottomRight.y; 

192   

193 //      System.out.println("intX1=" + intX1); 

194 //      System.out.println("intY1=" + intY1); 

195 //      System.out.println("intX2=" + intX2); 

196 //      System.out.println("intY2=" + intY2); 

197   

198         // 在边界内循环取象素 

199         int    i, j; 

200         String strChar = ""; 

201   

202         for (i = intY1; i <= intY2; i++) { 

203             for (j = intX1; j <= intX2; j++) { 

204                 System.out.print(getBit(j, i)); 

205                 strChar = strChar + getBit(j, i); 

206             } 

207   

208             System.out.println(); 

209         } 

210   

211         System.out.println(); 

212   

213         return strChar; 

214     } 

215   

216     /** *//** 

217      *   得到第n个字符对应数值 

218      *   @param   intNo   int                                   第n个字符 

219      *   @return   int                                             对应数值 

220      */

221     public int getNum(int intNo) { 

222   

223         // 取得位字符串 

224         String strChar = getCharString(intNo); 

225   

226         // System.out.println(intNo+"=="+strChar); 

227         // 取得串高位串和低位串 

228         String strCharHigh = strChar.substring(0, strChar.length() / 2); 

229         String strCharLow  = strChar.substring(strChar.length() / 2); 

230   

231         // 计算高位和低位值 

232         long lCharHigh = Long.parseLong(strCharHigh, 2); 

233   

234         System.out.println(lCharHigh); 

235   

236         long lCharLow = Long.parseLong(strCharLow, 2); 

237   

238         System.out.println(lCharLow); 

239   

240         // 在数字中循环比较 

241         int intNum = ''*''; 

242   

243         for (int i = 0; i <= 9; i++) { 

244             if ((lCharHigh == NUMERIC[i][0]) && (lCharLow == NUMERIC[i][1])) { 

245                 intNum = i; 

246   

247                 break; 

248             } else { 

249                 if ((lCharHigh == 834533329) && (lCharLow == 242870177)) { 

250                     intNum = 6; 

251                 }    // 834533329 242870177 

252                         else { 

253                     intNum = 1; 

254                 }    // 默认为1   低位为    937393609  937393601 

255             } 

256         } 

257   

258         return intNum; 

259     } 

260   

261     /** *//** 

262      * 保存图片 

263      * 

264      * 

265      * @param length 

266      * 

267      * @return 

268      */

269     public String getValidatecode(int length) { 

270         String strNum = ""; 

271   

272         for (int i = 1; i <= length; i++) { 

273             synchronized (this) { 

274                 strNum += String.valueOf(getNum(i)); 

275             } 

276         } 

277   

278         return strNum; 

279     } 

280   

281     /** *//** 

282      * Method description 

283      * 

284      * 

285      * @param iag 

286      * @param savePath 

287      * 

288      * @throws FileNotFoundException 

289      * @throws IOException 

290      */

291     public void saveJPEG(BufferedImage iag, String savePath) throws FileNotFoundException, IOException { 

292         OutputStream     jos     = new FileOutputStream(savePath); 

293         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(jos); 

294         JPEGEncodeParam  jpegEP  = JPEGCodec.getDefaultJPEGEncodeParam(iag); 

295   

296         jpegEP.setQuality((float) 1, true); 

297         encoder.encode(iag, jpegEP); 

298         jos.flush(); 

299         jos.close(); 

300     } 

301 } 

302   

303    

304   

305 恩这样数字是可以识别出来了,可以我要怎么完成提交那块的工作呢?好在Apache已经为我做完了。我用了 

306 HttpClient这样一个模拟Http协议的小工具包。我只要往那个 Add_MSG.asp里面提交就完了。 

307   

308   

309   

310 package com.util; 

311   

312 //~--- non-JDK imports -------------------------------------------------------- 

313   

314 import org.apache.commons.httpclient.*; 

315 import org.apache.commons.httpclient.methods.GetMethod; 

316 import org.apache.commons.httpclient.methods.PostMethod; 

317 import org.apache.commons.httpclient.params.HttpClientParams; 

318 import org.apache.commons.httpclient.params.HttpMethodParams; 

319   

320 //~--- JDK imports ------------------------------------------------------------ 

321   

322 import java.awt.image.BufferedImage; 

323   

324 import java.io.InputStream; 

325   

326 import javax.imageio.ImageIO; 

327   

328   

329 public class MyHttpClient { 

330   

331     /** *//** 

332      * Method description 

333      * 

334      * 

335      * @param title 留言标题 

336      * @param name 留言者 

337      * @param Content 内容 

338      * @param proIP 代理IP 

339      * @param port  代理端口 

340      * @param usePro 是否使用代理 

341      */

342     public synchronized void doSomeThing(String title, String name, String Content, String proIP, int port, 

343             boolean usePro) { 

344   

345         // 构造HttpClient的实例 

346         HttpClient       httpClient   = new HttpClient(); 

347         HttpClientParams clientParams = new HttpClientParams(); 

348   

349         // 隐藏自己请求相关的信息 

350         clientParams.setParameter("http.useragent", "Mozilla/4.0 (compatible; FIREFOX 9.0; IBM AIX 5)"); 

351   

352         // httpClient.getHttpConnectionManager().getParams().setSoTimeout(30 * 1000); 

353         clientParams.setHttpElementCharset("GBK"); 

354   

355         HttpState httpState = new HttpState(); 

356   

357         httpClient.setParams(clientParams); 

358         httpClient.getParams(), .setParameter(HttpClientParams.HTTP_CONTENT_CHARSET, "GBK"); 

359         httpClient.setState(httpState); 

360         clientParams.setVersion(HttpVersion.HTTP_1_1); 

361   

362         // httpClient.getHostConfiguration().setProxy("148.233.159.58", 3128); 

363   

364         if (usePro)    // 使用代理 

365         { 

366             httpClient.getHostConfiguration().setProxy(proIP, port); 

367         } 

368   

369         // 创建GET方法的实例 

370         GetMethod getMethod = new GetMethod("http://www.XXXcom/Guestbook/imgchk/validatecode.asp"); 

371   

372         // 使用系统提供的默认的恢复策略 

373         getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); 

374   

375         try { 

376   

377             // 执行getMethod 

378             int statusCode = httpClient.executeMethod(getMethod); 

379   

380             // System.out.println(statusCode); 

381             if (statusCode != HttpStatus.SC_OK) { 

382                 System.err.println("Method failed: " + getMethod.getStatusLine()); 

383             }    // 读取内容 

384   

385             InputStream inStream = getMethod.getResponseBodyAsStream(); 

386   

387             // 处理内容 

388             // System.out.println(new String(responseBody)); 

389             BufferedImage iag      = ImageIO.read(inStream); 

390             ImgIdent      imgIdent = new ImgIdent(iag); 

391   

392             // imgIdent.saveJPEG(iag, "C:/ddd.jpg"); 

393             String validate = imgIdent.getValidatecode(4); 

394   

395             System.out.println(validate); 

396   

397             PostMethod method  = new PostMethod("http://www.XXX.com/Guestbook/add_msg.asp"); 

398             String     connect = Content; 

399             String     Title   = title; 

400   

401             method.setParameter("subject", Title); 

402             method.setParameter("g_name", name); 

403             method.setParameter("companyname", ""); 

404             method.setParameter("mail", ""); 

405             method.setParameter("homepageurl", "http://"); 

406             method.setParameter("pic", "p5.gif"); 

407             method.setParameter("validatecode", validate); 

408             method.setParameter("content", connect); 

409   

410 //          if (todo) { 

411             int code = httpClient.executeMethod(method); 

412   

413             // String Stringresponse = new String(method.getResponseBodyAsString().getBytes("8859_1")); 

414             // 打印返回的信息 

415             // System.out.println(Stringresponse); 

416 //          } 

417   

418             method.releaseConnection(); 

419   

420 //          System.out.println(iag.getHeight()); 

421 //          System.out.println(iag.getWidth()); 

422 //          //背景 颜色 

423 //          intBgColor = iag.getRGB(38, 0); 

424 //          System.out.println("intBgColor=" + intBgColor); 

425 // 

426 // 

427 //          intBgColor = iag.getRGB(0, 0); 

428 //          System.out.println("intBgColor=" + intBgColor); 

429         } catch (Exception e) { 

430   

431             // 发生网络异常 

432             e.printStackTrace(); 

433         } finally {} 

434   

435         // 释放连接   getMethod.releaseConnection();  } 

436         getMethod.releaseConnection(); 

437     } 

438 }


文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/java/javashl/2008426/111563.html
分享到:
评论

相关推荐

    C# 图片识别 图片识别

    在IT领域,图片识别是一项重要的技术,特别是在计算机视觉和人工智能应用中。C#作为Microsoft .NET框架的主要开发语言,提供了丰富的库和工具来实现图片识别功能。本文将深入探讨C#进行图片识别的相关知识点,包括...

    Python 图片识别源码

    在Python编程领域,图片识别是一项重要的技术,广泛应用于图像处理、机器学习以及人工智能等领域。本资源包提供的"Python 图片识别源码"是一份用于学习和实践Python图像识别的实例代码,适合对图像处理感兴趣的...

    Java调用OCR进行图片识别

    Java调用OCR进行图片识别 Java调用OCR进行图片识别是指使用Java语言通过Tesseract-OCR对图片进行识别的技术。下面是相关知识点的详细解释: 一、Tesseract-OCR简介 Tesseract-OCR是一个开源的OCR(Optical ...

    Delphi图片识别实例

    在本Delphi图片识别实例中,开发者通过源代码和生成的程序展示了如何在Delphi环境中实现图像处理和识别功能。Delphi是一种强大的Object Pascal编程工具,以其高效的编译器和丰富的组件库闻名,使得开发图像识别应用...

    阿里云OCR图片识别转EXCEL输出,图片转Excel,身份证识别证件识别,带fastjson包,带Apache包项目直接打包解压导入运行

    阿里云表格识别500次 0元,请自己购买 全网独家,手写程序并测试,完美... ②默认表格图片识别后,excle文件输出到桌面test文件夹,跟图片名一样 IdCardOCR(身份证识别)中直接右键run 身份证识别没有充足时间调试

    matlab图片识别检测

    本项目“matlab图片识别检测”主要关注如何使用MATLAB这一强大的数学计算软件进行图像处理和识别任务。MATLAB不仅提供丰富的图像处理工具箱,而且其强大的编程环境使得图像识别算法的实现变得相对简单。 首先,我们...

    微信小程序图片识别AR叠加模型动作的源码工程

    本工程是开发的微信小程序的图片识别并叠加模型动作的功能,具体使用的是2D Marker识别模式,会将传入的 src (图片的网络/本地地址) 或是 image(image类型资源id,优先使用)作为特征,去识别出三维空间一个平面上...

    C++ OCR图片识别文字

    本篇将深入探讨如何利用C++进行OCR图片识别文字,以及涉及到的关键技术。 首先,我们需要处理的是图像预处理。在本案例中,"霍夫变换直线"是一种图像处理技术,用于检测图像中的直线。霍夫变换是基于概率理论的一种...

    身份证图片识别工具C#【标准版】

    身份证图片识别工具C#【标准版】是一款基于C#编程语言开发的应用程序,主要用于自动识别身份证上的文字信息,包括姓名、性别、出生日期、地址、身份证号码等关键字段。这款工具利用了光学字符识别(OCR)技术,可以...

    python 图片识别源码

    Python图片识别源码是一种用于识别图片中的物体的编程代码。它可以识别图片中的车辆、动物、植物等等,并能够准确地定位物体的位置。 Python图片识别源码有两个主要组件:特征提取和分类模型。在特征提取中,会从...

    基于Java的贝叶斯图片识别并分类的算法

    本项目是关于“基于Java的贝叶斯图片识别并分类的算法”,其核心在于利用贝叶斯定理对图像进行分析,从而实现自动化分类。 首先,我们要理解贝叶斯分类的基本原理。贝叶斯分类是一种统计分类技术,它基于贝叶斯定理...

    Android 实时图片识别

    在Android平台上进行实时图片识别是一项常见的任务,尤其在如今的人工智能和计算机视觉应用中,如人脸识别、物体识别等。本篇文章将详细讲解如何利用Android的API以及OpenCV库实现这一功能。 首先,"Android 实时...

    中草药图片识别数据集,金银花、槐花、枸杞、党参、百合图片数据集.zip

    综上所述,这个“中草药图片识别数据集”为研究者提供了一个宝贵的资源,可用于开发和优化中草药识别系统,这不仅能够推动计算机视觉技术的进步,还能在医疗、医药等领域带来实际的应用价值,比如辅助医生鉴定中草药...

    图片识别样例程序

    标题中的“图片识别样例程序”表明这是一个关于图像处理的应用示例,主要使用Java编程语言实现。这个程序可能包含了图像的识别算法,用于解析、分析和理解图像内容。在计算机视觉领域,图片识别通常涉及机器学习和...

    Java-图片识别技术

    Java图片识别技术是一种基于计算机视觉和机器学习的领域,它主要涉及如何在图像数据中提取特征并进行比较,以便找到相似或匹配的图片。在Java中实现图片识别,通常会用到OpenCV、Tesseract OCR、JavaFX以及深度学习...

    尚书识别 图片识别文字输出

    "尚书识别 图片识别文字输出"是一款高效实用的软件工具,专为用户设计,能够将包含文字的图像转换成可编辑的文本格式。这款工具支持多种图像格式,如常见的JPEG,使得用户在处理大量文字资料时能极大地提高效率,...

    OCR 图片识别.rar

    在“OCR 图片识别.rar”这个压缩包中,我们可以期待找到关于OCR技术的资源或者一个实际的OCR应用工具。通常,这样的压缩包可能包含以下内容: 1. OCR软件:可能是一个安装程序或绿色版OCR软件,用于识别图片中的...

    Java调用OCR进行图片识别[归纳].pdf

    Java 调用 OCR 进行图片识别 Java 调用 OCR 进行图片识别是指使用 Java 语言调用 OCR(Optical Character Recognition,光学字符识别)技术来识别图片中的文字信息。这种技术可以将图片中的文字信息提取出来,并将...

    数字图片识别程序

    【数字图片识别程序】是一种基于神经网络技术的软件应用,主要设计用于自动化处理和解析包含数字的图片,例如常见的网站验证码。在计算机视觉领域,这种技术有着广泛的应用,包括但不限于图像分类、字符识别和模式...

    百度OCR-身份证图片识别源码

    本篇将深入探讨“百度OCR-身份证图片识别源码”这一技术主题,它主要涉及百度OCR技术以及如何利用其进行身份证信息的自动识别。身份证识别在现代社会有着广泛的应用,例如线上实名认证、金融业务办理等,极大地提高...

Global site tag (gtag.js) - Google Analytics