package com.kernal.passportreader.sdk;
|
|
import android.content.Context;
|
import android.graphics.ImageFormat;
|
import android.graphics.Rect;
|
import android.graphics.YuvImage;
|
|
import com.kernal.passportreader.sdk.utils.CardScreenUtil;
|
import com.kernal.passportreader.sdk.utils.Devcode;
|
|
import java.io.ByteArrayOutputStream;
|
import java.io.File;
|
import java.io.FileOutputStream;
|
import java.io.IOException;
|
|
import kernal.idcard.android.Frame;
|
import kernal.idcard.android.RecogParameterMessage;
|
import kernal.idcard.android.RecogService;
|
import kernal.idcard.android.ResultMessage;
|
import kernal.idcard.camera.CardOcrRecogConfigure;
|
import kernal.idcard.camera.OcrIdCardRecogParams;
|
|
/**
|
* @author A@H
|
*预览识别线程
|
*/
|
public class OcrRecogTask implements Runnable {
|
private int LoadBufferImage = -1;
|
private int ConfirmSideSuccess = -1;
|
private int CheckPicIsClear = -1;
|
private OcrIdCardRecogParams ocrIdCardRecogParams;
|
private Context context;
|
private int nMainIDX;
|
private int nCropType;
|
private int nSubID;
|
private String picPathString = "";
|
private String HeadJpgPath = "";
|
private String cutPicPath = "";
|
private Frame frame = new Frame();
|
public byte[] data;
|
private int[] NV21Point = new int[4];
|
private boolean isTakePic = false;
|
|
|
private volatile boolean isOpendetectLightspot = false;
|
private int detectLightspot = -2;
|
public static String importPicPath = "";
|
|
public OcrRecogTask(Context context, OcrIdCardRecogParams ocrIdCardRecogParams) {
|
this.context = context;
|
this.ocrIdCardRecogParams = ocrIdCardRecogParams;
|
nMainIDX = CardOcrRecogConfigure.getInstance().nMainId;
|
nSubID = CardOcrRecogConfigure.getInstance().nSubID;
|
nCropType = CardOcrRecogConfigure.getInstance().nCropType;
|
|
}
|
|
public void setnMainIDX(int nMainIDX) {
|
this.nMainIDX = nMainIDX;
|
}
|
|
public OcrRecogTask setData(byte[] data) {
|
this.data = data;
|
return this;
|
}
|
|
public OcrRecogTask setNv21Point(int[] Nv21Point) {
|
NV21Point = Nv21Point;
|
return this;
|
}
|
|
public OcrRecogTask setTakePic(boolean takePic) {
|
isTakePic = takePic;
|
return this;
|
}
|
|
public OcrRecogTask setOpendetectLightspot(boolean opendetectLightspot) {
|
isOpendetectLightspot = opendetectLightspot;
|
return this;
|
}
|
|
@Override
|
public void run() {
|
if (ocrIdCardRecogParams.recogBinder != null) {
|
//拍照识别流程
|
if (isTakePic) {
|
if (RecogService.isRecogByPath) {
|
picPathString = importPicPath;
|
} else {
|
picPathString = CardOcrRecogConfigure.getInstance().savePath.getFullPicPath();
|
RecogService.isRecogByPath = true;
|
saveFullPic(picPathString);
|
}
|
cutPicPath = CardOcrRecogConfigure.getInstance().savePath.getCropPicPath();
|
HeadJpgPath = CardOcrRecogConfigure.getInstance().savePath.getHeadPicPath();
|
ocrIdCardRecogParams.scanICamera.stopPreview();
|
getRecogResult();
|
} else {
|
if (nMainIDX != 3000) {
|
/**
|
* 识别普通证件,视频流识别流程
|
*/
|
//ocrIdCardRecogParams.recogBinder.SetParameter(1, nMainIDX);
|
//设置敏感区域的坐标点
|
ocrIdCardRecogParams.recogBinder.SetROI(NV21Point[0], NV21Point[1], NV21Point[2], NV21Point[3]);
|
//设置图片的旋转的方向
|
if (nCropType == 0) {
|
ocrIdCardRecogParams.recogBinder.SetRotateType(ocrIdCardRecogParams.Orientation);
|
} else {
|
ocrIdCardRecogParams.recogBinder.SetRotateType(0);
|
}
|
//设置视频流识别的方式
|
ocrIdCardRecogParams.recogBinder.SetVideoStreamCropTypeEx(nCropType);
|
//加载图片至核心
|
if (data != null && data.length > 0) {
|
LoadBufferImage = ocrIdCardRecogParams.recogBinder.LoadBufferImageEx(data,
|
ocrIdCardRecogParams.preWidth, ocrIdCardRecogParams.preHeight, 24, 0);
|
}
|
//设置清晰度阈值
|
if (nCropType == 1) {
|
ocrIdCardRecogParams.recogBinder.SetPixClearEx(40);
|
}
|
if (CardOcrRecogConfigure.getInstance().flag != 0) {
|
if (nMainIDX == 5 || nMainIDX == 6) {
|
ocrIdCardRecogParams.recogBinder.SetConfirmSideMethod(1);
|
} else if (nMainIDX == 13 || nMainIDX == 9
|
|| nMainIDX == 10 || nMainIDX == 11 || nMainIDX == 12) {
|
ocrIdCardRecogParams.recogBinder.SetConfirmSideMethod(2);
|
ocrIdCardRecogParams.recogBinder.IsDetectRegionValid(1);
|
} else {
|
if (nMainIDX == 3 || nMainIDX == 2) {
|
ocrIdCardRecogParams.recogBinder.SetConfirmSideMethod(0);
|
ocrIdCardRecogParams.recogBinder.IsDetectRegionValid(1);
|
ocrIdCardRecogParams.recogBinder.IsDetect180Rotate(1);
|
ocrIdCardRecogParams.recogBinder.SetDetectIDCardType(CardOcrRecogConfigure.getInstance().flag);
|
} else {
|
ocrIdCardRecogParams.recogBinder.SetConfirmSideMethod(4);
|
}
|
}
|
}
|
if (LoadBufferImage == 0) {
|
//检测图片的边线
|
ConfirmSideSuccess = ocrIdCardRecogParams.recogBinder
|
.ConfirmSideLineEx(0);
|
if (ConfirmSideSuccess >= 0) {
|
detectLightspot=-2;
|
if (isOpendetectLightspot) {
|
//检测光斑
|
detectLightspot = ocrIdCardRecogParams.recogBinder.DetectLightspot();
|
}
|
//检测图片的清晰度
|
CheckPicIsClear = ocrIdCardRecogParams.recogBinder
|
.CheckPicIsClearEx();
|
}
|
}
|
if (nCropType == 1) {
|
//智能检测边线,获取图片上的四个坐标点
|
ocrIdCardRecogParams.recogBinder.GetFourSideLines(frame);
|
//根据返回的图片的四个坐标点,换算成屏幕上的坐标点(注:屏幕上坐标点=图片上的坐标点*(屏幕的分辨率/图片的分辨率))
|
// WriteUtil.writeLog("竖屏的坐标点,左("+frame.ltStartX+","+frame.ltStartY+")"+
|
// "上("+frame.lbStartX+","+frame.lbStartY+")"+
|
// "右("+frame.rtStartX+","+frame.rtStartY+")"+
|
// "下("+frame.rbStartX+","+frame.rbStartY+")");
|
|
frame.ltStartX = (int) (frame.ltStartX * ocrIdCardRecogParams.scale);
|
frame.ltStartY = (int) (frame.ltStartY * ocrIdCardRecogParams.scale);
|
frame.lbStartX = (int) (frame.lbStartX * ocrIdCardRecogParams.scale);
|
frame.lbStartY = (int) (frame.lbStartY * ocrIdCardRecogParams.scale);
|
frame.rtStartX = (int) (frame.rtStartX * ocrIdCardRecogParams.scale);
|
frame.rtStartY = (int) (frame.rtStartY * ocrIdCardRecogParams.scale);
|
frame.rbStartX = (int) (frame.rbStartX * ocrIdCardRecogParams.scale);
|
frame.rbStartY = (int) (frame.rbStartY * ocrIdCardRecogParams.scale);
|
|
}
|
ocrIdCardRecogParams.scanICamera.UpdateFrame(frame, ConfirmSideSuccess,detectLightspot);
|
//图片加载成功&&检测边线成功&&检测清晰度成功&&没有光斑,进行识别
|
if (LoadBufferImage == 0 && ConfirmSideSuccess >=0
|
&& CheckPicIsClear == 0 && detectLightspot != 0) {
|
picPathString = CardOcrRecogConfigure.getInstance().savePath.getFullPicPath();
|
cutPicPath = CardOcrRecogConfigure.getInstance().savePath.getCropPicPath();
|
if (CardOcrRecogConfigure.getInstance().isSaveHeadPic) {
|
HeadJpgPath = CardOcrRecogConfigure.getInstance().savePath.getHeadPicPath();
|
}
|
RecogService.isRecogByPath = false;
|
getRecogResult();
|
} else {
|
ocrIdCardRecogParams.scanICamera.addPreviewCallBack();
|
}
|
} else {
|
/**
|
* 识别机读码
|
*/
|
ocrIdCardRecogParams.recogBinder.SetROI(NV21Point[0], NV21Point[1], NV21Point[2], NV21Point[3]);
|
if (CardScreenUtil.getScreenOrientation(context) == CardScreenUtil.ORIENTATION_PORTRAIT) {
|
ocrIdCardRecogParams.recogBinder.SetRotateType(1);
|
} else {
|
ocrIdCardRecogParams.recogBinder.SetRotateType(0);
|
}
|
LoadBufferImage = ocrIdCardRecogParams.recogBinder.LoadBufferImageEx(data,
|
ocrIdCardRecogParams.preWidth, ocrIdCardRecogParams.preHeight, 24, 0);
|
if (LoadBufferImage == 0) {
|
ConfirmSideSuccess = ocrIdCardRecogParams.recogBinder.ConfirmSideLineEx(0);
|
if (ConfirmSideSuccess == 1034
|
|| ConfirmSideSuccess == 1033
|
|| ConfirmSideSuccess == 1036) {
|
CheckPicIsClear = ocrIdCardRecogParams.recogBinder.CheckPicIsClearEx();
|
}
|
}
|
boolean isConfirmSuccess = (ConfirmSideSuccess == 1034 || ConfirmSideSuccess == 1033 || ConfirmSideSuccess == 1036)
|
&& CheckPicIsClear == 0;
|
if (isConfirmSuccess) {
|
nMainIDX = ConfirmSideSuccess;
|
picPathString = CardOcrRecogConfigure.getInstance().savePath.getFullPicPath();
|
cutPicPath = CardOcrRecogConfigure.getInstance().savePath.getCropPicPath();
|
getRecogResult();
|
} else {
|
ocrIdCardRecogParams.scanICamera.addPreviewCallBack();
|
}
|
}
|
}
|
} else {
|
ocrIdCardRecogParams.scanICamera.addPreviewCallBack();
|
}
|
}
|
|
public void getRecogResult() {
|
ResultMessage resultMessage;
|
RecogParameterMessage rpm = new RecogParameterMessage();
|
rpm.nTypeLoadImageToMemory = 0;
|
rpm.nMainID = nMainIDX;
|
rpm.nSubID[0] = nSubID;
|
rpm.GetSubID = true;
|
rpm.GetVersionInfo = true;
|
rpm.logo = "";
|
rpm.userdata = "";
|
rpm.sn = "";
|
rpm.authfile = "";
|
rpm.isSaveCut = CardOcrRecogConfigure.getInstance().isSaveCut;
|
rpm.triggertype = 0;
|
rpm.devcode = Devcode.devcode;
|
rpm.isOnlyClassIDCard = true;
|
rpm.isOpenGetThaiFeatureFuction = CardOcrRecogConfigure.getInstance().isOpenGetThaiFeatureFuction;
|
rpm.isOpenIDCopyFuction = CardOcrRecogConfigure.getInstance().isOpenIDCopyFuction;
|
rpm.isSetIDCardRejectType = CardOcrRecogConfigure.getInstance().isSetIDCardRejectType;
|
// rpm.idcardRotateDegree=3;
|
if (nMainIDX == 2) {
|
rpm.isAutoClassify = true;
|
rpm.lpHeadFileName = HeadJpgPath;// save document protrait
|
rpm.lpFileName = picPathString; // If rpm.lpFileName is null, automatic recognition fuction will be executed
|
rpm.cutSavePath = cutPicPath;
|
} else {
|
rpm.lpHeadFileName = HeadJpgPath;// save document protrait
|
rpm.lpFileName = picPathString; // If rpm.lpFileName is null, automatic recognition fuction will be executed.
|
rpm.cutSavePath = cutPicPath;
|
}
|
rpm.isCut = false;
|
try {
|
resultMessage = ocrIdCardRecogParams.recogBinder.getRecogResult(rpm);
|
if (resultMessage.ReturnAuthority == 0
|
&& resultMessage.ReturnInitIDCard == 0
|
&& resultMessage.ReturnLoadImageToMemory == 0
|
&& resultMessage.ReturnRecogIDCard > 0) {
|
|
if (!isTakePic&&CardOcrRecogConfigure.getInstance().isSaveFullPic) {
|
saveFullPic(picPathString);
|
}else if(!CardOcrRecogConfigure.getInstance().isSaveFullPic){
|
deleteFullPic(picPathString);
|
}
|
String[] picPath = {picPathString, cutPicPath, HeadJpgPath};
|
ocrIdCardRecogParams.scanICamera.recogSucessUpdateUi(resultMessage, picPath);
|
} else {
|
//识别返回错误值 非拍照-6 继续预览,拍照-6,finish()掉相机
|
String[] picPath={""};
|
if(!CardOcrRecogConfigure.getInstance().isSaveFullPic){
|
deleteFullPic(picPathString);
|
}else{
|
saveFullPic(picPathString);
|
picPath[0]=picPathString;
|
}
|
ocrIdCardRecogParams.scanICamera.recogErrorUpdateUi(resultMessage,picPath);
|
}
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
} finally {
|
RecogService.isRecogByPath = false;
|
}
|
}
|
|
|
private void deleteFullPic(String picPathString){
|
if(picPathString!=null&&!picPathString.equals("")){
|
File file=new File(picPathString);
|
if(file.exists()){
|
file.delete();
|
}
|
}
|
|
|
}
|
/**
|
* store the full picture
|
*
|
* @param picPathString1
|
*/
|
private void saveFullPic(String picPathString1) {
|
// TODO Auto-generated method stub
|
//store the full picture start
|
YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, ocrIdCardRecogParams.preWidth,
|
ocrIdCardRecogParams.preHeight, null);
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
yuvimage.compressToJpeg(new Rect(0, 0, ocrIdCardRecogParams.preWidth,
|
ocrIdCardRecogParams.preHeight),
|
100, baos);
|
|
FileOutputStream outStream = null;
|
try {
|
outStream = new FileOutputStream(picPathString1);
|
outStream.write(baos.toByteArray());
|
} catch (IOException e) {
|
// TODO Auto-generated catch
|
// block
|
e.printStackTrace();
|
} finally {
|
try {
|
outStream.close();
|
baos.close();
|
} catch (Exception e) {
|
}
|
}
|
}
|
}
|