|
本帖最后由 兔子君 于 2017-7-2 13:32 编辑
好多写辅Zhu的朋友都知道,大漠的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<uchar> vecImg; //Mat 图片数据转换为vector<uchar>
vector<int> 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,我一步一步的告诉你,不过我感觉上边说的很详细了。
当然大漠的后的功能都可以用C来实现,如鼠标键盘的操作(当然的推荐大家用硬件来操作),查图,找图等,以后我再开贴一一说明吧 |
|
|