JAVA演示阿里云图像识别API,印刷文字识别-营业执照识别

最近有由于需要,我开始接触阿里云的云市场的印刷文字识别-营业执照识别这里我加上了官网的申请说明,只要你有阿里云账号就可以用,前500次是免费的,API说明很简陋,只能做个简单参考。

一、API介绍

JAVA示例:

public static void main(String[] args) {
   String host = "https://dm-58.data.aliyun.com";
   String path = "/rest/160601/ocr/ocr_business_license.json";
   String method = "POST";
   String appcode = "你自己的AppCode";
   Map<String, String> headers = new HashMap<String, String>();
   //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
   headers.put("Authorization", "APPCODE " + appcode);
   //根据API的要求,定义相对应的Content-Type
   headers.put("Content-Type", "application/json; charset=UTF-8");
   Map<String, String> querys = new HashMap<String, String>();
   String bodys = "{\"image\":\"对图片内容进行Base64编码\"}";

   try {
   /**
   * 重要提示如下:
   * HttpUtils请从
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
   * 下载
   *
   * 相应的依赖请参照
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
   */
   HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
   System.out.println(response.toString());
   //获取response的body
   //System.out.println(EntityUtils.toString(response.getEntity()));
   } catch (Exception e) {
   e.printStackTrace();
   }
 }

返回码:

{
  "config_str" : "null\n", #配置字符串信息
  "angle" : float, #输入图片的角度(顺时针旋转),[0, 90, 180,270]
  "reg_num" : string, #注册号,没有识别出来时返回"FailInRecognition"
  "name" : string, #公司名称,没有识别出来时返回"FailInRecognition"
  "type" : string, #公司类型,没有识别出来时返回"FailInRecognition"
  "person" : string, #公司法人,没有识别出来时返回"FailInRecognition"
  "establish_date": string, #公司注册日期(例:证件上为"2014年04月16日",算法返回"20140416")
  "valid_period": string, #公司营业期限终止日期(例:证件上为"2014年04月16日至2034年04月15日",算法返回"20340415")
  #当前算法将日期格式统一为输出为"年月日"(如"20391130"),并将"长期"表示为"29991231",若证件上没有营业期限,则默认其为"长期",返回"29991231"。
  "address" : string, #公司地址,没有识别出来时返回"FailInRecognition"
  "capital" : string, #注册资本,没有识别出来时返回"FailInRecognition"
  "business": string, #经营范围,没有识别出来时返回"FailInRecognition"
  "emblem" : string, #国徽位置[top,left,height,width],没有识别出来时返回"FailInDetection"
  "title" : string, #标题位置[top,left,height,width],没有识别出来时返回"FailInDetection"
  "stamp" : string, #印章位置[top,left,height,width],没有识别出来时返回"FailInDetection"
  "qrcode" : string, #二维码位置[top,left,height,width],没有识别出来时返回"FailInDetection"
  "success" : bool, #识别成功与否 true/false
  "request_id": string
}

购买后,在云市场列表里展示,你可要点击进去查看AppCode等其主要信息(接口调用里需要AppCode)

简单的API介绍,但挺有效了的,唯一不好的就是没有错误返回码的描述,需要自己测试。

二、代码开发

闲话少说,上代码:

AliyunImageRecognitionUtil :阿里云图像识别工具类

package com.casic.cloud.qcy.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import com.alibaba.fastjson.JSONObject;
import com.casic.cloud.qcy.constant.Constants;

import sun.misc.BASE64Encoder;

/**
 * @ClassName: AliyunImageRecognitionUtil
 * @Description: 阿里云图像识别工具类
 * @author: tianpengw
 * @date 2019年3月21日 上午8:49:08
 *
 */
public class AliyunImageRecognitionUtil {

 private static String businessLicenceHost = PropertiesUtil.getProperties("businessLicenceHost");

 private static String businessLicencePath = PropertiesUtil.getProperties("businessLicencePath");

 private static String method = "POST";

 private static String appCode = PropertiesUtil.getProperties("appCode");

 /**
 *
 * @Description: 根据文件全路径识别
 * @author: tianpengw
 * @param imgPath
 * @return
 */
 public static Map<String,Object> bussinessLicenceRecognition(String imgPath){
 Map<String,Object> resultMap = new HashMap<String,Object>();

 Map<String, String> headers = new HashMap<String, String>();
 //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
   headers.put("Authorization", "APPCODE " + appCode);
   headers.put("Content-Type", "application/json; charset=UTF-8");

   Map<String, String> querys = new HashMap<String, String>();
   String bodys = "{\"image\":\""+imageToBase64Str(imgPath)+"\"}";
   try {
   /**
   * 重要提示如下:
   * HttpUtils请从
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
   * 下载
   *
   * 相应的依赖请参照
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
   */
   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
   String resStr = EntityUtils.toString(response.getEntity());
   System.out.println(resStr);

   resultMap = JSONObject.parseObject(resStr, Map.class);
   //获取response的body
   } catch (Exception e) {
   e.printStackTrace();
   }
   return resultMap;
 }

