Android ABBYY识别名片工作但照片失败

Android ABBYY识别名片工作但照片失败,android,abbyy,text-recognition,Android,Abbyy,Text Recognition,当我识别出ABBYY名片上的文字时,它就起作用了。当我试着拍照时,我拍的失败了。它在ABBYY的演示上确实有效,所以它不是我的硬件 有人知道这是为什么吗 我用来拍照的代码: Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUESTCODE_PHOTO); i

当我识别出ABBYY名片上的文字时,它就起作用了。当我试着拍照时,我拍的失败了。它在ABBYY的演示上确实有效,所以它不是我的硬件

有人知道这是为什么吗

我用来拍照的代码:

            Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);  
            startActivityForResult(intent, REQUESTCODE_PHOTO);



    if(requestCode == REQUESTCODE_PHOTO){
        if( resultCode == Activity.RESULT_OK){
            RecognizerManager.recognizeText((Bitmap)data.getExtras().get("data"), this);


        }
    }


public static void recognizeText(final Bitmap bitmap, final RecognitionCallback listener){
        RecognitionConfiguration config = new RecognitionConfiguration();
        config.setRecognitionLanguages(Engine.getInstance().getLanguagesAvailableForOcr());
        config.setRecognitionMode(RecognitionMode.FULL);
        config.setImageProcessingOptions(RecognitionConfiguration.ImageProcessingOptions.FIND_ALL_TEXT);
        RecognitionManager recManager = Engine.getInstance().getRecognitionManager(config);
        try {
            Object o = recManager.recognizeText(bitmap, listener);
            Log.i("RESULT!", o.toString());
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (RecognitionFailedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

我用下面的代码让它工作

在我的认可活动中拍照:

            final File photo = new File( Environment.getExternalStorageDirectory(), genPhotoFileName() );
            RecognizeActivity.this.imageUri = Uri.fromFile( photo );
            Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
                .putExtra( MediaStore.EXTRA_OUTPUT, imageUri );  
            startActivityForResult(intent, REQUESTCODE_PHOTO);

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == REQUESTCODE_PHOTO){
            if( resultCode == Activity.RESULT_OK){
                if(this.imageUri != null){      
                    try{
                        final AssetFileDescriptor assetFileDescriptor =
                            getApplicationContext().getContentResolver().openAssetFileDescriptor(this.imageUri, "r" );
                        long imageFileSize = assetFileDescriptor.getLength();
                        if( imageFileSize == AssetFileDescriptor.UNKNOWN_LENGTH ) {
                            throw new IOException( "UNKNOWN_LENGTH" );
                        }
                        InputStream is = assetFileDescriptor.createInputStream();
                        byte[] imageData = new byte[(int) imageFileSize];
                        is.read( imageData );
                        if(this.bitmap != null){
                            this.bitmap.recycle();
                            this.bitmap = null;
                            System.gc();
                        }
                        this.bitmap = BitmapFactory.decodeByteArray( imageData, 0, (int) imageFileSize, new Options() );
                        RecognizerManager.recognizeText(this.bitmap, this);
                    } catch(Exception e){
                        e.printStackTrace();
                    }
                } else{
                    Log.e("ERROR", "img = null");
                }
            }
        }
    }
我正在回收位图,因为如果我不这样做,我会在拍了几张照片后出现OutOfMemory异常

照片处理:

public static void recognizeText(final Bitmap bitmap, final RecognitionCallback progressListener){
    final RecognitionConfiguration config = new RecognitionConfiguration();

    config.setImageResolution(0);
    config.setImageProcessingOptions( RecognitionConfiguration.ImageProcessingOptions.PROHIBIT_VERTICAL_CJK_TEXT);
    for(RecognitionLanguage e : Engine.getInstance().getLanguagesAvailableForOcr()){
        if(e.equals(RecognitionLanguage.English) || e.equals(RecognitionLanguage.Dutch)){
            final Set<RecognitionLanguage> languages = EnumSet.noneOf( RecognitionLanguage.class );
            languages.add(e);
            config.setRecognitionLanguages(languages);
        }
    }

    RecognitionManager recManager = Engine.getInstance().getRecognitionManager(config);
    try {
        Object o = recManager.recognizeText(bitmap, progressListener);
        Log.i("RESULT!", o.toString());
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (RecognitionFailedException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
publicstaticvoidrecognizetext(最终位图、最终识别回调progressListener){
最终识别配置=新识别配置();
config.setImageResolution(0);
config.setImageProcessingOptions(RecognitionConfiguration.ImageProcessingOptions.Promited\u VERTICAL\u CJK\u TEXT);
对于(识别语言e:Engine.getInstance().getLanguagesAvailableForOcr()){
if(e.equals(RecognitionLanguage.English)| e.equals(RecognitionLanguage.Dutch)){
最终设置语言=EnumSet.noneOf(RecognitionLanguage.class);
增加(e);
config.setRecognitionLanguages(语言);
}
}
RecognitionManager=Engine.getInstance().getRecognitionManager(配置);
试一试{
对象o=recManager.recognizeText(位图、progressListener);
Log.i(“RESULT!”,o.toString());
}捕获(非法状态){
e、 printStackTrace();
}捕获(识别失败异常e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}

如果要在同一活动中实现RecognitionCallback,则应首先实现它,然后调用:recognizeText(this.bitmap,this)而不是RecognizerManager.recognizeText(this.bitmap,this);另外,不要忘记实现所需的3种方法:onPrebuiltWordsInfoReady、onRecognitionProgress、onRotationTypeDetected

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == REQUESTCODE_PHOTO){
            if( resultCode == Activity.RESULT_OK){
                if(this.imageUri != null){      
                    try{
                        final AssetFileDescriptor assetFileDescriptor =
                            getApplicationContext().getContentResolver().openAssetFileDescriptor(this.imageUri, "r" );
                        long imageFileSize = assetFileDescriptor.getLength();
                        if( imageFileSize == AssetFileDescriptor.UNKNOWN_LENGTH ) {
                            throw new IOException( "UNKNOWN_LENGTH" );
                        }
                        InputStream is = assetFileDescriptor.createInputStream();
                        byte[] imageData = new byte[(int) imageFileSize];
                        is.read( imageData );
                        if(this.bitmap != null){
                            this.bitmap.recycle();
                            this.bitmap = null;
                            System.gc();
                        }
                        this.bitmap = BitmapFactory.decodeByteArray( imageData, 0, (int) imageFileSize, new Options() );
                        // CALL recognizeText(this.bitmap, this); instead of RecognizerManager.recognizeText(this.bitmap, this);
                        recognizeText(this.bitmap, this);
                    } catch(Exception e){
                        e.printStackTrace();
                    }
                } else{
                    Log.e("ERROR", "img = null");
                }
            }
        }
    }