地标识别支持识别约 12 万中外著名地标、景点,广泛应用于拍照识图、图片分类等场景
应用场景
拍照识图:将地标识别服务集成到识图APP/小程序中,识别照片中出现的中外著名地标、景点,广泛应用于综合识图场景
图片分类: 集成地标识别服务,实现自动给地标、景点图片打标签并进行分类,适用于旅游类网站/APP和智能相册
接口描述 该请求用于识别地标,即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中的地标识别结果。
请求说明
HTTP 方法: POST
请求 URL: https://aip.baidubce.com/rest/2.0/image-classify/v1/landmark
URL参数: access_token
Header 参数: Content-Type
= application/x-www-form-urlencoded
Body 参数:见下表
参数
是否必选
类型
默认值
说明
image
是
string
-
图像数据,base64
编码,要求 base64
编码后大小不超过 4M,最短边至少 15px
,最长边最大 4096px
, 支持 jpg/png/bmp
格式 。注意:图片需要 base64
编码、去掉编码头后再进行 urlencode
返回说明 返回参数如下表:
字段
是否必选
类型
说明
log_id
是
uint64
请求标识码,随机数,唯一
result
是
dict
识别结果
+landmark
是
string
地标名称,无法识别则返回空字符串
返回示例如下:
{ "log_id" : 3450013152046070669 , "result" : { "landmark" : "狮身人面像" } }
C++ 代码实现调用 这里假设已经将环境配置好了,环境配置的文章可以参考 Windows 下使用 Vcpkg 配置百度 AI 图像识别 C++开发环境(VS2017) 。
为了方便,首先根据返回参数定义了一个结构体,该结构体包括了返回参数中的参数,如下:
struct LandmarkInfo { std::string landmark; void print () { std::cout << std::setw (30 ) << std::setfill ('-' ) << '\n' ; std::cout << "landmark: " << landmark << '\n' ; } };
在 LandmarkInfo
结构体中,定义了一个 print
方法以打印获取的结果。
然后定义了一个类来调用接口并获取结果
class Landmark { public : Landmark (); ~Landmark (); Json::Value request (std::string imgBase64, std::map<std::string, std::string>& options) ; void getResult (LandmarkInfo& result) ; private : Json::Value obj_; std::string url_; std::string filename_; };
类中的私有成员 obj_
表示返回结果对应的 json 对象。url_
表示请求的 url,filename_
表示用于存储 access token
的文件的文件名。
request
函数输入请求图像的 base64 编码以及请求参数,返回一个 json 对象,json 对象中包含请求的结果。
getResult
获取地标识别结果。
完整代码如下
util.h
和 util.cpp
代码参见 (简单调用篇 01) 通用物体和场景识别高级版 - C++ 简单调用
Landmark.h
代码如下:
#pragma once #include "util.h" struct LandmarkInfo { std::string landmark; void print () { std::cout << std::setw (30 ) << std::setfill ('-' ) << '\n' ; std::cout << "landmark: " << landmark << '\n' ; } }; class Landmark { public : Landmark (); ~Landmark (); Json::Value request (std::string imgBase64, std::map<std::string, std::string>& options) ; void getResult (LandmarkInfo& result) ; private : Json::Value obj_; std::string url_; std::string filename_; }; void landmarkTest () ;
Landmark.cpp
代码如下:
#include "Landmark.h" Landmark::Landmark () { filename_ = "tokenKey" ; url_ = "https://aip.baidubce.com/rest/2.0/image-classify/v1/landmark" ; } Landmark::~Landmark () { } Json::Value Landmark::request (std::string imgBase64, std::map<std::string, std::string>& options) { std::string response; Json::Value obj; std::string token; std::string body; mergeHttpPostBody (body, imgBase64, options); std::string url = url_; getHttpPostUrl (url, filename_, token); int status_code = httpPostRequest (url, body, response); if (status_code != CURLcode::CURLE_OK) { obj["curl_error_code" ] = status_code; obj_ = obj; return obj; } generateJson (response, obj); if (obj["error_code" ].asInt () == 110 || obj["error_code" ].asInt () == 111 ) { token = getTokenKey (); writeFile (filename_, token); return request (imgBase64, options); } obj_ = obj; checkErrorWithExit (obj); return obj; } void Landmark::getResult (LandmarkInfo & result) { result.landmark = UTF8ToGB (obj_["result" ]["landmark" ].asString ().c_str ()); } void landmarkTest () { std::cout << "size: " << sizeof (LandmarkInfo) << "\n" ; std::string imgFile = "./images/landmark.png" ; std::string imgBase64; imgToBase64 (imgFile, imgBase64); std::map<std::string, std::string> options; Json::Value obj; Landmark landmarkObj; obj = landmarkObj.request (imgBase64, options); LandmarkInfo result; landmarkObj.getResult (result); result.print (); }
main.cpp
代码如下:
#include "util.h" #include "Landmark.h" #include <stdlib.h> int main () { landmarkTest (); system ("pause" ); return EXIT_SUCCESS; }
运行结果 测试图像