1. 程式人生 > >Android 使用百度雲文字識別之實現通用文字識別

Android 使用百度雲文字識別之實現通用文字識別

今天給小夥伴們帶來的是如何使用百度雲api實現文字識別功能。

先上截圖

首介面,demo比較簡單

拍照

識別圖片內容

這就是整個demo的執行效果。

接下來我們看下專案結構,比較簡單整潔

接下來我大致說一下實現過程

首先我們需要去百度雲開放平臺註冊我們的開發者賬號

註冊地址

然後下載官方android sdk

接著我們需要在百度雲控制檯建立我們自己的運用

然後解壓我們下載的sdk

  1. (必須)將下載包libs目錄中的ocr-sdk.jar檔案拷貝到工程libs目錄中,並加入工程依賴。
  2. (必須)將libs目錄下armeabi,arm64-v8a,armeabi-v7a,x86資料夾按需新增到android studio工程src/main/jniLibs
    目錄中, eclipse使用者預設為libs目錄。

接下來開始寫我們的程式碼

首先在我們的MainActivity裡面初始化我們的orc,獲取token

/**
     * 用明文ak,sk初始化
     */
    private void initAccessTokenWithAkSk() {
        OCR.getInstance(this).initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
            @Override
            public void onResult(AccessToken result) {
                String token = result.getAccessToken();
                hasGotToken = true;
            }

            @Override
            public void onError(OCRError error) {
                error.printStackTrace();
                alertText("AK,SK方式獲取token失敗", error.getMessage());
            }
        }, getApplicationContext(),  "請填入您的AK", "請填入您的SK");
    }

這裡的ak和sk就是我們在控制檯建立運用的ak和sk

然後就是點選拍照按鈕

 btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                File outputImage = new File(Environment.getExternalStorageDirectory(),
                        "tempImage" + ".jpg");
                try {
                    if (outputImage.exists()) {
                        outputImage.delete();
                    }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                imageUri = Uri.fromFile(outputImage);
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, TAKE_PHOTO);
            }
        });

回撥拍照後的圖片

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    Intent intent = new Intent("com.android.camera.action.CROP");
                    intent.setDataAndType(imageUri, "image/*");
                    intent.putExtra("scale", true);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    Currency();
//                    startActivityForResult(intent, CROP_PHOTO); // 啟動裁剪程式

                }
                break;
            case CROP_PHOTO:
                if (resultCode == RESULT_OK) {
                    try {
                         bitmap = BitmapFactory.decodeStream(getContentResolver()
                                .openInputStream(imageUri));
                        Currency();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
        }
    }

最後一步,也是最核心的一步了。解析圖片進行文字識別

public void Currency(){
       final StringBuffer sb=new StringBuffer();
        // 通用文字識別引數設定
        GeneralBasicParams param = new GeneralBasicParams();
        param.setDetectDirection(true);
        String str=getRealFilePath(this,imageUri);
        Log.e("TGA",str+"------str-------------");
        param.setImageFile(new File(getRealFilePath(this,imageUri)));

// 呼叫通用文字識別服務
        OCR.getInstance(this).recognizeGeneralBasic(param, new OnResultListener<GeneralResult>() {
            @Override
            public void onResult(GeneralResult result) {
                // 呼叫成功,返回GeneralResult物件
                for (WordSimple wordSimple : result.getWordList()) {
                    // wordSimple不包含位置資訊
                    sb.append(wordSimple.getWords());
                    sb.append("\n");
                }
                txt.setText(sb.toString());
                // json格式返回字串
//                listener.onResult(result.getJsonRes());
            }
            @Override
            public void onError(OCRError error) {
                // 呼叫失敗,返回OCRError物件
            }
        });
    }

至此,整個專案的講解已結束,感謝大家支援。