 /**
 *
 * @Description: 根据InputStream识别
 * @author: tianpengw
 * @param imgPath
 * @return
 */
 public static Map<String,Object> bussinessLicenceRecognition(InputStream inputStream){
 Map<String,Object> resultMap = new HashMap<String,Object>();

 Map<String, String> headers = new HashMap<String, String>();
 //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
   headers.put("Authorization", "APPCODE " + appCode);
   headers.put("Content-Type", "application/json; charset=UTF-8");

   Map<String, String> querys = new HashMap<String, String>();
   // 加密
   BASE64Encoder encoder = new BASE64Encoder();
   byte[] data = null;
   try {
    data = new byte[inputStream.available()];
    inputStream.read(data);
    inputStream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
   String bodys = "{\"image\":\""+encoder.encode(data)+"\"}";
   try {
   /**
   * 重要提示如下:
   * HttpUtils请从
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
   * 下载
   *
   * 相应的依赖请参照
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
   */
   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
   String resStr = EntityUtils.toString(response.getEntity());
   System.out.println(resStr);

   resultMap = JSONObject.parseObject(resStr, Map.class);
   resultMap.put("errCode", Constants.RESULT_SUCCESS);
   //获取response的body
   } catch (Exception e) {
   e.printStackTrace();
   resultMap.put("errCode", Constants.RESULT_FAIL);
   }
   return resultMap;
 }

 /**
 *
 * @Description: 根据byte[]识别
 * @author: tianpengw
 * @param imgPath
 * @return
 */
 public static Map<String,Object> bussinessLicenceRecognition( byte[] data){
 Map<String,Object> resultMap = new HashMap<String,Object>();

 Map<String, String> headers = new HashMap<String, String>();
 //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
   headers.put("Authorization", "APPCODE " + appCode);
   headers.put("Content-Type", "application/json; charset=UTF-8");

   Map<String, String> querys = new HashMap<String, String>();
   // 加密
   BASE64Encoder encoder = new BASE64Encoder();

   String bodys = "{\"image\":\""+encoder.encode(data)+"\"}";
   try {
   /**
   * 重要提示如下:
   * HttpUtils请从
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
   * 下载
   *
   * 相应的依赖请参照
   * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
   */
   HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
   String resStr = EntityUtils.toString(response.getEntity());
   System.out.println(resStr);

   resultMap = JSONObject.parseObject(resStr, Map.class);
   resultMap.put("errCode", Constants.RESULT_SUCCESS);
   //获取response的body
   } catch (Exception e) {
   e.printStackTrace();
   resultMap.put("errCode", Constants.RESULT_FAIL);
   }
   return resultMap;
 }

 /**
  * 图片转base64字符串
  * @param imgFile 图片路径
  * @return
  */
  public static String imageToBase64Str(String imgFile) {
   InputStream inputStream = null;
   byte[] data = null;
   try {
    inputStream = new FileInputStream(imgFile);
    data = new byte[inputStream.available()];
    inputStream.read(data);
    inputStream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
   // 加密
   BASE64Encoder encoder = new BASE64Encoder();
   return encoder.encode(data);
  }

  public static void main(String[] args) {
 String imgPath = "d:/yyzznew1.jpg";
 Map<String,Object> map = AliyunImageRecognitionUtil.bussinessLicenceRecognition(imgPath);
 System.out.println(map.get("person"));
 System.out.println(map.get("reg_num"));
 }
}

AliyunHttpUtils :阿里云httpUtils

package com.casic.cloud.qcy.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

/**
 * @ClassName: AliyunHttpUtils
 * @Description:
 * @author: tianpengw
 * @date 2019年3月21日 上午8:44:51
 *
 */
public class AliyunHttpUtils {

 /**
 * get
 *
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @return
 * @throws Exception
 */
 public static HttpResponse doGet(String host, String path, String method,
  Map<String, String> headers,
  Map<String, String> querys)
      throws Exception {
   HttpClient httpClient = wrapClient(host);

   HttpGet request = new HttpGet(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }

    return httpClient.execute(request);
  }

 /**
 * post form
 *
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param bodys
 * @return
 * @throws Exception
 */
 public static HttpResponse doPost(String host, String path, String method,
  Map<String, String> headers,
  Map<String, String> querys,
  Map<String, String> bodys)
      throws Exception {
   HttpClient httpClient = wrapClient(host);

   HttpPost request = new HttpPost(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }

    if (bodys != null) {
      List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();

      for (String key : bodys.keySet()) {
        nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
      }
      UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
      formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
      request.setEntity(formEntity);
    }

    return httpClient.execute(request);
  } 

 /**
 * Post String
 *
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param body
 * @return
 * @throws Exception
 */
 public static HttpResponse doPost(String host, String path, String method,
  Map<String, String> headers,
  Map<String, String> querys,
  String body)
      throws Exception {
   HttpClient httpClient = wrapClient(host);

   HttpPost request = new HttpPost(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }

    if (StringUtils.isNotBlank(body)) {
     request.setEntity(new StringEntity(body, "utf-8"));
    }

    return httpClient.execute(request);
  }

 /**
 * Post stream
 *
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param body
 * @return
 * @throws Exception
 */
 public static HttpResponse doPost(String host, String path, String method,
  Map<String, String> headers,
  Map<String, String> querys,
  byte[] body)
      throws Exception {
   HttpClient httpClient = wrapClient(host);

   HttpPost request = new HttpPost(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }

    if (body != null) {
     request.setEntity(new ByteArrayEntity(body));
    }

    return httpClient.execute(request);
  }

 /**
 * Put String
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param body
 * @return
 * @throws Exception
 */
 public static HttpResponse doPut(String host, String path, String method,
  Map<String, String> headers,
  Map<String, String> querys,
  String body)
      throws Exception {
   HttpClient httpClient = wrapClient(host);

   HttpPut request = new HttpPut(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }

    if (StringUtils.isNotBlank(body)) {
     request.setEntity(new StringEntity(body, "utf-8"));
    }

    return httpClient.execute(request);
  }

 /**
 * Put stream
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @param body
 * @return
 * @throws Exception
 */
 public static HttpResponse doPut(String host, String path, String method,
  Map<String, String> headers,
  Map<String, String> querys,
  byte[] body)
      throws Exception {
   HttpClient httpClient = wrapClient(host);

   HttpPut request = new HttpPut(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }

    if (body != null) {
     request.setEntity(new ByteArrayEntity(body));
    }

    return httpClient.execute(request);
  }

 /**
 * Delete
 *
 * @param host
 * @param path
 * @param method
 * @param headers
 * @param querys
 * @return
 * @throws Exception
 */
 public static HttpResponse doDelete(String host, String path, String method,
  Map<String, String> headers,
  Map<String, String> querys)
      throws Exception {
   HttpClient httpClient = wrapClient(host);

   HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
    for (Map.Entry<String, String> e : headers.entrySet()) {
     request.addHeader(e.getKey(), e.getValue());
    }

    return httpClient.execute(request);
  }

 private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
   StringBuilder sbUrl = new StringBuilder();
   sbUrl.append(host);
   if (!StringUtils.isBlank(path)) {
   sbUrl.append(path);
    }
   if (null != querys) {
   StringBuilder sbQuery = new StringBuilder();
     for (Map.Entry<String, String> query : querys.entrySet()) {
     if (0 < sbQuery.length()) {
      sbQuery.append("&");
     }
     if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
      sbQuery.append(query.getValue());
        }
     if (!StringUtils.isBlank(query.getKey())) {
      sbQuery.append(query.getKey());
      if (!StringUtils.isBlank(query.getValue())) {
      sbQuery.append("=");
      sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
      }
        }
     }
     if (0 < sbQuery.length()) {
     sbUrl.append("?").append(sbQuery);
     }
    }

   return sbUrl.toString();
  }

