百度OCR文字识别API使用心得===com.baidu.ocr.sdk.exception.SDKError[283604]

异常com.baidu.ocr.sdk.exception.SDKError[283604]App identifier unmatch.错误的packname或bundleId.logId::30309247

本文的案例源码下载地址在这里哦!!!!

https://download.csdn.net/download/pyfysf/10406761

最终实现的效果(识别的有些慢,是由于我的网速原因。-_-)

?

最近有个小项目使用到了OCR技术,顺便到网上搜索了一下,大家都在使用百度的API。所以我就调用了百度的接口。在使用的过程中也是遇到了各种各样的错误。

比如TOKEN ERROR了。等等。

注册登录百度云平台

首先注册百度账号,点击这里跳转到百度API接口首页

?

点击控制台进行登录注册。

?

选择服务,创建应用

?

?

?

?

选择需要包名的朋友看过来 >>>>>https://blog.csdn.net/pyfysf/article/details/86438769

这个AK和SK是需要在代码中使用到的

?

配置SDK,查看文档调用接口。

点击这里进入API文档

?

博主使用的是Android平台的SDK。

根据步骤进行SDK工程配置。

配置完工程之后博主就很惊喜的去调用方法进行写代码了。但是,logcat总是报错。说获取token失败,packname错误或者AK和SK错误。

这里我就很是纳闷。我根本没有设置项目的包名,并且我的AK和SK是正确的。大家有知道解决方法,求大神在评论区指教博主。博主在这里叩谢。

然后经过我查询资料,我选择请求API,从而不去调用百度封装的方法。

查阅API文档。

?

实现代码片段(不提供xml布局文件)

下面将贴一些代码片段。

博主是打开相机拍一张照片进行扫描实现OCR识别文字。百度的API可以接受本地图片的路径,或者网络上的图片URL也可以进行OCR文字扫描。

我用到了百度提供的UI,在SDK里面导入到项目里面就可以了。

 /**
     * 打开相机
     */
    public void openCameraByBaidu() {
        Intent intent = new Intent(GuideActivity.this, CameraActivity.class);
        intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
                FileUtil.getSaveFile(getApplication()).getAbsolutePath());
        intent.putExtra(CameraActivity.KEY_CONTENT_TYPE,
                CameraActivity.CONTENT_TYPE_GENERAL);
        startActivityForResult(intent, OPEN_CAMERA_OK);

    }

拍照之后获取照片的保存路径。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //判断请求码是否是请求打开相机的那个请求码
        if (requestCode == OPEN_CAMERA_OK && resultCode == RESULT_OK) {

            String photoPath = FileUtil.getSaveFile(this).getAbsolutePath();
            checkData(photoPath);
        }
    }

  

核心代码在这里!!

请求百度文字识别API,进行图片OCR识别。我用的是xutils3.0请求的网络。可以使用HTTPConnection发起get请求。

        /**
         * 请求百度API接口,进行获取数据
         *
         * @param filePath
         */
        private void checkData(String filePath) {

            try {

                //把图片文件转换为字节数组
                byte[] imgData = FileUtil.readFileByBytes(filePath);

                //对字节数组进行Base64编码
                String imgStr = Base64Util.encode(imgData);
                final String params = URLEncoder.encode("image", "UTF-8") + "=" + URLEncoder.encode(imgStr, "UTF-8");

                RequestParams entiry = new RequestParams(ConstantValue.BAIDU_TOKEN_URL);

                x.http().get(entiry, new Callback.CommonCallback<String>() {
                    @Override
                    public void onSuccess(final String result) {
                        Gson gson = new Gson();
                        TokenInfo tokenInfo = gson.fromJson(result, TokenInfo.class);

                        final String access_token = tokenInfo.getAccess_token();

                        new Thread() {
                            public void run() {

//
                                public static final String BAIDU_TOKEN_URL
                                        = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + 你在百度控制台创建的AK+ "&client_secret=" +
                                        你在百度控制台创建的SK;

                                String resultStr = HttpUtil.post(ConstantValue.BAIDU_INTER_URL, access_token, params);
                                Log.e("MainActivity", "MainActivity onSuccess()" + resultStr);
                                Message msg = Message.obtain();
                                msg.obj = resultStr;
                                msg.what = PRESER_IMG_OK;
                                handler.sendMessage(msg);
                            }
                        }.start();
                    }
                    @Override
                    public void onError(Throwable ex, boolean isOnCallback) {

                    }
                    @Override
                    public void onCancelled(CancelledException cex) {
                    }
                    @Override
                    public void onFinished() {
                    }
                });
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 

解析数据,官方返回的是一个json串。所以我们进行解析数据

 private static Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case PRESER_IMG_OK:
                    String data = (String) msg.obj;
                    preserData(data);

                    break;
            }
        }
    };

