百度OCR的调用


  现在我抛砖引玉一下,用百度OCR来识别文字中的文本。    首先要去注册一个百度的帐号,这里不说了,我想大家都会。注册帐号后到登陆后,申请相关的API KEY和secret key .这些东西我就不说了,在大家去申请好了。
     现在说一下代码,百度OCR用C代码调用分为两步,第一步是用API KEY和secret key去申请access token。申请代码如下,大家复制一下就好了
static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
        std::string s((char *)ptr, size * nmemb);
        Json::Reader reader;
        Json::Value root;
        reader.parse(s, root);
        access_token_result = root["access_token"].asString();
        return size * nmemb;
}
int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) {
        CURL *curl;
        CURLcode result_code;
        int success;
        curl = curl_easy_init();
        string aa = (access_token_url + "&client_id=" + AK + "&client_secret=" + SK).data();
        if (curl) {
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); //设置问非0表示本次操作为post  
                curl_easy_setopt(curl, CURLOPT_URL,
                        (access_token_url + "&client_id=" + AK + "&client_secret=" + SK).data());

                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
        
                result_code = curl_easy_perform(curl);
                if (result_code != CURLE_OK) {
                        fprintf(stderr, "curl_easy_perform() failed: %s\n",
                                curl_easy_strerror(result_code));
                        success = 1;
                        return success;
                }
                access_token = access_token_result;
                curl_easy_cleanup(curl);
                success = 0;
        }
        else {
                fprintf(stderr, "curl_easy_init() failed.");
                success = 1;
        }
        return success;
}
void mian()
{
        string access_token;
        get_access_token(access_token, "**************", "*************");//第一个参数是记录你申请的access token,第二个是API key ,第三个Secret key

}
这个代码运行完后就在变量access_token里就是我们要申衣的access token,用这个access token就可以进行OCR的调用了。调用代码如下
static size_t OCRcallback(void *ptr, size_t size, size_t nmemb, void *stream) {
        // 获取到的body存放在ptr中,先将其转换为string格式
        general_ocr_result = std::string((char *)ptr, size * nmemb);
        return size * nmemb;
}

int general_ocr(std::string &json_result, const std::string &image_base64, const std::string &access_token) {
        std::string url = general_ocr_url + "?access_token=" + access_token;
        CURL *curl;
        CURLcode result_code;
        int is_success;
        curl = curl_easy_init();
        if (curl) {
                curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); //设置问非0表示本次操作为post  
                curl_easy_setopt(curl, CURLOPT_URL, url.data());
                curl_easy_setopt(curl, CURLOPT_POST, 1);
                curl_httppost *post = NULL;
                curl_httppost *last = NULL;
                curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS, image_base64.data(),
                        CURLFORM_END);
                curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OCRcallback);
                result_code = curl_easy_perform(curl);
                if (result_code != CURLE_OK) {
                        fprintf(stderr, "curl_easy_perform() failed: %s\n",
                                curl_easy_strerror(result_code));
                        is_success = 1;
                        return is_success;
                }
                json_result = general_ocr_result;
                curl_easy_cleanup(curl);
                is_success = 0;
        }
        else {
                fprintf(stderr, "curl_easy_init() failed.");
                is_success = 1;
        }
        return is_success;
}

void mian()
{
        Mat img = imread("1.bmp");

        vector vecImg;                               //Mat 图片数据转换为vector  
        vector vecCompression_params;
        vecCompression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
        vecCompression_params.push_back(90);
        imencode(".bmp", img, vecImg, vecCompression_params);

        string image= Encode(vecImg.data(), vecImg.size());
       string json_result;
      general_ocr(json_result, image, access_token);//第一个参数是返回的识别结果,第二个是图片,第三个是我们刚才申请的access token

}
注:以上代码和百度提供的调用代码不同,百度提供的代码是申请不了access_token和识别文字的。
这样在json_result里就是识别出来的文字,大家去试一下吧!!如果大家实现不了可以联系QQ154482118,我一步一步的告诉你,不过我感觉上边说的很详细了。

你可能感兴趣的:(百度OCR的调用)