 private static HttpClient wrapClient(String host) {
 HttpClient httpClient = new DefaultHttpClient();
 if (host.startsWith("https://")) {
  sslClient(httpClient);
 }

 return httpClient;
 }

 private static void sslClient(HttpClient httpClient) {
    try {
      SSLContext ctx = SSLContext.getInstance("TLS");
      X509TrustManager tm = new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
          return null;
        }
        public void checkClientTrusted(X509Certificate[] xcs, String str) {

        }
        public void checkServerTrusted(X509Certificate[] xcs, String str) {

        }
      };
      ctx.init(null, new TrustManager[] { tm }, null);
      SSLSocketFactory ssf = new SSLSocketFactory(ctx);
      ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
      ClientConnectionManager ccm = httpClient.getConnectionManager();
      SchemeRegistry registry = ccm.getSchemeRegistry();
      registry.register(new Scheme("https", 443, ssf));
    } catch (KeyManagementException ex) {
      throw new RuntimeException(ex);
    } catch (NoSuchAlgorithmException ex) {
     throw new RuntimeException(ex);
    }
  }
}

PropertiesUtil :读取配置文件工具

package com.casic.cloud.qcy.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * @ClassName: PropertiesUtil
 * @Description:
 * @author tianpengw
 * @date 2018年6月27日 下午3:09:08
 *
 */