private static void preserData(String data) {

        Gson gson = new Gson();
        WordInfo wordInfo = gson.fromJson(data, WordInfo.class);

        if(wordInfo.getError_code() != null) {
            if (wordInfo.getError_code() == 17 || wordInfo.getError_code() == 19 || wordInfo.getError_code() == 18) {
                Toast.makeText(MyApp.getContext(), "请求量超出限额", Toast.LENGTH_SHORT).show();
                return;
            }

        }

        if (wordInfo.getWords_result() == null || wordInfo.getWords_result_num() < 0 || wordInfo.getWords_result().size() == 0) {
            Toast.makeText(MyApp.getContext(), "文字扫描识别失败,请重试", Toast.LENGTH_SHORT).show();
            return;
        }

        wordInfo.getWords_result() ;//这里面就是扫描出来的数据

    }

  

FileUtil和HttpUtils

public static File getSaveFile(Context context) {
        File file = new File(context.getFilesDir(), "pic.jpg");
        return file;
    }

    /**
     * 根据文件路径读取byte[] 数组
     */
    public static byte[] readFileByBytes(String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new FileNotFoundException(filePath);
        } else {
            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
            BufferedInputStream in = null;

            try {
                in = new BufferedInputStream(new FileInputStream(file));
                short bufSize = 1024;
                byte[] buffer = new byte[bufSize];
                int len1;
                while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
                    bos.write(buffer, 0, len1);
                }

                byte[] var7 = bos.toByteArray();
                return var7;
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException var14) {
                    var14.printStackTrace();
                }

                bos.close();
            }
        }
    }
}

/**
 * http 工具类
 */
public class HttpUtil {

