以下内容属于引用复制,但可以回复你的进行问题:
准备工作:在libs下添加 alicloud-Android-apigateway-sdk-1.0.1.jar,commons-codec-1.10-1.jar
在build.gradle添加 compile'com.squareup.okhttp3:okhttp:3.4.1'
在onCreate,或者afterViews初始化API网关
private void initGatewaySdk(){
//初始化API网关
ApiGatewayClient.init(getApplicationContext(), false);
}
调用拍照功能
private void getPhotoCard(){
final String status= Environment.getExternalStorageState();
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
requestPermissions(new String[]{ Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, CAMERA_REQUEST_CODE);
}
if(status.equals(Environment.MEDIA_MOUNTED)){
defaultPhotoAddress= PHOTO_DIR+"/"+ getPhotoName();
PreferenceUtils.modifyStringValueInPreferences(CardActivity.this, Preferences.IMAGE_3, defaultPhotoAddress);
imageUri= Uri.fromFile(new File(defaultPhotoAddress));
Intent intentPhoto= new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//action is capture
intentPhoto.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentPhoto, CAMERA_REQUEST_CODE);
} else{
Toast.makeText(CardActivity.this,"没有sd卡", Toast.LENGTH_SHORT).show();
}
}
可以对照片进行裁剪
private void cropImageUri(Uri desUri, int outputX, int outputY, int requestCode){
Intent intent= new Intent("com.android.camera.action.CROP");
intent.setDataAndType(desUri,"image/*");
intent.putExtra("crop","true");
intent.putExtra("aspectX", 5);
intent.putExtra("aspectY", 3);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, desUri);
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, requestCode);
}
用base64上传照片
private void trygetCardNum(){
if(NetworkUtils.isConnectWithTip(this,"您未连接网络,无法获取数据")){
LoadingUtil.show(this);
String imgBase64="";
try{
defaultPhotoAddress= PreferenceUtils.getStringValueInPreferences(this,证识 Preferences.IMAGE_3);
File file= new File(defaultPhotoAddress);
byte[] content= new byte[(int) file.length()];
FileInputStream finputstream= new FileInputStream(file);
finputstream.read(content);
finputstream.close();
imgBase64= new String(Base64.encodeBase64(content));
// imgBase64= Base64Img.Bitmap2StrByBase64(bitmap);
if(imgBase64!=null||!imgBase64.equals("")){
PreferenceUtils.modifyStringValueInPreferences(CardActivity.this, Preferences.IMAGE_3, null);
}
} catch(IOException e){
e.printStackTrace();
return;
}
//获取服务
RpcService rpcService= ApiGatewayClient.getRpcService();
final ApiRequest apiRequest= new ApiRequest();
//设置请求地址、Path及Method
apiRequest.setAddress("");
apiRequest.setPath("/rest/160601/ocr/ocr_idcard.json");
apiRequest.setMethod(HttpMethod.POST);
//按照文档设置二进制形式Body,身识别身份支持设置Query参数、份证Header参数、进行Form形式Body
apiRequest.setStringBody("{ \"inputs\":[{ \"image\":{ \"dataType\":50,证识\"dataValue\":\""+imgBase64+"\"},\"configure\":{ \"dataType\":50,\"dataValue\":\"{ \\\"side\\\":\\\"face\\\"}\"}}]}");
//设置支持自签等形式的证书,如果服务端证书合法请勿设置该值,身识别身份仅在开发测试或者非常规场景下设置。份证
apiRequest.setTrustServerCertificate(true);
//设置超时
apiRequest.setTimeout(10000);
rpcService.call(apiRequest,进行 new ApiResponseCallback(){
@Override
public void onSuccess(ApiResponse apiResponse){
//处理apiResponse
LoadingUtil.dismiss();
String s= apiResponse.getStringBody();
NumBean result= JSONObject.parseObject(s, NumBean.class);
String dataValue= result.getOutputs().get(0).getOutputValue().getDataValue();
DataValueBean dataValueBean= JSONObject.parseObject(dataValue, DataValueBean.class);
Number= dataValueBean.getNum();
name= dataValueBean.getName();
address= dataValueBean.getAddress();
birth= dataValueBean.getBirth();
nationality= dataValueBean.getNationality();
sex= dataValueBean.getSex();
if(dataValueBean.getError_msg()==null){
runOnUiThread(new Runnable(){
public void run(){
if(Number== null||Number.equals("")||name== null||name.equals("")||address== null||address.equals("")||birth== null||birth.equals("")||sex== null||sex.equals("")){
Toast.makeText(CardActivity.this,"扫描失败,请重试",证识 Toast.LENGTH_LONG).show();
}else{
//扫描成功
}
}
});
}else{
errString= dataValueBean.getError_msg();
runOnUiThread(new Runnable(){
public void run(){
Toast.makeText(CardActivity.this,"扫描失败,请重试",身识别身份 Toast.LENGTH_LONG).show();
}
});
}
}
@Override
public void onException(ApiInvokeException e){
//处理异常
LoadingUtil.dismiss();
runOnUiThread(new Runnable(){
public void run(){
Toast.makeText(CardActivity.this,"扫描失败,请重试",份证 Toast.LENGTH_LONG).show();
}
});
}
});
}
}
附:
public class NumBean implements Serializable{
private List<OutputsBean> outputs;
public List<OutputsBean> getOutputs(){
return outputs;
}
public void setOutputs(List<OutputsBean> outputs){
this.outputs= outputs;
}
public static class OutputsBean{
private String outputLabel;
private OutputMultiBean outputMulti;
private OutputValueBean outputValue;
public String getOutputLabel(){
return outputLabel;
}
public void setOutputLabel(String outputLabel){
this.outputLabel= outputLabel;
}
public OutputMultiBean getOutputMulti(){
return outputMulti;
}
public void setOutputMulti(OutputMultiBean outputMulti){
this.outputMulti= outputMulti;
}
public OutputValueBean getOutputValue(){
return outputValue;
}
public void setOutputValue(OutputValueBean outputValue){
this.outputValue= outputValue;
}
public static class OutputMultiBean{
}
public static class OutputValueBean{
private int dataType;
private String dataValue;
public int getDataType(){
return dataType;
}
public void setDataType(int dataType){
this.dataType= dataType;
}
public String getDataValue(){
return dataValue;
}
public void setDataValue(String dataValue){
this.dataValue= dataValue;
}
}
}
}
public class DataValueBean implements Serializable{
private String address;
private String birth;
private String config_str;
private String error_msg;
private String name;
private String nationality;
private String num;
private String request_id;
private String sex;
private boolean success;
public String getAddress(){
return address;
}
public void setAddress(String address){
this.address= address;
}
public String getBirth(){
return birth;
}
public void setBirth(String birth){
this.birth= birth;
}
public String getConfig_str(){
return config_str;
}
public void setConfig_str(String config_str){
this.config_str= config_str;
}
public String getError_msg(){
return error_msg;
}
public void setError_msg(String error_msg){
this.error_msg= error_msg;
}
public String getName(){
return name;
}
public void setName(String name){
this.name= name;
}
public String getNationality(){
return nationality;
}
public void setNationality(String nationality){
this.nationality= nationality;
}
public String getNum(){
return num;
}
public void setNum(String num){
this.num= num;
}
public String getRequest_id(){
return request_id;
}
public void setRequest_id(String request_id){
this.request_id= request_id;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex= sex;
}
public boolean isSuccess(){
return success;
}
public void setSuccess(boolean success){
this.success= success;
}
}
在AndroidManifest.xml下添加
<meta-data android:name="com.alibaba.apigateway.appKey" android:value=""/>
<meta-data android:name="com.alibaba.apigateway.appSecret" android:value=""/>
证件的OCR识别”就是针对证件类文档进行识别的技术,原理就是利用OCR识别技术,通过拍摄证件图像或者从相册中加载图像,过滤证件的背景底纹干扰,自动分析证件各文字进行字符切分、识别,最后将识别结果按各栏目分别导入到软件的数据库对应的字段当中。推荐安装云脉证件识别,人们就不用再依靠手工输入相关证件信息,可以实现自动识别采集。
云脉OCR证件识别一般包括身份证识别、驾照识别、行驶证识别、车牌识别、驾照副页识别、行驶证副页识别、护照识别、企业三证识别、户口本识别、港澳通行证识别,云脉SaaS平台都能下载上述识别api接口
ocr识别失败是指没有有效的提取图片信息,无法提取证件上的文字信息上传。
OCR识别技术无法保证100%识别成功、识别正确,只能无限接近与100%,这种情况属正常现象,可以选择手动录入,OCR文字识别是指电子设备检查纸上打印的字符,然后用字符识别方法将形状翻译成计算机文字的过程,
对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程,如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,衡量一个OCR系统性能好坏的主要指标有,拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性。
OCR简介:
光学文字识别的概念是在1929年由德国科学家Tausheck最先提出来的,美国科学家Handel也提出了利用技术对文字进行识别的想法,而最早对印刷体汉字识别进行研究的是IBM公司的Casey和Nagy。
早在60、70年代,世界各国就开始有OCR的研究,而研究的初期,多以文字的识别方法研究为主,且识别的文字仅为0至9的数字。以同样拥有方块文字的日本为例,1960年左右开始研究OCR的基本识别理论,初期以数字为对象。
20世纪70年代初,日本的学者开始研究汉字识别,并做了大量的工作,中国在OCR技术方面的研究工作起步较晚,在70年代才开始对数字、英文字母及符号的识别进行研究,70年代末开始进行汉字识别的研究。到1986年汉字识别的研究进入一个实质性的阶段。
研究单位相继推出了中文OCR产品早期的OCR软件,由于识别率及产品化等多方面的因素,未能达到实际要求,由于硬件设备成本高,运行速度慢,也没有达到实用的程度,只有个别部门,如信息部门、新闻出版单位等使用OCR软件。
进入20世纪90年代以后,随着平台式扫描仪的广泛应用,以及我国信息自动化和办公自动化的普及,大大推动了OCR技术的进一步发展,使OCR的识别正确率、识别速度满足了广大用户的要求。
参考资料:增值税发票ocr识别