public class PropertiesUtil {

 private static Logger log = LogManager.getLogger(PropertiesUtil.class);

 private static Properties prop;

 static{
 try{
  if(null == prop){
  prop = new Properties();
  }
  InputStream fis = null;
  fis = ClassLoaderUtils.getResourceAsStream("common.properties", PropertiesUtil.class);
  if(fis!=null){
  prop.load(fis);// 将属性文件流装载到Properties对象中
  fis.close();// 关闭流
  }
 }catch (Exception e) {
  log.error("读取配置文件出错:" + e );
 }
 }

 /**
 *
 * @Description: 根据key获取配置的值
 * @author tianpengw
 * @param key
 * @return
 */
 public static String getProperties(String key){
 if(key==null) return null;
 return prop.getProperty(key);

 }

 /**
 *
 * @Description:
 * @author tianpengw
 * @param proper 读取配置的文件名称
 * @param key
 * @return
 */
 public static String getPropertie(String resourceName,String key){
 InputStream fis = ClassLoaderUtils.getResourceAsStream(resourceName, PropertiesUtil.class);
 if(fis!=null){
  try {
  prop.load(fis);
  fis.close();// 关闭流
  } catch (IOException e) {
  e.printStackTrace();
  }  

 }
 if(key==null) return null;
 return prop.getProperty(key);
 }

 /**
 *
 * @Description: 根据key获取配置的值,若没有,则取传过来的默认的值
 * @author tianpengw
 * @param key
 * @param defaultValue 默认值
 * @return
 */
 public static String getProperties(String key,String defaultValue){
 if(key==null) return null;
 return prop.getProperty(key, defaultValue);

 }
}

配置文件common.properties(放在 src/main/resources下)

#aliyun business licence recognition
businessLicenceHost = https://dm-58.data.aliyun.com
businessLicencePath = /rest/160601/ocr/ocr_business_license.json
appCode = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

三、测试结果

成功的结果:

失败结果,当处理非营业执照的图片时将会返回“invalid business licence”结果,我这么没有进行判断处理直接按照正确的json解析,所以报错,此处你们可以按照自己需求选择处理逻辑。从这返回结果也看的出该接口做的不合理,返回内容不统一,导致接口使用者,必须知晓各种情况才能做有效的处理,如果此处能返回json串,给错误码那对于调用者来说就方便多了。

四、后记

此API适合一般的营业执照和新的三证合一的营业执照,但是字段获取的含义不同,此处需要注意;
由于API并未列出错误码,在未知的错误情况还包含识别次数不够的时候是报错还是有错误提示(由于条件限制,此情况无法验证);

工具是死的,人是活的,开发需要考虑尽可能多的情况,来保证代码的完善。
至此,工具介绍完毕,欢迎交流。

(0)