    public static String post(String requestUrl, String accessToken, String params)  {
        try {
            String generalUrl = requestUrl + "?access_token=" + accessToken;
            URL url = new URL(generalUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            // 设置通用的请求属性
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.setUseCaches(false);
            connection.setDoOutput(true);
            connection.setDoInput(true);

            // 得到请求的输出流对象
            DataOutputStream out = new DataOutputStream(connection.getOutputStream());
            out.writeBytes(params);
            out.flush();
            out.close();

            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> headers = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : headers.keySet()) {
                System.out.println(key + "--->" + headers.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = null;
            if (requestUrl.contains("nlp"))
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
            else
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            String result = "";
            String getLine;
            while ((getLine = in.readLine()) != null) {
                result += getLine;
            }
            in.close();
            System.out.println("result:" + result);
            return result;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}

  

Base64Util

/**
 * http 工具类
 */
public class HttpUtil {

    public static String post(String requestUrl, String accessToken, String params)  {
        try {
            String generalUrl = requestUrl + "?access_token=" + accessToken;
            URL url = new URL(generalUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            // 设置通用的请求属性
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.setUseCaches(false);
            connection.setDoOutput(true);
            connection.setDoInput(true);

            // 得到请求的输出流对象
            DataOutputStream out = new DataOutputStream(connection.getOutputStream());
            out.writeBytes(params);
            out.flush();
            out.close();

            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> headers = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : headers.keySet()) {
                System.out.println(key + "--->" + headers.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = null;
            if (requestUrl.contains("nlp"))
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
            else
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
            String result = "";
            String getLine;
            while ((getLine = in.readLine()) != null) {
                result += getLine;
            }
            in.close();
            System.out.println("result:" + result);
            return result;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}

这样就可以实现了。

本文的案例源码下载地址在这里哦!!!!

https://download.csdn.net/download/pyfysf/10406761

有问题可以加博主QQ哦。337081267

本文的案例源码下载地址在这里哦!!!!

https://download.csdn.net/download/pyfysf/10406761

原文地址:https://www.cnblogs.com/upuptop/p/11154593.html

时间: 2024-10-08 19:10:21

百度OCR文字识别API使用心得===com.baidu.ocr.sdk.exception.SDKError[283604]的相关文章

怎么在OCR文字识别软件中安装和启动 OCR文字识别软件 Hot Folder

默认情况下,ABBYY Hot Folder 会与 ABBYY FineReader 12 一起安装到计算机中.(关于ABBYY FineReader 12请参考ABBYY FineReader 12用户新体验) 在自定义安装过程中,如果选择不安装 ABBYY Hot Folder,您可在此后按照以下说明来安装该应用程序:1. 在 Windows 任务栏中,单击开始,然后单击控制面板.2. 单击程序和功能. 注意:如果您使用的是 Windows XP,请单击添加或删除程序.3. 在已安装程序的列

ABBYY FineReader Engine泰比OCR文字识别控件桌面版说明

FineReader Engine用于开发ocr文字识别软件和图片识别软件,提供自己的OCR API, 包括光学字符识别(OCR).智能字符识别(ICR).光标识别(OMR).光学条码识别(OBR).文档图片.PDF转换技术和 图像识别技术. 新的泰比(ABBYY)FineReader Engine 10将使你体会到非同一般的OCR文字识别软件质量和可用性: 选择泰比(ABBYY)FineReader Engine 10,将获得无与伦比的准确性.更高的ocr技术的质量和速度.与众不同的功能性以及

浅析android OCR文字识别

这学期有门课程老师要求用JAVA实现一个OCR文字识别的程序,所以就花了一些时间研究了一下在安卓端如何实现 OCR的引擎是用的开源项目tesseract-ocr 这个安卓版的地址:https://code.google.com/p/tesseract-android-tools/ 但是自己在编译的时候老是出错,于是在网上寻找到了别人编译好安卓可用的tess-two导入到项目中(参考文章地址 http://www.cnblogs.com/hangxin1940/archive/2012/01/13

如何精准实现OCR文字识别?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云计算基础发表于云+社区专栏 前言 2018年3月27日腾讯云云+社区联合腾讯云智能图像团队共同在客户群举办了腾讯云OCR文字识别--智能图像分享活动,活动举办期间用户耐心听分享嘉宾的介绍,并提出了相关的问题,智能图像团队的科学家和工程师也耐心解答可用户的疑问.以下就是活动分享的全部内容. 正文 在日常生活工作中,我们难免会遇到一些问题,比如自己辛辛苦苦写完的资料,好不容易打印出来却发现源文件丢了.难的收集了一些名片,却要很麻烦的

图片转文字很简单,这三款OCR文字识别软件必装

比如要把书上的文字复制下来, 需要照着书一个一个字打,但是如果通过ocr识别软件, 我们就可以直接通过拍照的形式把这些文字截取下来.举个例子:OCR识别之后 10每个人都听命于三个"长官"控制模式必须因时制宜,一药不能治百疾现在让我们来看看人的行为如何被控制或影响.如果你的车子正需要换轮胎,你可能会先到当初买车的经销商那里去看他们提供哪些选择,然后你可能会到其他修车厂作个比较,你还可能会去翻翻消费杂志来个货比三家.但到最后,你只会以一个标准来作决定:你的自身利益.你想要以最低的代价满足

最新OCR文字识别软件提高OCR性能的方法

新一代ABBYY FineReader OCR文字识别软件在处理文件时,能够快速.准确的进行文件扫描和转换,并提供智能工具以增加工作效率,使企业和个人生产力在OCR性能上显着增强至新水平,包括新的黑白模式,提高了文件的处理速度.在精简的文件转换过程中,FineReader可以进一步提高其独特的能力,重建原生的多页文件格式,还支持最流行的格式轻松创建电子图书.此外,它扩展其业界领先的语言支持,使获奖的解决方案可用于新的全球市场. "ABBYY FineReader可以帮助人们在较短的时间内完成事半

精品软件 推荐 ABBYY FineReader 世界排名第一的 OCR 文字识别工具

ABBYY FineReader 是世界排名第一的 OCR 文字识别工具,提供高效和精准的文档识别.数据提取解决方案,支持多国字符和彩色文件识别,主要用于将扫描图像.图片型PDF转化成可编辑的文本. ABBYY FineReader 可以看作是超级无敌的 PDF 转换器,能转换任意类型的 PDF,其他 PDF 转换工具.或清华紫光OCR.尚书七号.汉王OCR等在它面前都可谓是浮云.比较常用的功能为:扫描到 Word.将PDF/图像.图片转换为 Word 文档或者可编辑/可搜索的PDF文档,另外也

ocr文字识别软件ABBYY FineReader介绍

ABBYY是世界文档识别.数据捕获和语言软件技术开发商的领航者.其获奖产品 FineReader OCR 软件可以把静态纸文件和 PDF 文件转换成可编辑可管理的电子文档形式,可以大大节省您的时间和精力. 理想的 OCR (Optical Character Recognition) .PDF 转换应用软件,不但提供高识别率,而且可以精确地保留原始设置和版面布局,可以把静态纸文件和 PDF 文件转换成可管理的电子格式!它可以将通过扫描仪.MFP 或数码相机生成的图像.PDF 文件,进行快速转换为

OCR文字识别软件拆分对页和校正文本方向的教程

在使用ABBYY FineReader Pro for Mac OCR文字识别软件转换文档的时候,如果检测到的已识别文本片段方向错误,或片段的文本反转,表示片段中可能包含大量错误,那么应该怎样正确地识别此类文本呢?本文为大家详细讲解. 要正确识别此类文本: 1.在"图像"窗口中选择含有竖排区域或反转文本的表格单元格. 2.单击主工具栏中的"检查器",然后单击"区域检查器"按钮. 在"文本属性"面板中: ?在"反向&q