地标识别支持识别约 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; } 
运行结果 测试图像