相关推荐

  • 基于MATLAB神经网络图像识别的高识别率代码

    MATLAB神经网络图像识别高识别率代码 I0=pretreatment(imread('Z:\data\PictureData\TestCode\SplitDataTest\0 (1).png')); I1=pretreatment(imread('Z:\data\PictureData\TestCode\SplitDataTest\1 (1).png')); I2=pretreatment(imread('Z:\data\PictureData\TestCode\SplitDataTest\

  • iOS通过摄像头图像识别技术分享

    目前的计算机图像识别,透过现象看本质,主要分为两大类: 1.基于规则运算的图像识别,例如颜色形状等模板匹配方法 2.基于统计的图像识别.例如机器学习ML,神经网络等人工智能方法 **区别:**模板匹配方法适合固定的场景或物体识别,机器学习方法适合大量具有共同特征的场景或物体识别. **对比:**无论从识别率,准确度,还是适应多变场景变换来讲,机器学习ML都是优于模板匹配方法的:前提你有大量的数据来训练分类器.如果是仅仅是识别特定场景.物体或者形状,使用模板匹配方法更简单更易于实现. **目标:*

  • python实现识别手写数字 python图像识别算法

    写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且因为在编写的过程中,把前面的一些逻辑也修改了一些,将其变得更完善了,所以一切以本篇的为准.当然,如果想要直接看代码,代码全部放在我的GitHub中,所以这篇文章主要负责讲解,如需代码请自行前往GitHub. 本次大纲 上一次写到了数据库的建立,我们能够实时的将更新的训练图片存入CSV文件中.所以这次继续往下走,该轮到识别图片的内容了. 首先我们需要从文件夹中

  • PHP图像识别技术原理与实现

    其实图像识别技术与我们平时做的密码验证之类的没有什么区别,都是事先把要校验的数据入库,然后使用时将录入(识别)的数据与库中的数据做对比,只不过图像识别技术有一部分的容错性,而我们平时的密码验证是要100%匹配. 前几天,有朋友谈到做游戏点击抽奖,识别图片中的文字,当时立马想到的就是js控制或者flash做遮罩层,感觉这种办法是最方便快捷效果好,而且节省服务器资源,但是那边提的要求竟然是通过php识别图像中的文字. 赶巧那两天的新闻有:1.马云人脸识别支付:2.12306使用新的验证码,说什么现在

  • python自动截取需要区域,进行图像识别的方法

    实例如下所示: import os os.chdir("G:\Python1\Lib\site-packages\pytesser") from pytesser import * from pytesseract import image_to_string from PIL import Image from PIL import ImageGrab #截图,获取需要识别的区域 x = 345 y = 281 m = 462 n = 327 k = 54 for i in rang

  • python实现图像识别功能

    本文实例为大家分享了python实现图像识别的具体代码,供大家参考,具体内容如下 #! /usr/bin/env python from PIL import Image import pytesseract url='img/denggao.jpeg' image=Image.open(url) #image=image.convert('RGB') # RGB image=image.convert('L') # 灰度 image.load() text=pytesseract.image_

  • 用Python进行简单图像识别(验证码)

    这是一个最简单的图像识别,将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt文件中 #-*-encoding:utf-8-*- import pytesseract from PIL import Image class GetImageDate(object): def m(self): image = Image.open(u"C:\\a.png") text

  • C#图像识别 微信跳一跳机器人

    更新 GitHub中所有类库的源码已经转换为C#版本. 准备 IDE:VisualStudio Language:C#/VB.NET GitHub:AutoJump.NET 本文将向你介绍一种通过图像识别实现"跳一跳"机器人的方法. 第一节 图像识别 文中提到的所有方法和步骤只涉及简单的向量计算. 需要用到哪些计算? 比较像素点的颜色 求向量集合的中心 计算颜色的相似度 一个RGB颜色可以看作一个三维向量 比较两个颜色的相似度可以计算它们的欧几里得距离 也可以直接比较它们的夹角:夹角越

  • Node Puppeteer图像识别实现百度指数爬虫的示例

    之前看过一篇脑洞大开的文章,介绍了各个大厂的前端反爬虫技巧,但也正如此文所说,没有100%的反爬虫方法,本文介绍一种简单的方法,来绕过所有这些前端反爬虫手段. 下面的代码以百度指数为例,代码已经封装成一个百度指数爬虫node库: https://github.com/Coffcer/baidu-index-spider note: 请勿滥用爬虫给他人添麻烦 百度指数的反爬虫策略 观察百度指数的界面,指数数据是一个趋势图,当鼠标悬浮在某一天的时候,会触发两个请求,将结果显示在悬浮框里面: 按照常规

  • 微信跳一跳python辅助软件思路及图像识别源码解析

    本文将梳理github上最火的wechat_jump_game的实现思路,并解析其图像处理部分源码 首先废话少说先看效果 核心思想 获取棋子到下一个方块的中心点的距离 计算触摸屏幕的时间 点击屏幕 重要方法 计算棋子到下一个方块中心点的距离 使用 adb shell screencap -p 命令获取手机当前屏幕画面 再通过图像上的信息找出棋子的坐标和下一个方块中心点的坐标 然后通过两点间距离公式计算出距离 计算触摸屏幕的时间 T=A * S 其中S为上步算出的像素距离,T为按压时间(ms),A

  • 如何制作一个Node命令行图像识别工具

    从 0 开始制作一个 NodeJS 命令行验证码识别工具.实现如下效果. 初始化项目 # 创建 recognition 项目 mkdir recognition cd recognition npm init -y # 安装主依赖 yarn add images tesseract.js # 安装工具依赖 yarn add chalk yargs # 可选依赖 yarn add socks5-http-client 依赖说明 images:Node.js 轻量级跨平台图像编码库,用于处理下载下来

随机推荐