diff --git a/src/aip-cpp-sdk/base/base.h b/src/aip-cpp-sdk/base/base.h new file mode 100755 index 0000000000000000000000000000000000000000..42ca6528d0854b6d572a847ce4e72d96deb9fb9c --- /dev/null +++ b/src/aip-cpp-sdk/base/base.h @@ -0,0 +1,247 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ +#ifndef __AIP_BASE_H__ +#define __AIP_BASE_H__ + +#include +#include +#include "http.h" +#include "json/json.h" +#include "base64.h" +#include "curl/curl.h" +#include "utils.h" + +namespace aip { + + static const char* AIP_SDK_VERSION = "0.8.5"; + static const char* CURL_ERROR_CODE = "curl_error_code"; + static const std::string ACCESS_TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token"; + static const std::map null; + enum class VECTOR_JOIN_TYPE {BASE64, URL}; + + class AipBase + { + private: + std::string _app_id; + int _expired_time; + bool _is_bce; + std::string _scope; + + std::string vector_join(const std::vector & v_images, VECTOR_JOIN_TYPE type) { + std::string images; + for (size_t i = 0; i < v_images.size(); i++) + { + std::string image = v_images[i]; + switch (type) { + case VECTOR_JOIN_TYPE::BASE64: + images += base64_encode(image.c_str(), (int) image.size()); + break; + case VECTOR_JOIN_TYPE::URL: + char* url = curl_escape(image.c_str(), (int) image.size()); + images += url; + curl_free(url); + break; + } + if (i < v_images.size() - 1) { + images += ","; + } + + } + return images; + } + + + protected: + std::string getAccessToken() + { + time_t now = time(NULL); + + if (!access_token.empty() && now < this->_expired_time - 60 * 60 * 24) + { + return this->access_token; + } + + std::string response; + std::map params; + + params["grant_type"] = "client_credentials"; + params["client_id"] = this->ak; + params["client_secret"] = this->sk; + int status_code = this->client.get( + ACCESS_TOKEN_URL, + ¶ms, + nullptr, + &response + ); + + Json::Value obj; + if (status_code != CURLcode::CURLE_OK) { + obj[CURL_ERROR_CODE] = status_code; + return obj.toStyledString(); + } + + std::string error; + std::unique_ptr reader(crbuilder.newCharReader()); + reader->parse(response.data(), response.data() + response.size(), &obj, &error); + this->access_token = obj["access_token"].asString(); + this->_expired_time = obj["expires_in"].asInt() + (int) now; + this->_scope = obj["scope"].asString(); + return this->access_token; + } + + + + public: + std::string ak; + std::string sk; + HttpClient client; + Json::CharReaderBuilder crbuilder; + std::string access_token; + bool useHttp2; + AipBase(const std::string & app_id, const std::string & ak, const std::string & sk): + _app_id(app_id), + _is_bce(false), + ak(ak), + sk(sk), + useHttp2(false) + { + if (_app_id == "") + { + } + } + void set_use_http2(bool use_http2) + { + this->client.setUseHttp2(use_http2); + } + void set_is_bce() { + _is_bce = true; + } + void setConnectionTimeoutInMillis(int connect_timeout) + { + this->client.setConnectTimeout(connect_timeout); + } + + void setSocketTimeoutInMillis(int socket_timeout) + { + this->client.setSocketTimeout(socket_timeout); + } + + void setDebug(bool debug) + { + this->client.setDebug(debug); + } + + std::string getAk() { + return ak; + } + + std::string vector_join_base64(const std::vector & v_images) { + return vector_join(v_images, VECTOR_JOIN_TYPE::BASE64); + } + + std::string vector_join_url(const std::vector & v_images) { + return vector_join(v_images, VECTOR_JOIN_TYPE::URL); + } + + Json::Value request( + std::string url, + std::map const & params, + std::string const & data, + std::map const & headers, + bool isRetry=false) + { + std::string response; + Json::Value obj; + std::string body; + auto headers_for_sign = headers; + + auto temp_params = params; + + temp_params["charset"] = "UTF-8"; + + this->prepare_request(url, temp_params, headers_for_sign); + + int status_code = this->client.post(url, &temp_params, data, &headers_for_sign, &response); + + if (status_code != CURLcode::CURLE_OK) { + obj[CURL_ERROR_CODE] = status_code; + return obj; + } + + std::string error; + std::unique_ptr reader(crbuilder.newCharReader()); + reader->parse(response.data(), response.data() + response.size(), &obj, &error); + if ((obj["error_code"].asInt() == 110 || obj["error_code"].asInt() == 111) && !isRetry) { + this->access_token = ""; + return request(url, params, data, headers, true); + + } + return obj; + } + + Json::Value request( + std::string url, + std::map const & params, + std::map const & data, + std::map const & headers, + bool isRetry=false) + { + std::string response; + Json::Value obj; + + auto headers_for_sign = headers; + auto temp_params = params; + + this->prepare_request(url, temp_params, headers_for_sign); + + int status_code = this->client.post(url, &temp_params, data, &headers_for_sign, &response); + + if (status_code != CURLcode::CURLE_OK) { + obj[CURL_ERROR_CODE] = status_code; + return obj; + } + + std::string error; + std::unique_ptr reader(crbuilder.newCharReader()); + reader->parse(response.data(), response.data() + response.size(), &obj, &error); + if ((obj["error_code"].asInt() == 110 || obj["error_code"].asInt() == 111) && !isRetry) { + this->access_token = ""; + return request(url, params, data, headers, true); + } + return obj; + } + + void prepare_request(std::string url, + std::map & params, + std::map & headers) + { + + params["aipSdk"] = "C"; + params["aipSdkVersion"] = AIP_SDK_VERSION; + + if (_is_bce) { + std::string method = "POST"; + sign(method, url, params, headers, ak, sk); + } else { + params["access_token"] = this->getAccessToken(); + } + + } + + + }; + +} +#endif diff --git a/src/aip-cpp-sdk/base/base64.h b/src/aip-cpp-sdk/base/base64.h new file mode 100755 index 0000000000000000000000000000000000000000..e0ab6ff0abc1123a29633e9d55c0fa96247f1280 --- /dev/null +++ b/src/aip-cpp-sdk/base/base64.h @@ -0,0 +1,130 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ +#ifndef __AIP_BASE64_H__ +#define __AIP_BASE64_H__ + +#include +#include + +namespace aip { + + static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + + static inline bool is_base64(const char c) + { + return (isalnum(c) || (c == '+') || (c == '/')); + } + + std::string base64_encode(const char * bytes_to_encode, unsigned int in_len) + { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) + { + char_array_3[i++] = *(bytes_to_encode++); + if(i == 3) + { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(i = 0; (i <4) ; i++) + { + ret += base64_chars[char_array_4[i]]; + } + i = 0; + } + } + + if(i) + { + for(j = i; j < 3; j++) + { + char_array_3[j] = '\0'; + } + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(j = 0; (j < i + 1); j++) + { + ret += base64_chars[char_array_4[j]]; + } + + while((i++ < 3)) + { + ret += '='; + } + + } + + return ret; + } + + std::string base64_decode(std::string const & encoded_string) + { + int in_len = (int) encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { + char_array_4[i++] = encoded_string[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = base64_chars.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; + } + +} +#endif diff --git a/src/aip-cpp-sdk/base/http.h b/src/aip-cpp-sdk/base/http.h new file mode 100755 index 0000000000000000000000000000000000000000..28f5b5fe140c804d395a309ceaf6380bf13def44 --- /dev/null +++ b/src/aip-cpp-sdk/base/http.h @@ -0,0 +1,244 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ +#ifndef __AIP_HTTP_H__ +#define __AIP_HTTP_H__ + +#include "curl/curl.h" + +#include +#include +#include +#include + +namespace aip { + + inline size_t onWriteData(void * buffer, size_t size, size_t nmemb, void * userp) + { + std::string * str = dynamic_cast((std::string *)userp); + str->append((char *)buffer, size * nmemb); + return nmemb; + } + + class HttpClient + { + private: + bool debug = false; + bool isHttp2 = false; + int connect_timeout = 10000; + int socket_timeout = 10000; + + void makeUrlencodedForm(std::map const & params, std::string * content) const + { + content->clear(); + std::map::const_iterator it; + for(it=params.begin(); it!=params.end(); it++) + { + char * key = curl_escape(it->first.c_str(), (int) it->first.size()); + char * value = curl_escape(it->second.c_str(),(int) it->second.size()); + *content += key; + *content += '='; + *content += value; + *content += '&'; + curl_free(key); + curl_free(value); + } + } + + void appendUrlParams(std::map const & params, std::string* url) const + { + if(params.empty()) { + return; + } + std::string content; + this->makeUrlencodedForm(params, &content); + bool url_has_param = false; + for (const auto& ch : *url) { + if (ch == '?') { + url_has_param = true; + break; + } + } + if (url_has_param) { + url->append("&"); + } else { + url->append("?"); + } + url->append(content); + } + + void appendHeaders(std::map const & headers, curl_slist ** slist) const + { + std::ostringstream ostr; + std::map::const_iterator it; + for(it=headers.begin(); it!=headers.end(); it++) + { + ostr << it->first << ":" << it->second; + *slist = curl_slist_append(*slist, ostr.str().c_str()); + ostr.str(""); + } + } + + public: + HttpClient() = default; + + HttpClient(const HttpClient &) = delete; + HttpClient & operator=(const HttpClient &) = delete; + + void setConnectTimeout(int connect_timeout) + { + this->connect_timeout = connect_timeout; + } + + void setUseHttp2(bool isUseHttp2) + { + isHttp2 = isUseHttp2; + } + + void setSocketTimeout(int socket_timeout) + { + this->socket_timeout = socket_timeout; + } + + void setDebug(bool debug) + { + this->debug = debug; + } + + int get( + std::string url, + std::map const * params, + std::map const * headers, + std::string * response) const + { + CURL * curl = curl_easy_init(); + struct curl_slist * slist = NULL; + if (headers) { + this->appendHeaders(*headers, &slist); + } + if (params) { + this->appendUrlParams(*params, &url); + } + + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onWriteData); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) response); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, true); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, this->connect_timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, this->socket_timeout); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); + curl_easy_setopt(curl, CURLOPT_VERBOSE, this->debug); + + int status_code = curl_easy_perform(curl); + + curl_easy_cleanup(curl); + curl_slist_free_all(slist); + + return status_code; + } + + int post( + std::string url, + std::map const * params, + const std::string & body, + std::map const * headers, + std::string * response) const + { + struct curl_slist * slist = NULL; + CURL * curl = curl_easy_init(); + if (headers) { + this->appendHeaders(*headers, &slist); + } + if (params) { + this->appendUrlParams(*params, &url); + } + + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist); + curl_easy_setopt(curl, CURLOPT_POST, true); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.c_str()); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, body.size()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, onWriteData); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) response); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, true); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, this->connect_timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, this->socket_timeout); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); + curl_easy_setopt(curl, CURLOPT_VERBOSE, this->debug); + + if (this->isHttp2) { + curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS); + } + + int status_code = curl_easy_perform(curl); + + curl_easy_cleanup(curl); + curl_slist_free_all(slist); + + return status_code; + } + + int post( + std::string url, + std::map const * params, + std::map const & data, + std::map const * headers, + std::string * response) const + { + + std::string body; + this->makeUrlencodedForm(data, &body); + return this->post(std::move(url), params, body, headers, response); + } + + int post( + std::string url, + std::map const * params, + Json::Value const & data, + std::map const * headers, + std::string * response) const + { + std::string body; + Json::StreamWriterBuilder swb; + std::unique_ptr writer(swb.newStreamWriter()); + std::ostringstream os; + writer->write(data, &os); + body = os.str(); + std::map temp_headers; + if (headers) { + std::map temp_headers(*headers); + } + + temp_headers["Content-Type"] = "application/json"; + return this->post(url.c_str(), params, body, &temp_headers, response); + } + + + int post( + std::string url, + std::map const * params, + std::map const * headers, + std::string * response) const + { + const static std::string EMPTY_STRING; + return this->post(std::move(url), params, EMPTY_STRING, headers, response); + } + }; + +} + +#endif diff --git a/src/aip-cpp-sdk/base/utils.h b/src/aip-cpp-sdk/base/utils.h new file mode 100755 index 0000000000000000000000000000000000000000..700eb5c9e42a871dd39dabbc7b29c8106409fba7 --- /dev/null +++ b/src/aip-cpp-sdk/base/utils.h @@ -0,0 +1,283 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ +#ifndef __AIP_UTILS_H__ +#define __AIP_UTILS_H__ + +#include +#include +#include +#include +#include +#include +#include + +const int __BCE_VERSION__ = 1; +const int __BCE_EXPIRE__ = 1800; + +namespace aip { + + template + std::basic_istream& getall(std::basic_istream& input, + std::basic_string& str) { + std::ostringstream oss; + oss << input.rdbuf(); + str.assign(oss.str()); + return input; + } + + inline int get_file_content(const char *filename, std::string* out) { + std::ifstream in(filename, std::ios::in | std::ios::binary); + if (in) { + getall(in, *out); + return 0; + } else { + return -1; + } + } + + inline std::string to_upper(std::string src) + { + std::transform(src.begin(), src.end(), src.begin(), toupper); + return src; + } + + + inline std::string to_lower(std::string src) + { + std::transform(src.begin(), src.end(), src.begin(), tolower); + return src; + } + + inline std::string to_hex(unsigned char c, bool lower = false) + { + const std::string hex = "0123456789ABCDEF"; + + std::stringstream ss; + ss << hex[c >> 4] << hex[c & 0xf]; + + return lower ? to_lower(ss.str()) : ss.str(); + } + + inline time_t now() + { + return time(NULL); + } + + std::string utc_time(time_t timestamp) + { + struct tm result_tm; + char buffer[32]; + +#ifdef _WIN32 + gmtime_s(&result_tm, ×tamp); +#else + gmtime_r(×tamp, &result_tm); +#endif + + size_t size = strftime(buffer, 32, "%Y-%m-%dT%H:%M:%SZ", &result_tm); + + return std::string(buffer, size); + } + + void url_parse( + const std::string & url, + std::map & params) + { + int pos = (int)url.find("?"); + if (pos != -1) + { + int key_start = pos + 1, + key_len = 0, + val_start = 0; + for (int i = key_start; i <= (int)url.size(); ++i) + { + switch (url[i]) + { + case '=': + key_len = i - key_start; + val_start = i + 1; + break; + case '\0': + case '&': + if (key_len != 0) + { + params[url.substr(key_start, key_len)] = url.substr(val_start, i - val_start); + key_start = i + 1; + key_len = 0; + } + break; + default: + break; + } + } + } + } + + std::string url_encode(const std::string & input, bool encode_slash=true) + { + std::stringstream ss; + const char *str = input.c_str(); + + for (uint32_t i = 0; i < input.size(); i++) + { + unsigned char c = str[i]; + if (isalnum(c) || c == '_' || c == '-' || c == '~' || c == '.' || (!encode_slash && c == '/')) + { + ss << c; + } + else + { + ss << "%" << to_hex(c); + } + } + + return ss.str(); + } + + std::string canonicalize_params(std::map & params) + { + std::vector v; + v.reserve(params.size()); + + for (auto & it : params) { + v.push_back(url_encode(it.first) + "=" + url_encode(it.second)); + } + std::sort(v.begin(), v.end()); + + std::string result; + for (auto & it : v) + { + result.append((result.empty() ? "" : "&") + it); + } + return result; + } + + std::string canonicalize_headers(std::map & headers) + { + std::vector v; + v.reserve(headers.size()); + + for (auto & it : headers) { + v.push_back(url_encode(to_lower(it.first)) + ":" + url_encode(it.second)); + } + std::sort(v.begin(), v.end()); + + std::string result; + for (auto & it : v) + { + result.append((result.empty() ? "" : "\n") + it); + } + return result; + } + + std::string get_headers_keys(std::map & headers) + { + std::vector v; + v.reserve(headers.size()); + + for (auto & it : headers) { + v.push_back(to_lower(it.first)); + } + + std::string result; + for (auto & it : v) + { + result.append((result.empty() ? "" : ";") + it); + } + return result; + } + + std::string get_host(const std::string & url) + { + int pos = (int)url.find("://") + 3; + return url.substr( + pos, + url.find('/', pos) - pos + ); + } + + + std::string get_path(const std::string & url) + { + int path_start = (int)url.find('/', url.find("://") + 3); + int path_end = (int)url.find('?'); + path_end = path_end == -1 ? (int)url.size() : path_end; + + return url.substr(path_start, path_end - path_start); + } + + std::string hmac_sha256( + const std::string & src, + const std::string & sk) + { + const EVP_MD *evp_md = EVP_sha256(); + unsigned char md[EVP_MAX_MD_SIZE]; + unsigned int md_len = 0; + + if (HMAC(evp_md, + reinterpret_cast(sk.data()), (int)sk.size(), + reinterpret_cast(src.data()), src.size(), + md, &md_len) == NULL) + { + return ""; + } + + std::stringstream ss; + for (int i = 0; i < (int)md_len; ++i) + { + ss << to_hex(md[i], true); + } + + return ss.str(); + } + + void sign( + std::string method, + std::string & url, + std::map & params, + std::map & headers, + std::string & ak, + std::string & sk) + { + url_parse(url, params); + headers["Host"] = get_host(url); + std::string timestamp = utc_time(now()); + headers["x-bce-date"] = timestamp; + + std::stringstream ss; + ss << "bce-auth-v" << __BCE_VERSION__ << "/" << ak << "/" + << timestamp << "/" << __BCE_EXPIRE__; + + std::string val = ss.str(); + std::string sign_key = hmac_sha256(val, sk); + + ss.str(""); + ss << to_upper(method) << '\n' << url_encode(get_path(url), false) + << '\n' << canonicalize_params(params) + << '\n' << canonicalize_headers(headers); + + std::string signature = hmac_sha256(ss.str(), sign_key); + + ss.str(""); + ss << "bce-auth-v" << __BCE_VERSION__ << "/" << ak << "/" + << timestamp << "/" << __BCE_EXPIRE__ << "/" + << get_headers_keys(headers) << "/" << signature; + + headers["authorization"] = ss.str(); + } + +} + +#endif diff --git a/src/aip-cpp-sdk/body_analysis.h b/src/aip-cpp-sdk/body_analysis.h new file mode 100755 index 0000000000000000000000000000000000000000..605088c89256f9d367ac47d657d2d0d1a26dcc7a --- /dev/null +++ b/src/aip-cpp-sdk/body_analysis.h @@ -0,0 +1,248 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_BODYANALYSIS_H__ +#define __AIP_BODYANALYSIS_H__ + +#include "base/base.h" + +namespace aip { + + class Bodyanalysis: public AipBase + { + public: + + + std::string _body_analysis = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_analysis"; + + std::string _body_attr = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_attr"; + + std::string _body_num = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_num"; + + std::string _gesture = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/gesture"; + + std::string _body_seg = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg"; + + std::string _driver_behavior = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/driver_behavior"; + + std::string _body_tracking = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_tracking"; + + std::string _hand_analysis = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/driver_behavior"; + + + Bodyanalysis(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + /** + * body_analysis + * 对于输入的一张图片(可正常解码,且长宽比适宜),**检测图片中的所有人体,输出每个人体的21个主要关键点,包含头顶、五官、脖颈、四肢等部位,同时输出人体的坐标信息和数量**。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value body_analysis( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_body_analysis, null, data, null); + + return result; + } + + /** + * body_attr + * 对于输入的一张图片(可正常解码,且长宽比适宜),**检测图像中的所有人体并返回每个人体的矩形框位置,识别人体的静态属性和行为,共支持20余种属性,包括:性别、年龄阶段、衣着(含类别/颜色)、是否戴帽子、是否戴眼镜、是否背包、是否使用手机、身体朝向等**。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * type gender,
age,
lower_wear,
upper_wear,
headwear,
glasses,
upper_color,
lower_color,
cellphone,
upper_wear_fg,
upper_wear_texture,
lower_wear_texture,
orientation,
umbrella,
bag,
smoke,
vehicle,
carrying_item,
upper_cut,
lower_cut,
occlusion,
is_human | 1)可选值说明:
gender-性别,
age-年龄阶段,
lower_wear-下身服饰,
upper_wear-上身服饰,
headwear-是否戴帽子,
glasses-是否戴眼镜,
upper_color-上身服饰颜色,
lower_color-下身服饰颜色,
cellphone-是否使用手机,
upper_wear_fg-上身服饰细分类,
upper_wear_texture-上身服饰纹理,
orientation-身体朝向,
umbrella-是否撑伞;
bag-背包,
smoke-是否吸烟,
vehicle-交通工具,
carrying_item-是否有手提物,
upper_cut-上方截断,
lower_cut-下方截断,
occlusion-遮挡,
is_human-是否是正常人体
2)type 参数值可以是可选值的组合,用逗号分隔;**如果无此参数默认输出全部21个属性** + */ + Json::Value body_attr( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_body_attr, null, data, null); + + return result; + } + + /** + * body_num + * 对于输入的一张图片(可正常解码,且长宽比适宜),**识别和统计图像当中的人体个数(静态统计,暂不支持追踪和去重)**。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * area 特定框选区域坐标,支持多个多边形区域,最多支持10个区域,如输入超过10个区域,截取前10个区域进行识别。
**此参数为空或无此参数、或area参数设置错误时,默认识别整个图片的人数** 。
area参数设置错误的示例:某个坐标超过原图大小,x、y坐标未成对出现等;注意:**设置了多个区域时,任意一个坐标设置错误,则认为area参数错误、失效**。
**area参数设置格式**:
1)多个区域用英文分号“;”分隔;
2)同一个区域内的坐标用英文逗号“,”分隔,默认尾点和首点相连做闭合。
示例:
1)单个多边形区域:x1,y1,x2,y2,x3,y3...xn,yn
2)多个多边形区域:xa1,ya1,xa2,ya2,xa3,ya3...xan,yan;xb1,yb1,xb2,yb2,xb3,yb3...xbn,ybn;.. + * show 是否输出渲染的图片,默认不返回,**选true时返回渲染后的图片(base64)**,其它无效值或为空则默认false + */ + Json::Value body_num( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_body_num, null, data, null); + + return result; + } + + /** + * gesture + * 识别图片中的手势类型,返回手势名称、手势矩形框、概率分数,可识别24种常见手势,适用于手势特效、智能家居手势交互等场景**。支持的24类手势列表:拳头、OK、祈祷、作揖、作别、单手比心、点赞、Diss、我爱你、掌心向上、双手比心(3种)、数字(9种)、Rock、竖中指。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value gesture( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_gesture, null, data, null); + + return result; + } + + /** + * body_seg + * 对于输入的一张图片(可正常解码,且长宽比适宜),**识别人体的轮廓范围,与背景进行分离,适用于拍照背景替换、照片合成、身体特效等场景。输入正常人像图片,返回分割后的二值结果图和分割类型(目前仅支持person)** + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * type 可以通过设置type参数,自主设置返回哪些结果图,避免造成带宽的浪费
1)可选值说明:
labelmap - 二值图像,需二次处理方能查看分割效果
scoremap - 人像前景灰度图
foreground - 人像前景抠图,透明背景
2)type 参数值可以是可选值的组合,用逗号分隔;如果无此参数默认输出全部3类结果图 + */ + Json::Value body_seg( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_body_seg, null, data, null); + + return result; + } + + /** + * driver_behavior + * 对于输入的一张车载监控图片(可正常解码,且长宽比适宜),**识别图像中是否有人体(驾驶员),若检测到至少1个人体,则进一步识别属性行为,可识别使用手机、抽烟、未系安全带、双手离开方向盘、视线未朝前方5种典型行为姿态**。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * type smoke,cellphone,
not_buckling_up,
both_hands_leaving_wheel,
not_facing_front |识别的属性行为类别,英文逗号分隔,默认所有属性都识别;
smoke //吸烟,
cellphone //打手机 ,
not_buckling_up // 未系安全带,
both_hands_leaving_wheel // 双手离开方向盘,
not_facing_front // 视角未看前方 + */ + Json::Value driver_behavior( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_driver_behavior, null, data, null); + + return result; + } + + /** + * body_tracking + * 统计图像中的人体个数和流动趋势,主要适用于**低空俯拍、出入口场景,以人体头肩为主要识别目标** + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * @param dynamic true:动态人流量统计,返回总人数、跟踪ID、区域进出人数;
false:静态人数统计,返回总人数 + * options 可选参数: + * case_id 当dynamic为True时,必填;任务ID(通过case_id区分不同视频流,自拟,不同序列间不可重复即可) + * case_init 当dynamic为True时,必填;每个case的初始化信号,为true时对该case下的跟踪算法进行初始化,为false时重载该case的跟踪状态。当为false且读取不到相应case的信息时,直接重新初始化 + * show 否返回结果图(含统计值和跟踪框渲染),默认不返回,选true时返回渲染后的图片(base64),其它无效值或为空则默认false + * area 当dynamic为True时,必填;静态人数统计时,只统计区域内的人,缺省时为全图统计。
动态人流量统计时,进出区域的人流会被统计。
逗号分隔,如‘x1,y1,x2,y2,x3,y3...xn,yn',按顺序依次给出每个顶点的xy坐标(默认尾点和首点相连),形成闭合多边形区域。
服务会做范围(顶点左边需在图像范围内)及个数校验(数组长度必须为偶数,且大于3个顶点)。只支持单个多边形区域,建议设置矩形框,即4个顶点。**坐标取值不能超过图像宽度和高度,比如1280的宽度,坐标值最小建议从1开始,最大到1279**。 + */ + Json::Value body_tracking( + std::string const & image, + std::string const & dynamic, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + data["dynamic"] = dynamic; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_body_tracking, null, data, null); + + return result; + } + + /** + * hand_analysis + * 对于输入的一张图片(可正常解码,且长宽比适宜),检测图片中的手部,输出每只手的坐标框、21个骨节点坐标信息。当前接口主要适用于图片中单个手部的情况,图片中同时存在多个手部时,识别效果可能欠佳。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value hand_analysis( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_hand_analysis, null, data, null); + + return result; + } + + + }; +} +#endif \ No newline at end of file diff --git a/src/aip-cpp-sdk/content_censor.h b/src/aip-cpp-sdk/content_censor.h new file mode 100755 index 0000000000000000000000000000000000000000..749afc1e642c19f19fe2b1b78e04d0ad20e3ec00 --- /dev/null +++ b/src/aip-cpp-sdk/content_censor.h @@ -0,0 +1,215 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_CONTENTCENSOR_H__ +#define __AIP_CONTENTCENSOR_H__ + +#include "base/base.h" + +namespace aip { + + class Contentcensor: public AipBase + { + public: + + + std::string _anti_porn = + "https://aip.baidubce.com/rest/2.0/antiporn/v1/detect"; + + std::string _anti_porn_gif = + "https://aip.baidubce.com/rest/2.0/antiporn/v1/detect_gif"; + + std::string _anti_spam = + "https://aip.baidubce.com/rest/2.0/antispam/v2/spam"; + + + std::string _user_defined_image = + "https://aip.baidubce.com/rest/2.0/solution/v1/img_censor/v2/user_defined"; + + std::string _user_defined_text = + "https://aip.baidubce.com/rest/2.0/solution/v1/text_censor/v2/user_defined"; + + std::string _face_audit = + "https://aip.baidubce.com/rest/2.0/solution/v1/face_audit"; + + std::string _report = + "https://aip.baidubce.com/rpc/2.0/feedback/v1/report"; + + std::string _combo = + "https://aip.baidubce.com/api/v1/solution/direct/img_censor"; + + + Contentcensor(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + + + /** + * anti_porn_gif + * 该请求用于鉴定GIF图片的色情度,对于非gif接口,请使用色情识别接口。接口会对图片中每一帧进行识别,并返回所有检测结果中色情值最大的为结果。目前支持三个维度:色情、性感、正常。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value anti_porn_gif( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_anti_porn_gif, null, data, null); + + return result; + } + + /** + * anti_spam + * + * @param content 文字内容 + * options 可选参数: + */ + Json::Value anti_spam( + std::string const & content, + const std::map & options) + { + std::map data; + + data["content"] = content; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_anti_spam, null, data, null); + + return result; + } + + Json::Value user_defined_image( + std::string const & image_or_url, + std::string const & type, + const std::map & options) + { + std::map data; + + if (type == "image") { + data["image"] = base64_encode(image_or_url.c_str(), (int) image_or_url.size()); + } + if (type == "imgUrl") { + data["imgUrl"] = image_or_url; + } + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_user_defined_image, null, data, null); + + return result; + } + + Json::Value user_defined_text( + std::string const & text, + const std::map & options) + { + std::map data; + + data["text"] = text; + + Json::Value result = + this->request(_user_defined_text, null, data, null); + + return result; + } + + Json::Value combo( + std::string const & image_or_url, + std::string const & type, + std::vector const & scenes, + Json::Value const & scene_conf) + { + Json::Value data; + + if (type == "image") { + data["image"] = base64_encode(image_or_url.c_str(), (int) image_or_url.size()); + } + if (type == "imgUrl") { + data["imgUrl"] = image_or_url; + } + + data["scenes"] = {}; + + for (int i = 0; i < (int) scenes.size(); i++) + { + data["scenes"][i] = scenes[i]; + } + + if (scene_conf != Json::Value::null) { + data["sceneConf"] = scene_conf; + } + + std::map extern_headers; + extern_headers["Content-Type"] = "application/json"; + + Json::Value result = + this->request(_combo, null, data.toStyledString(), extern_headers); + + return result; + } + + + + Json::Value face_audit( + const std::vector image_or_url, + std::string const & type, + const std::map & options) + { + std::map data; + + if (type == "images") { + data["images"] = vector_join_base64(image_or_url); + } + if (type == "imgUrls") { + data["imgUrls"] = vector_join_url(image_or_url); + } + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_face_audit, null, data, null); + + return result; + } + + Json::Value report( + Json::Value const & report) + { + Json::Value param; + param["feedback"] = report; + Json::Value result = + this->request(_report, null, param.toStyledString(), null); + + return result; + } + + + + + }; +} +#endif diff --git a/src/aip-cpp-sdk/easydl.h b/src/aip-cpp-sdk/easydl.h new file mode 100755 index 0000000000000000000000000000000000000000..78b7e6e06cfe6462452de855da7cdbd5e9d923f6 --- /dev/null +++ b/src/aip-cpp-sdk/easydl.h @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_EASYDL_H__ +#define __AIP_EASYDL_H__ + +#include "base/base.h" + +namespace aip { + + class EasyDL: public AipBase + { + public: + + + + EasyDL(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + + Json::Value easydl_request_image( + std::string const & url, + std::string const & image, + const std::map & options) + { + Json::Value data; + + data["image"] = aip::base64_encode(image.c_str(), (int) image.size()); +; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(url, null, data.toStyledString(), null); + + return result; + } + + Json::Value easydl_request_sound( + std::string const & url, + std::string const & sound, + const std::map & options) + { + Json::Value data; + + data["sound"] = aip::base64_encode(sound.c_str(), (int) sound.size()); + ; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(url, null, data.toStyledString(), null); + + return result; + } + + }; +} +#endif diff --git a/src/aip-cpp-sdk/face.h b/src/aip-cpp-sdk/face.h new file mode 100755 index 0000000000000000000000000000000000000000..ad73556e2e2fccac9fb0b8c4ba5a26a7a01a7d1d --- /dev/null +++ b/src/aip-cpp-sdk/face.h @@ -0,0 +1,680 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_FACE_H__ +#define __AIP_FACE_H__ + +#include "base/base.h" + +namespace aip { + + class Face: public AipBase + { + public: + + std::string _detect = + "https://aip.baidubce.com/rest/2.0/face/v3/detect"; + + std::string _search = + "https://aip.baidubce.com/rest/2.0/face/v3/search"; + + std::string _multi_search = + "https://aip.baidubce.com/rest/2.0/face/v3/multi-search"; + + std::string _user_add = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add"; + + std::string _user_update = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/update"; + + std::string _face_delete = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/delete"; + + std::string _user_get = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/get"; + + std::string _face_getlist = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/getlist"; + + std::string _group_getusers = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/getusers"; + + std::string _user_copy = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/copy"; + + std::string _user_delete = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/delete"; + + std::string _group_add = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add"; + + std::string _group_delete = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/delete"; + + std::string _group_getlist = + "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/getlist"; + + std::string _person_verify = + "https://aip.baidubce.com/rest/2.0/face/v3/person/verify"; + + std::string _video_sessioncode = + "https://aip.baidubce.com/rest/2.0/face/v1/faceliveness/sessioncode"; + + + Face(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + + /** + * detect + * **人脸检测**:检测图片中的人脸并标记出位置信息; + + * @param image 图片信息(**总数据大小应小于10M**),图片上传方式根据image_type来判断 + * @param image_type 图片类型
**BASE64**:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
**URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
**FACE_TOKEN**: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。 + * options 可选参数: + * face_field 包括**age,beauty,expression,face_shape,gender,glasses,landmark,landmark72,landmark150,race,quality,eye_status,emotion,face_type信息**
逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度 + * max_face_num 最多处理人脸的数目,默认值为1,仅检测图片中面积最大的那个人脸;**最大值10**,检测图片中面积最大的几张人脸。 + * face_type 人脸的类型 **LIVE**表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等**IDCARD**表示身份证芯片照:二代身份证内置芯片中的人像照片 **WATERMARK**表示带水印证件照:一般为带水印的小图,如公安网小图 **CERT**表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片 默认**LIVE** + * liveness_control 活体检测控制 **NONE**: 不进行控制 **LOW**:较低的活体要求(高通过率 低攻击拒绝率) **NORMAL**: 一般的活体要求(平衡的攻击拒绝率, 通过率) **HIGH**: 较高的活体要求(高攻击拒绝率 低通过率) **默认NONE** + */ + Json::Value detect( + std::string const & image, + std::string const & image_type, + const std::map & options) + { + Json::Value data; + + data["image"] = image; + data["image_type"] = image_type; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_detect, null, data.toStyledString(), null); + + return result; + } + + /** + * search + * * **1:N人脸搜索**:也称为1:N识别,在指定人脸集合中,找到最相似的人脸; +* **1:N人脸认证**:基于uid维度的1:N识别,由于uid已经锁定固定数量的人脸,所以检索范围更聚焦; + +> **1:N人脸识别**与**1:N人脸认证**的差别在于:人脸搜索是在指定人脸集合中进行直接地人脸检索操作,而人脸认证是基于uid,先调取这个uid对应的人脸,再在这个uid对应的人脸集合中进行检索(因为每个uid通常对应的只有一张人脸,所以通常也就变为了1:1对比);实际应用中,人脸认证需要用户或系统先输入id,这增加了验证安全度,但也增加了复杂度,具体使用哪个接口需要视您的业务场景判断。 + + * @param image 图片信息(**总数据大小应小于10M**),图片上传方式根据image_type来判断 + * @param image_type 图片类型
**BASE64**:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
**URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
**FACE_TOKEN**: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。 + * @param group_id_list 从指定的group中进行查找 用逗号分隔,**上限20个** + * options 可选参数: + * max_face_num 最多处理人脸的数目
**默认值为1(仅检测图片中面积最大的那个人脸)** **最大值10** + * match_threshold 匹配阈值(设置阈值后,score低于此阈值的用户信息将不会返回) 最大100 最小0 默认80
**此阈值设置得越高,检索速度将会越快,推荐使用默认阈值`80`** + * quality_control 图片质量控制 **NONE**: 不进行控制 **LOW**:较低的质量要求 **NORMAL**: 一般的质量要求 **HIGH**: 较高的质量要求 **默认 NONE** + * liveness_control 活体检测控制 **NONE**: 不进行控制 **LOW**:较低的活体要求(高通过率 低攻击拒绝率) **NORMAL**: 一般的活体要求(平衡的攻击拒绝率, 通过率) **HIGH**: 较高的活体要求(高攻击拒绝率 低通过率) **默认NONE** + * user_id 当需要对特定用户进行比对时,指定user_id进行比对。即人脸认证功能。 + * max_user_num 查找后返回的用户数量。返回相似度最高的几个用户,默认为1,最多返回50个。 + */ + Json::Value search( + std::string const & image, + std::string const & image_type, + std::string const & group_id_list, + const std::map & options) + { + Json::Value data; + + data["image"] = image; + data["image_type"] = image_type; + data["group_id_list"] = group_id_list; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_search, null, data.toStyledString(), null); + + return result; + } + + /** + * multi_search + * 待识别的图片中,存在多张人脸的情况下,支持在一个人脸库中,一次请求,同时返回图片中所有人脸的识别结果。 + * @param image 图片信息(**总数据大小应小于10M**),图片上传方式根据image_type来判断 + * @param image_type 图片类型
**BASE64**:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
**URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
**FACE_TOKEN**: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。 + * @param group_id_list 从指定的group中进行查找 用逗号分隔,**上限20个** + * options 可选参数: + * max_face_num 最多处理人脸的数目
**默认值为1(仅检测图片中面积最大的那个人脸)** **最大值10** + * match_threshold 匹配阈值(设置阈值后,score低于此阈值的用户信息将不会返回) 最大100 最小0 默认80
**此阈值设置得越高,检索速度将会越快,推荐使用默认阈值`80`** + * quality_control 图片质量控制 **NONE**: 不进行控制 **LOW**:较低的质量要求 **NORMAL**: 一般的质量要求 **HIGH**: 较高的质量要求 **默认 NONE** + * liveness_control 活体检测控制 **NONE**: 不进行控制 **LOW**:较低的活体要求(高通过率 低攻击拒绝率) **NORMAL**: 一般的活体要求(平衡的攻击拒绝率, 通过率) **HIGH**: 较高的活体要求(高攻击拒绝率 低通过率) **默认NONE** + * max_user_num 查找后返回的用户数量。返回相似度最高的几个用户,默认为1,最多返回50个。 + */ + Json::Value multi_search( + std::string const & image, + std::string const & image_type, + std::string const & group_id_list, + const std::map & options) + { + Json::Value data; + + data["image"] = image; + data["image_type"] = image_type; + data["group_id_list"] = group_id_list; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_multi_search, null, data.toStyledString(), null); + + return result; + } + + /** + * user_add + * 用于从人脸库中新增用户,可以设定多个用户所在组,及组内用户的人脸图片, + +典型应用场景:构建您的人脸库,如**会员人脸注册**,**已有用户补全人脸信息**等。 + +人脸库、用户组、用户、用户下的人脸**层级关系**如下所示: + +```json +|- 人脸库 + |- 用户组一 + |- 用户01 + |- 人脸 + |- 用户02 + |- 人脸 + |- 人脸 + .... + .... + |- 用户组二 + |- 用户组三 + |- 用户组四 + .... +``` + +**关于人脸库的设置限制** + +* 每个开发者账号可以创建100个appid; +* **每个appid对应一个人脸库,且不同appid之间,人脸库互不相通**; +* 每个人脸库下,可以创建多个用户组,用户组(group)数量**没有限制**; +* 每个用户组(group)下,可添加最多**无限**张人脸,**无限**个uid; +* 每个用户(uid)所能注册的最大人脸数量**没有限制**; + +为了保证识别效果,请控制注册人脸的质量(通过`/detect`人脸检测接口判断),具体参数可详见下表所示: + +**质量判断** + +可通过人脸检测接口,基于以下字段和对应阈值,进行质量检测的判断,以保证人脸质量符合后续业务操作要求。 + +| 指标 | 字段与解释 | 推荐数值界限 | +| -------- | ------------- | ------------- | +| **遮挡范围** | **occlusion**(0~1),0为无遮挡,1是完全遮挡
含有多个具体子字段,表示脸部多个部位
通常用作判断头发、墨镜、口罩等遮挡 | left\_eye : 0.6, #左眼被遮挡的阈值
right\_eye : 0.6, #右眼被遮挡的阈值
nose : 0.7, #鼻子被遮挡的阈值
mouth : 0.7, #嘴巴被遮挡的阈值
left\_check : 0.8, #左脸颊被遮挡的阈值
right\_check : 0.8, #右脸颊被遮挡的阈值
chin\_contour : 0.6, #下巴被遮挡阈值 | +| **模糊度范围** | **Blur**(0~1),0是最清晰,1是最模糊 | 小于0.7 | +| **光照范围** | **illumination**(0~255)
脸部光照的灰度值,0表示光照不好
以及对应客户端SDK中,YUV的Y分量| 大于40 | +| **姿态角度** | **Pitch**:三维旋转之俯仰角度[-90(上), 90(下)]
**Roll**:平面内旋转角[-180(逆时针), 180(顺时针)]
**Yaw**:三维旋转之左右旋转角[-90(左), 90(右)] | 分别小于20度 | +| **人脸完整度** | **completeness**(0或1),0为人脸溢出图像边界,1为人脸都在图像边界内 | 视业务逻辑判断 | +| **人脸大小** | 人脸部分的大小
建议长宽像素值范围:80\*80~200\*200 | 人脸部分不小于**100\*100**像素 | + + * @param image 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断。注:组内每个uid下的人脸图片数目上限为20张 + * @param image_type 图片类型
**BASE64**:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
**URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
**FACE_TOKEN**: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。 + * @param group_id 用户组id(由数字、字母、下划线组成),长度限制128B + * @param user_id 用户id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + * user_info 用户资料,长度限制256B + * quality_control 图片质量控制 **NONE**: 不进行控制 **LOW**:较低的质量要求 **NORMAL**: 一般的质量要求 **HIGH**: 较高的质量要求 **默认 NONE** + * liveness_control 活体检测控制 **NONE**: 不进行控制 **LOW**:较低的活体要求(高通过率 低攻击拒绝率) **NORMAL**: 一般的活体要求(平衡的攻击拒绝率, 通过率) **HIGH**: 较高的活体要求(高攻击拒绝率 低通过率) **默认NONE** + * action_type 操作方式 APPEND: 当user_id在库中已经存在时,对此user_id重复注册时,新注册的图片默认会追加到该user_id下,REPLACE : 当对此user_id重复注册时,则会用新图替换库中该user_id下所有图片,默认使用APPEND + */ + Json::Value user_add( + std::string const & image, + std::string const & image_type, + std::string const & group_id, + std::string const & user_id, + const std::map & options) + { + Json::Value data; + + data["image"] = image; + data["image_type"] = image_type; + data["group_id"] = group_id; + data["user_id"] = user_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_user_add, null, data.toStyledString(), null); + + return result; + } + + /** + * user_update + * 用于对人脸库中指定用户,更新其下的人脸图像。 + +> **说明:**针对一个uid执行更新操作,新上传的人脸图像将覆盖此uid原有所有图像。 + + * @param image 图片信息(**总数据大小应小于10M**),图片上传方式根据image_type来判断 + * @param image_type 图片类型
**BASE64**:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
**URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
**FACE_TOKEN**: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。 + * @param group_id 更新指定groupid下uid对应的信息 + * @param user_id 用户id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + * user_info 用户资料,长度限制256B + * quality_control 图片质量控制 **NONE**: 不进行控制 **LOW**:较低的质量要求 **NORMAL**: 一般的质量要求 **HIGH**: 较高的质量要求 **默认 NONE** + * liveness_control 活体检测控制 **NONE**: 不进行控制 **LOW**:较低的活体要求(高通过率 低攻击拒绝率) **NORMAL**: 一般的活体要求(平衡的攻击拒绝率, 通过率) **HIGH**: 较高的活体要求(高攻击拒绝率 低通过率) **默认NONE** + * action_type 操作方式 APPEND: 当user_id在库中已经存在时,对此user_id重复注册时,新注册的图片默认会追加到该user_id下,REPLACE : 当对此user_id重复注册时,则会用新图替换库中该user_id下所有图片,默认使用APPEND + */ + Json::Value user_update( + std::string const & image, + std::string const & image_type, + std::string const & group_id, + std::string const & user_id, + const std::map & options) + { + Json::Value data; + + data["image"] = image; + data["image_type"] = image_type; + data["group_id"] = group_id; + data["user_id"] = user_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_user_update, null, data.toStyledString(), null); + + return result; + } + + /** + * face_delete + * 用于从人脸库中删除一个用户。 + +**人脸删除注意事项:** + +* 删除的内容,包括用户所有图像和身份信息; +* 如果一个uid存在于多个用户组内,将会同时将从各个组中把用户删除 +* 如果指定了group_id,则只删除此group下的uid相关信息 + + * @param user_id 用户id(由数字、字母、下划线组成),长度限制128B + * @param group_id 用户组id(由数字、字母、下划线组成),长度限制128B + * @param face_token 需要删除的人脸图片token,(由数字、字母、下划线组成)长度限制64B + * options 可选参数: + */ + Json::Value face_delete( + std::string const & user_id, + std::string const & group_id, + std::string const & face_token, + const std::map & options) + { + Json::Value data; + + data["user_id"] = user_id; + data["group_id"] = group_id; + data["face_token"] = face_token; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_face_delete, null, data.toStyledString(), null); + + return result; + } + + /** + * user_get + * 获取人脸库中某个用户的信息(user_info信息和用户所属的组)。 + + * @param user_id 用户id(由数字、字母、下划线组成),长度限制128B + * @param group_id 用户组id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + */ + Json::Value user_get( + std::string const & user_id, + std::string const & group_id, + const std::map & options) + { + Json::Value data; + + data["user_id"] = user_id; + data["group_id"] = group_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_user_get, null, data.toStyledString(), null); + + return result; + } + + /** + * face_getlist + * 用于获取一个用户的全部人脸列表。 + + * @param user_id 用户id(由数字、字母、下划线组成),长度限制128B + * @param group_id 用户组id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + */ + Json::Value face_getlist( + std::string const & user_id, + std::string const & group_id, + const std::map & options) + { + Json::Value data; + + data["user_id"] = user_id; + data["group_id"] = group_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_face_getlist, null, data.toStyledString(), null); + + return result; + } + + /** + * group_getusers + * 用于查询指定用户组中的用户列表。 + + * @param group_id 用户组id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + * start 默认值0,起始序号 + * length 返回数量,默认值100,最大值1000 + */ + Json::Value group_getusers( + std::string const & group_id, + const std::map & options) + { + Json::Value data; + + data["group_id"] = group_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_group_getusers, null, data.toStyledString(), null); + + return result; + } + + /** + * user_copy + * 用于将已经存在于人脸库中的用户**复制到一个新的组**。 + + * @param user_id 用户id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + * src_group_id 从指定组里复制信息 + * dst_group_id 需要添加用户的组id + */ + Json::Value user_copy( + std::string const & user_id, + const std::map & options) + { + Json::Value data; + + data["user_id"] = user_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_user_copy, null, data.toStyledString(), null); + + return result; + } + + /** + * user_delete + * 用于将用户从某个组中删除。 + + * @param group_id 用户组id(由数字、字母、下划线组成),长度限制128B + * @param user_id 用户id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + */ + Json::Value user_delete( + std::string const & group_id, + std::string const & user_id, + const std::map & options) + { + Json::Value data; + + data["group_id"] = group_id; + data["user_id"] = user_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_user_delete, null, data.toStyledString(), null); + + return result; + } + + /** + * group_add + * 用于创建一个空的用户组,如果用户组已存在 则返回错误。 + + * @param group_id 用户组id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + */ + Json::Value group_add( + std::string const & group_id, + const std::map & options) + { + Json::Value data; + + data["group_id"] = group_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_group_add, null, data.toStyledString(), null); + + return result; + } + + /** + * group_delete + * 删除用户组下所有的用户及人脸,如果组不存在 则返回错误。 + + * @param group_id 用户组id(由数字、字母、下划线组成),长度限制128B + * options 可选参数: + */ + Json::Value group_delete( + std::string const & group_id, + const std::map & options) + { + Json::Value data; + + data["group_id"] = group_id; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_group_delete, null, data.toStyledString(), null); + + return result; + } + + /** + * group_getlist + * 用于查询用户组的列表。 + + * options 可选参数: + * start 默认值0,起始序号 + * length 返回数量,默认值100,最大值1000 + */ + Json::Value group_getlist( + const std::map & options) + { + Json::Value data; + + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_group_getlist, null, data.toStyledString(), null); + + return result; + } + + /** + * person_verify + * 质量检测(可选)活体检测(可选)公安验证(必选) + * @param image 图片信息(**总数据大小应小于10M**),图片上传方式根据image_type来判断 + * @param image_type 图片类型
**BASE64**:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
**URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
**FACE_TOKEN**: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。 + * @param id_card_number 身份证号(真实身份证号号码) + * @param name utf8,姓名(真实姓名,和身份证号匹配) + * options 可选参数: + * quality_control 图片质量控制 **NONE**: 不进行控制 **LOW**:较低的质量要求 **NORMAL**: 一般的质量要求 **HIGH**: 较高的质量要求 **默认 NONE** + * liveness_control 活体检测控制 **NONE**: 不进行控制 **LOW**:较低的活体要求(高通过率 低攻击拒绝率) **NORMAL**: 一般的活体要求(平衡的攻击拒绝率, 通过率) **HIGH**: 较高的活体要求(高攻击拒绝率 低通过率) **默认NONE** + */ + Json::Value person_verify( + std::string const & image, + std::string const & image_type, + std::string const & id_card_number, + std::string const & name, + const std::map & options) + { + Json::Value data; + + data["image"] = image; + data["image_type"] = image_type; + data["id_card_number"] = id_card_number; + data["name"] = name; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_person_verify, null, data.toStyledString(), null); + + return result; + } + + /** + * video_sessioncode + * 此接口主要用于生成随机码,用于视频的语音识别校验使用,以判断视频的即时性,而非事先录制的,提升作弊的难度。 + * options 可选参数: + * appid 百度云创建应用时的唯一标识ID + */ + Json::Value video_sessioncode( + const std::map & options) + { + Json::Value data; + + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_video_sessioncode, null, data.toStyledString(), null); + + return result; + } + /** + * faceverify + * @param data 参数对象数组 + * + */ + Json::Value faceverify( + Json::Value const & data) + { + std::string _faceverify = + "https://aip.baidubce.com/rest/2.0/face/v3/faceverify"; + Json::Value result = + this->request(_faceverify, null, data.toStyledString(), null); + + return result; + } + + /** + * match + * @param data 参数对象数组 + * + */ + Json::Value match( + Json::Value const & data) + { + std::string _match = + "https://aip.baidubce.com/rest/2.0/face/v3/match"; + Json::Value result = + this->request(_match, null, data.toStyledString(), null); + + return result; + } + + }; +} +#endif \ No newline at end of file diff --git a/src/aip-cpp-sdk/image_classify.h b/src/aip-cpp-sdk/image_classify.h new file mode 100755 index 0000000000000000000000000000000000000000..463ec16c5dfce2cb3c37817a50fd92ddc24e0eeb --- /dev/null +++ b/src/aip-cpp-sdk/image_classify.h @@ -0,0 +1,477 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_IMAGECLASSIFY_H__ +#define __AIP_IMAGECLASSIFY_H__ + +#include "base/base.h" + +namespace aip { + + class Imageclassify: public AipBase + { + public: + + + std::string _advanced_general = + "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general"; + + std::string _dish_detect = + "https://aip.baidubce.com/rest/2.0/image-classify/v2/dish"; + + std::string _car_detect = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/car"; + + std::string _vehicle_detect = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/vehicle_detect"; + + std::string _vehicle_damage = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/vehicle_damage"; + + std::string _logo_search = + "https://aip.baidubce.com/rest/2.0/image-classify/v2/logo"; + + std::string _logo_add = + "https://aip.baidubce.com/rest/2.0/realtime_search/v1/logo/add"; + + std::string _logo_delete = + "https://aip.baidubce.com/rest/2.0/realtime_search/v1/logo/delete"; + + std::string _animal_detect = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal"; + + std::string _plant_detect = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant"; + + std::string _object_detect = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/object_detect"; + + std::string _landmark = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/landmark"; + + std::string _flower = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/flower"; + + std::string _ingredient = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/classify/ingredient"; + + std::string _redwine = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/redwine"; + + std::string _currency = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/currency"; + + + Imageclassify(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + /** + * advanced_general + * 该请求用于通用物体及场景识别,即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中的多个物体及场景标签。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * baike_num 返回百科信息的结果数,默认不返回 + */ + Json::Value advanced_general( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_advanced_general, null, data, null); + + return result; + } + + /** + * dish_detect + * 该请求用于菜品识别。即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片的菜品名称、卡路里信息、置信度。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * top_num 返回预测得分top结果数,默认为5 + * filter_threshold 默认0.95,可以通过该参数调节识别效果,降低非菜识别率. + * baike_num 返回百科信息的结果数,默认不返回 + */ + Json::Value dish_detect( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_dish_detect, null, data, null); + + return result; + } + + /** + * car_detect + * 该请求用于检测一张车辆图片的具体车型。即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片的车辆品牌及型号。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * top_num 返回预测得分top结果数,默认为5 + * baike_num 返回百科信息的结果数,默认不返回 + */ + Json::Value car_detect( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_car_detect, null, data, null); + + return result; + } + + /** + * vehicle_detect + * 传入单帧图像,**检测图片中所有机动车辆,返回每辆车的类型和坐标位置**,可识别小汽车、卡车、巴士、摩托车、三轮车5大类车辆,**并对每类车辆分别计数,可返回含有统计值和检测框的渲染结果图**,支持指定不规则区域的车辆统计。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * show 是否返回结果图(含统计值和跟踪框)。选true时返回渲染后的图片(base64),其它无效值或为空则默认false。 + * area 只统计该区域内的车辆数,缺省时为全图统计。
逗号分隔,如‘x1,y1,x2,y2,x3,y3...xn,yn',按顺序依次给出每个顶点的x、y坐标(默认尾点和首点相连),形成闭合多边形区域。
服务会做范围(顶点左边需在图像范围内)及个数校验(数组长度必须为偶数,且大于3个顶点)。只支持单个多边形区域,建议设置矩形框,即4个顶点。**坐标取值不能超过图像宽度和高度,比如1280的宽度,坐标值最大到1279**。 + */ + Json::Value vehicle_detect( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_vehicle_detect, null, data, null); + + return result; + } + + /** + * vehicle_damage + * 针对常见的小汽车车型,传入单帧图像,识别车辆外观受损部件及损伤类型,支持32种车辆部件、5大类外观损伤。同时可输出损伤的数值化结果(长宽、面积、部件占比),支持单图多种损伤的识别。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value vehicle_damage( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_vehicle_damage, null, data, null); + + return result; + } + + /** + * logo_search + * 该请求用于检测和识别图片中的品牌LOGO信息。即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中LOGO的名称、位置和置信度。当效果欠佳时,可以建立子库(在[控制台](https://console.bce.baidu.com/ai/#/ai/imagerecognition/overview/index)创建应用并申请建库)并通过调用logo入口接口完成自定义logo入库,提高识别效果。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * custom_lib 是否只使用自定义logo库的结果,默认false:返回自定义库+默认库的识别结果 + */ + Json::Value logo_search( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_logo_search, null, data, null); + + return result; + } + + /** + * logo_add + * 使用入库接口请先在[控制台](https://console.bce.baidu.com/ai/#/ai/imagerecognition/overview/index)创建应用并申请建库,建库成功后方可正常使用。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * @param brief brief,检索时带回。此处要传对应的name与code字段,name长度小于100B,code长度小于150B + * options 可选参数: + */ + Json::Value logo_add( + std::string const & image, + std::string const & brief, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + data["brief"] = brief; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_logo_add, null, data, null); + + return result; + } + + /** + * logo_delete_by_image + * 使用删除接口请先在[控制台](https://console.bce.baidu.com/ai/#/ai/imagerecognition/overview/index)创建应用并申请建库,建库成功后先调用入库接口完成logo图片入库,删除接口用户在已入库的logo图片中删除图片。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value logo_delete_by_image( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_logo_delete, null, data, null); + + return result; + } + + /** + * logo_delete_by_sign + * 使用删除接口请先在[控制台](https://console.bce.baidu.com/ai/#/ai/imagerecognition/overview/index)创建应用并申请建库,建库成功后先调用入库接口完成logo图片入库,删除接口用户在已入库的logo图片中删除图片。 + * @param cont_sign 图片签名(和image二选一,image优先级更高) + * options 可选参数: + */ + Json::Value logo_delete_by_sign( + std::string const & cont_sign, + const std::map & options) + { + std::map data; + + data["cont_sign"] = cont_sign; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_logo_delete, null, data, null); + + return result; + } + + /** + * animal_detect + * 该请求用于识别一张图片。即对于输入的一张图片(可正常解码,且长宽比适宜),输出动物识别结果 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * top_num 返回预测得分top结果数,默认为6 + * baike_num 返回百科信息的结果数,默认不返回 + */ + Json::Value animal_detect( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_animal_detect, null, data, null); + + return result; + } + + /** + * plant_detect + * 该请求用于识别一张图片。即对于输入的一张图片(可正常解码,且长宽比适宜),输出植物识别结果。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * baike_num 返回百科信息的结果数,默认不返回 + */ + Json::Value plant_detect( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_plant_detect, null, data, null); + + return result; + } + + /** + * object_detect + * 用户向服务请求检测图像中的主体位置。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * with_face 如果检测主体是人,主体区域是否带上人脸部分,0-不带人脸区域,其他-带人脸区域,裁剪类需求推荐带人脸,检索/识别类需求推荐不带人脸。默认取1,带人脸。 + */ + Json::Value object_detect( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_object_detect, null, data, null); + + return result; + } + + /** + * landmark + * 该请求用于识别地标,即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中的地标识别结果。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value landmark( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_landmark, null, data, null); + + return result; + } + + /** + * flower + * 检测用户上传的花卉图片,输出图片的花卉识别结果名称及对应的概率打分。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * top_num 返回预测得分top结果数,默认为5 + * baike_num 返回百科信息的结果数,默认不返回 + */ + Json::Value flower( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_flower, null, data, null); + + return result; + } + + /** + * ingredient + * 该请求用于识别果蔬类食材,即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中的果蔬食材结果。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * top_num 返回预测得分top结果数,如果为空或小于等于0默认为5;如果大于20默认20 + */ + Json::Value ingredient( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_ingredient, null, data, null); + + return result; + } + + /** + * redwine + * 该服务用于识别红酒标签,即对于输入的一张图片(可正常解码,长宽比适宜,且酒标清晰可见),输出图片中的红酒名称、国家、产区、酒庄、类型、糖分、葡萄品种、酒品描述等信息。可识别数十万中外常见红酒。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value redwine( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_redwine, null, data, null); + + return result; + } + + /** + * currency + * 识别图像中的货币类型,以纸币为主,正反面均可准确识别,接口返回货币的名称、代码、面值、年份信息;可识别各类近代常见货币,如美元、欧元、英镑、法郎、澳大利亚元、俄罗斯卢布、日元、韩元、泰铢、印尼卢比等。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value currency( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_currency, null, data, null); + + return result; + } + + + }; +} +#endif \ No newline at end of file diff --git a/src/aip-cpp-sdk/image_process.h b/src/aip-cpp-sdk/image_process.h new file mode 100755 index 0000000000000000000000000000000000000000..11d14057d23836c977a8342790a78b2630ccb114 --- /dev/null +++ b/src/aip-cpp-sdk/image_process.h @@ -0,0 +1,161 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_IMAGEPROCESS_H__ +#define __AIP_IMAGEPROCESS_H__ + +#include "base/base.h" + +namespace aip { + + class Imageprocess: public AipBase + { + public: + + + std::string _image_quality_enhance = + "https://aip.baidubce.com/rest/2.0/image-process/v1/image_quality_enhance"; + + std::string _dehaze = + "https://aip.baidubce.com/rest/2.0/image-process/v1/dehaze"; + + std::string _contrast_enhance = + "https://aip.baidubce.com/rest/2.0/image-process/v1/contrast_enhance"; + + std::string _colourize = + "https://aip.baidubce.com/rest/2.0/image-process/v1/colourize"; + + std::string _stretch_restore = + "https://aip.baidubce.com/rest/2.0/image-process/v1/stretch_restore"; + + + Imageprocess(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + /** + * image_quality_enhance + * 输入一张图片,可以在尽量保持图像质量的条件下,将图像在长宽方向各放大两倍。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value image_quality_enhance( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_image_quality_enhance, null, data, null); + + return result; + } + + /** + * dehaze + * 对浓雾天气下拍摄,导致细节无法辨认的图像进行去雾处理,还原更清晰真实的图像。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value dehaze( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_dehaze, null, data, null); + + return result; + } + + /** + * contrast_enhance + * 调整过暗或者过亮图像的对比度,使图像更加鲜明。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value contrast_enhance( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_contrast_enhance, null, data, null); + + return result; + } + + /** + * colourize + * 智能识别黑白图像内容并填充色彩,使黑白图像变得鲜活。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value colourize( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_colourize, null, data, null); + + return result; + } + + /** + * stretch_restore + * 自动识别过度拉伸的图像,将图像内容恢复成正常比例。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value stretch_restore( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_stretch_restore, null, data, null); + + return result; + } + + + }; +} +#endif \ No newline at end of file diff --git a/src/aip-cpp-sdk/image_search.h b/src/aip-cpp-sdk/image_search.h new file mode 100755 index 0000000000000000000000000000000000000000..572c44af4b3b517576b879809e58a054e640ff20 --- /dev/null +++ b/src/aip-cpp-sdk/image_search.h @@ -0,0 +1,815 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_IMAGESEARCH_H__ +#define __AIP_IMAGESEARCH_H__ + +#include "base/base.h" + +namespace aip { + + class Imagesearch: public AipBase + { + public: + + + std::string _same_hq_add = + "https://aip.baidubce.com/rest/2.0/realtime_search/same_hq/add"; + + std::string _same_hq_search = + "https://aip.baidubce.com/rest/2.0/realtime_search/same_hq/search"; + + std::string _same_hq_update = + "https://aip.baidubce.com/rest/2.0/realtime_search/same_hq/update"; + + std::string _same_hq_delete = + "https://aip.baidubce.com/rest/2.0/realtime_search/same_hq/delete"; + + std::string _similar_add = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/realtime_search/similar/add"; + + std::string _similar_search = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/realtime_search/similar/search"; + + std::string _similar_update = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/realtime_search/similar/update"; + + std::string _similar_delete = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/realtime_search/similar/delete"; + + std::string _product_add = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/realtime_search/product/add"; + + std::string _product_search = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/realtime_search/product/search"; + + std::string _product_update = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/realtime_search/product/update"; + + std::string _product_delete = + "https://aip.baidubce.com/rest/2.0/image-classify/v1/realtime_search/product/delete"; + + + Imagesearch(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + /** + * same_hq_add + * **该接口实现单张图片入库,入库时需要同步提交图片及可关联至本地图库的摘要信息(具体变量为brief,具体可传入图片在本地标记id、图片url、图片名称等);同时可提交分类维度信息(具体变量为tags,最多可传入2个tag),方便对图库中的图片进行管理、分类检索。****注:重复添加完全相同的图片会返回错误。** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * brief 检索时原样带回,最长256B。 + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value same_hq_add( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_add, null, data, null); + + return result; + } + + /** + * same_hq_add_url + * **该接口实现单张图片入库,入库时需要同步提交图片及可关联至本地图库的摘要信息(具体变量为brief,具体可传入图片在本地标记id、图片url、图片名称等);同时可提交分类维度信息(具体变量为tags,最多可传入2个tag),方便对图库中的图片进行管理、分类检索。****注:重复添加完全相同的图片会返回错误。** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * brief 检索时原样带回,最长256B。 + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value same_hq_add_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_add, null, data, null); + + return result; + } + + /** + * same_hq_search + * 完成入库后,可使用该接口实现相同图检索。**支持传入指定分类维度(具体变量tags)进行检索,返回结果支持翻页(具体变量pn、rn)。****请注意,检索接口不返回原图,仅反馈当前填写的brief信息,请调用入库接口时尽量填写可关联至本地图库的图片id或者图片url等信息。** + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + * tag_logic 检索时tag之间的逻辑, 0:逻辑and,1:逻辑or + * pn 分页功能,起始位置,例:0。未指定分页时,默认返回前300个结果;接口返回数量最大限制1000条,例如:起始位置为900,截取条数500条,接口也只返回第900 - 1000条的结果,共计100条 + * rn 分页功能,截取条数,例:250 + */ + Json::Value same_hq_search( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_search, null, data, null); + + return result; + } + + /** + * same_hq_search_url + * 完成入库后,可使用该接口实现相同图检索。**支持传入指定分类维度(具体变量tags)进行检索,返回结果支持翻页(具体变量pn、rn)。****请注意,检索接口不返回原图,仅反馈当前填写的brief信息,请调用入库接口时尽量填写可关联至本地图库的图片id或者图片url等信息。** + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + * tag_logic 检索时tag之间的逻辑, 0:逻辑and,1:逻辑or + * pn 分页功能,起始位置,例:0。未指定分页时,默认返回前300个结果;接口返回数量最大限制1000条,例如:起始位置为900,截取条数500条,接口也只返回第900 - 1000条的结果,共计100条 + * rn 分页功能,截取条数,例:250 + */ + Json::Value same_hq_search_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_search, null, data, null); + + return result; + } + + /** + * same_hq_update + * **更新图库中图片的摘要和分类信息(具体变量为brief、tags)** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value same_hq_update( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_update, null, data, null); + + return result; + } + + /** + * same_hq_update_url + * **更新图库中图片的摘要和分类信息(具体变量为brief、tags)** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value same_hq_update_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_update, null, data, null); + + return result; + } + + /** + * same_hq_update_cont_sign + * **更新图库中图片的摘要和分类信息(具体变量为brief、tags)** + + * @param cont_sign 图片签名 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value same_hq_update_cont_sign( + std::string const & cont_sign, + const std::map & options) + { + std::map data; + + data["cont_sign"] = cont_sign; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_update, null, data, null); + + return result; + } + + /** + * same_hq_delete_by_image + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value same_hq_delete_by_image( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_delete, null, data, null); + + return result; + } + + /** + * same_hq_delete_by_url + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + */ + Json::Value same_hq_delete_by_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_delete, null, data, null); + + return result; + } + + /** + * same_hq_delete_by_sign + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param cont_sign 图片签名 + * options 可选参数: + */ + Json::Value same_hq_delete_by_sign( + std::string const & cont_sign, + const std::map & options) + { + std::map data; + + data["cont_sign"] = cont_sign; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_same_hq_delete, null, data, null); + + return result; + } + + /** + * similar_add + * **该接口实现单张图片入库,入库时需要同步提交图片及可关联至本地图库的摘要信息(具体变量为brief,具体可传入图片在本地标记id、图片url、图片名称等);同时可提交分类维度信息(具体变量为tags,最多可传入2个tag),方便对图库中的图片进行管理、分类检索。****注:重复添加完全相同的图片会返回错误。** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * brief 检索时原样带回,最长256B。 + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value similar_add( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_add, null, data, null); + + return result; + } + + /** + * similar_add_url + * **该接口实现单张图片入库,入库时需要同步提交图片及可关联至本地图库的摘要信息(具体变量为brief,具体可传入图片在本地标记id、图片url、图片名称等);同时可提交分类维度信息(具体变量为tags,最多可传入2个tag),方便对图库中的图片进行管理、分类检索。****注:重复添加完全相同的图片会返回错误。** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * brief 检索时原样带回,最长256B。 + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value similar_add_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_add, null, data, null); + + return result; + } + + /** + * similar_search + * 完成入库后,可使用该接口实现相似图检索。**支持传入指定分类维度(具体变量tags)进行检索,返回结果支持翻页(具体变量pn、rn)。****请注意,检索接口不返回原图,仅反馈当前填写的brief信息,请调用入库接口时尽量填写可关联至本地图库的图片id或者图片url等信息。** + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + * tag_logic 检索时tag之间的逻辑, 0:逻辑and,1:逻辑or + * pn 分页功能,起始位置,例:0。未指定分页时,默认返回前300个结果;接口返回数量最大限制1000条,例如:起始位置为900,截取条数500条,接口也只返回第900 - 1000条的结果,共计100条 + * rn 分页功能,截取条数,例:250 + */ + Json::Value similar_search( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_search, null, data, null); + + return result; + } + + /** + * similar_search_url + * 完成入库后,可使用该接口实现相似图检索。**支持传入指定分类维度(具体变量tags)进行检索,返回结果支持翻页(具体变量pn、rn)。****请注意,检索接口不返回原图,仅反馈当前填写的brief信息,请调用入库接口时尽量填写可关联至本地图库的图片id或者图片url等信息。** + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + * tag_logic 检索时tag之间的逻辑, 0:逻辑and,1:逻辑or + * pn 分页功能,起始位置,例:0。未指定分页时,默认返回前300个结果;接口返回数量最大限制1000条,例如:起始位置为900,截取条数500条,接口也只返回第900 - 1000条的结果,共计100条 + * rn 分页功能,截取条数,例:250 + */ + Json::Value similar_search_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_search, null, data, null); + + return result; + } + + /** + * similar_update + * **更新图库中图片的摘要和分类信息(具体变量为brief、tags)** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value similar_update( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_update, null, data, null); + + return result; + } + + /** + * similar_update_url + * **更新图库中图片的摘要和分类信息(具体变量为brief、tags)** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value similar_update_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_update, null, data, null); + + return result; + } + + /** + * similar_update_cont_sign + * **更新图库中图片的摘要和分类信息(具体变量为brief、tags)** + + * @param cont_sign 图片签名 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * tags 1 - 65535范围内的整数,tag间以逗号分隔,最多2个tag。样例:"100,11" ;检索时可圈定分类维度进行检索 + */ + Json::Value similar_update_cont_sign( + std::string const & cont_sign, + const std::map & options) + { + std::map data; + + data["cont_sign"] = cont_sign; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_update, null, data, null); + + return result; + } + + /** + * similar_delete_by_image + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value similar_delete_by_image( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_delete, null, data, null); + + return result; + } + + /** + * similar_delete_by_url + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + */ + Json::Value similar_delete_by_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_delete, null, data, null); + + return result; + } + + /** + * similar_delete_by_sign + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param cont_sign 图片签名 + * options 可选参数: + */ + Json::Value similar_delete_by_sign( + std::string const & cont_sign, + const std::map & options) + { + std::map data; + + data["cont_sign"] = cont_sign; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_similar_delete, null, data, null); + + return result; + } + + /** + * product_add + * **该接口实现单张图片入库,入库时需要同步提交图片及可关联至本地图库的摘要信息(具体变量为brief,具体可传入图片在本地标记id、图片url、图片名称等)。同时可提交分类维度信息(具体变量为class_id1、class_id2),方便对图库中的图片进行管理、分类检索。****注:重复添加完全相同的图片会返回错误。** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * brief 检索时原样带回,最长256B。**请注意,检索接口不返回原图,仅反馈当前填写的brief信息,所以调用该入库接口时,brief信息请尽量填写可关联至本地图库的图片id或者图片url、图片名称等信息** + * class_id1 商品分类维度1,支持1-60范围内的整数。检索时可圈定该分类维度进行检索 + * class_id2 商品分类维度1,支持1-60范围内的整数。检索时可圈定该分类维度进行检索 + */ + Json::Value product_add( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_add, null, data, null); + + return result; + } + + /** + * product_add_url + * **该接口实现单张图片入库,入库时需要同步提交图片及可关联至本地图库的摘要信息(具体变量为brief,具体可传入图片在本地标记id、图片url、图片名称等)。同时可提交分类维度信息(具体变量为class_id1、class_id2),方便对图库中的图片进行管理、分类检索。****注:重复添加完全相同的图片会返回错误。** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * brief 检索时原样带回,最长256B。**请注意,检索接口不返回原图,仅反馈当前填写的brief信息,所以调用该入库接口时,brief信息请尽量填写可关联至本地图库的图片id或者图片url、图片名称等信息** + * class_id1 商品分类维度1,支持1-60范围内的整数。检索时可圈定该分类维度进行检索 + * class_id2 商品分类维度1,支持1-60范围内的整数。检索时可圈定该分类维度进行检索 + */ + Json::Value product_add_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_add, null, data, null); + + return result; + } + + /** + * product_search + * 完成入库后,可使用该接口实现商品检索。**支持传入指定分类维度(具体变量class_id1、class_id2)进行检索,返回结果支持翻页(具体变量pn、rn)。****请注意,检索接口不返回原图,仅反馈当前填写的brief信息,请调用入库接口时尽量填写可关联至本地图库的图片id或者图片url等信息** + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * class_id1 商品分类维度1,支持1-60范围内的整数。检索时可圈定该分类维度进行检索 + * class_id2 商品分类维度1,支持1-60范围内的整数。检索时可圈定该分类维度进行检索 + * pn 分页功能,起始位置,例:0。未指定分页时,默认返回前300个结果;接口返回数量最大限制1000条,例如:起始位置为900,截取条数500条,接口也只返回第900 - 1000条的结果,共计100条 + * rn 分页功能,截取条数,例:250 + */ + Json::Value product_search( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_search, null, data, null); + + return result; + } + + /** + * product_search_url + * 完成入库后,可使用该接口实现商品检索。**支持传入指定分类维度(具体变量class_id1、class_id2)进行检索,返回结果支持翻页(具体变量pn、rn)。****请注意,检索接口不返回原图,仅反馈当前填写的brief信息,请调用入库接口时尽量填写可关联至本地图库的图片id或者图片url等信息** + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * class_id1 商品分类维度1,支持1-60范围内的整数。检索时可圈定该分类维度进行检索 + * class_id2 商品分类维度1,支持1-60范围内的整数。检索时可圈定该分类维度进行检索 + * pn 分页功能,起始位置,例:0。未指定分页时,默认返回前300个结果;接口返回数量最大限制1000条,例如:起始位置为900,截取条数500条,接口也只返回第900 - 1000条的结果,共计100条 + * rn 分页功能,截取条数,例:250 + */ + Json::Value product_search_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_search, null, data, null); + + return result; + } + + /** + * product_update + * **更新图库中图片的摘要和分类信息(具体变量为brief、class_id1/class_id2)** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * class_id1 更新的商品分类1,支持1-60范围内的整数。 + * class_id2 更新的商品分类2,支持1-60范围内的整数。 + */ + Json::Value product_update( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_update, null, data, null); + + return result; + } + + /** + * product_update_url + * **更新图库中图片的摘要和分类信息(具体变量为brief、class_id1/class_id2)** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * class_id1 更新的商品分类1,支持1-60范围内的整数。 + * class_id2 更新的商品分类2,支持1-60范围内的整数。 + */ + Json::Value product_update_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_update, null, data, null); + + return result; + } + + /** + * product_update_cont_sign + * **更新图库中图片的摘要和分类信息(具体变量为brief、class_id1/class_id2)** + + * @param cont_sign 图片签名 + * options 可选参数: + * brief 更新的摘要信息,最长256B。样例:{"name":"周杰伦", "id":"666"} + * class_id1 更新的商品分类1,支持1-60范围内的整数。 + * class_id2 更新的商品分类2,支持1-60范围内的整数。 + */ + Json::Value product_update_cont_sign( + std::string const & cont_sign, + const std::map & options) + { + std::map data; + + data["cont_sign"] = cont_sign; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_update, null, data, null); + + return result; + } + + /** + * product_delete_by_image + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value product_delete_by_image( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_delete, null, data, null); + + return result; + } + + /** + * product_delete_by_url + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + */ + Json::Value product_delete_by_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_delete, null, data, null); + + return result; + } + + /** + * product_delete_by_sign + * **删除图库中的图片,支持批量删除,批量删除时请传cont_sign参数,勿传image,最多支持1000个cont_sign** + + * @param cont_sign 图片签名 + * options 可选参数: + */ + Json::Value product_delete_by_sign( + std::string const & cont_sign, + const std::map & options) + { + std::map data; + + data["cont_sign"] = cont_sign; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_product_delete, null, data, null); + + return result; + } + + + }; +} +#endif \ No newline at end of file diff --git a/src/aip-cpp-sdk/kg.h b/src/aip-cpp-sdk/kg.h new file mode 100755 index 0000000000000000000000000000000000000000..73f00433113a622850601d889b3d3da3adac5d6a --- /dev/null +++ b/src/aip-cpp-sdk/kg.h @@ -0,0 +1,206 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_KG_H__ +#define __AIP_KG_H__ + +#include "base/base.h" + +namespace aip { + + class Kg: public AipBase + { + public: + + + std::string _create_task = + "https://aip.baidubce.com/rest/2.0/kg/v1/pie/task_create"; + + std::string _update_task = + "https://aip.baidubce.com/rest/2.0/kg/v1/pie/task_update"; + + std::string _task_info = + "https://aip.baidubce.com/rest/2.0/kg/v1/pie/task_info"; + + std::string _task_query = + "https://aip.baidubce.com/rest/2.0/kg/v1/pie/task_query"; + + std::string _task_start = + "https://aip.baidubce.com/rest/2.0/kg/v1/pie/task_start"; + + std::string _task_status = + "https://aip.baidubce.com/rest/2.0/kg/v1/pie/task_status"; + + + Kg(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + /** + * create_task + * 创建一个新的信息抽取任务 + * @param name 任务名字 + * @param template_content json string 解析模板内容 + * @param input_mapping_file 抓取结果映射文件的路径 + * @param output_file 输出文件名字 + * @param url_pattern url pattern + * options 可选参数: + * limit_count 限制解析数量limit_count为0时进行全量任务,limit_count>0时只解析limit_count数量的页面 + */ + Json::Value create_task( + std::string const & name, + std::string const & template_content, + std::string const & input_mapping_file, + std::string const & output_file, + std::string const & url_pattern, + const std::map & options) + { + std::map data; + + data["name"] = name; + data["template_content"] = template_content; + data["input_mapping_file"] = input_mapping_file; + data["output_file"] = output_file; + data["url_pattern"] = url_pattern; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_create_task, null, data, null); + + return result; + } + + /** + * update_task + * 更新任务配置,在任务重新启动后生效 + * @param id 任务ID + * options 可选参数: + * name 任务名字 + * template_content json string 解析模板内容 + * input_mapping_file 抓取结果映射文件的路径 + * url_pattern url pattern + * output_file 输出文件名字 + */ + Json::Value update_task( + const int & id, + const std::map & options) + { + std::map data; + + data["id"] = std::to_string(id); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_update_task, null, data, null); + + return result; + } + + /** + * task_info + * 根据任务id获取单个任务的详细信息 + * @param id 任务ID + * options 可选参数: + */ + Json::Value task_info( + const int & id, + const std::map & options) + { + std::map data; + + data["id"] = std::to_string(id); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_task_info, null, data, null); + + return result; + } + + /** + * task_query + * 该请求用于菜品识别。即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片的菜品名称、卡路里信息、置信度。 + * options 可选参数: + * id 任务ID,精确匹配 + * name 中缀模糊匹配,abc可以匹配abc,aaabc,abcde等 + * status 要筛选的任务状态 + * page 页码 + * per_page 页码 + */ + Json::Value task_query( + const std::map & options) + { + std::map data; + + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_task_query, null, data, null); + + return result; + } + + /** + * task_start + * 启动一个已经创建的信息抽取任务 + * @param id 任务ID + * options 可选参数: + */ + Json::Value task_start( + const int & id, + const std::map & options) + { + std::map data; + + data["id"] = std::to_string(id); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_task_start, null, data, null); + + return result; + } + + /** + * task_status + * 查询指定的任务的最新执行状态 + * @param id 任务ID + * options 可选参数: + */ + Json::Value task_status( + const int & id, + const std::map & options) + { + std::map data; + + data["id"] = std::to_string(id); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_task_status, null, data, null); + + return result; + } + + + }; +} +#endif \ No newline at end of file diff --git a/src/aip-cpp-sdk/nlp.h b/src/aip-cpp-sdk/nlp.h new file mode 100755 index 0000000000000000000000000000000000000000..16b713e3b2c14caecc3e81ae1b15ee8e53d4665d --- /dev/null +++ b/src/aip-cpp-sdk/nlp.h @@ -0,0 +1,491 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_NLP_H__ +#define __AIP_NLP_H__ + +#include "base/base.h" + +namespace aip { + + class Nlp: public AipBase + { + public: + + std::string _lexer = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/lexer"; + + std::string _lexer_custom = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/lexer_custom"; + + std::string _dep_parser = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/depparser"; + + std::string _word_embedding = + "https://aip.baidubce.com/rpc/2.0/nlp/v2/word_emb_vec"; + + std::string _dnnlm_cn = + "https://aip.baidubce.com/rpc/2.0/nlp/v2/dnnlm_cn"; + + std::string _word_sim_embedding = + "https://aip.baidubce.com/rpc/2.0/nlp/v2/word_emb_sim"; + + std::string _simnet = + "https://aip.baidubce.com/rpc/2.0/nlp/v2/simnet"; + + std::string _comment_tag = + "https://aip.baidubce.com/rpc/2.0/nlp/v2/comment_tag"; + + std::string _sentiment_classify = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify"; + + std::string _keyword = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/keyword"; + + std::string _topic = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/topic"; + + std::string _ecnet = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/ecnet"; + + std::string _emotion = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/emotion"; + + std::string _news_summary = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/news_summary"; + + std::string _address = + "https://aip.baidubce.com/rpc/2.0/nlp/v1/address"; + + + Nlp(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + + /** + * lexer + * 词法分析接口向用户提供分词、词性标注、专名识别三大功能;能够识别出文本串中的基本词汇(分词),对这些词汇进行重组、标注组合后词汇的词性,并进一步识别出命名实体。 + * @param text 待分析文本(目前仅支持UTF8编码),长度不超过65536字节 + * options 可选参数: + */ + Json::Value lexer( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_lexer, null, data.toStyledString(), null); + + return result; + } + + /** + * lexer_custom + * 词法分析接口向用户提供分词、词性标注、专名识别三大功能;能够识别出文本串中的基本词汇(分词),对这些词汇进行重组、标注组合后词汇的词性,并进一步识别出命名实体。 + * @param text 待分析文本(目前仅支持UTF8编码),长度不超过65536字节 + * options 可选参数: + */ + Json::Value lexer_custom( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_lexer_custom, null, data.toStyledString(), null); + + return result; + } + + /** + * dep_parser + * 依存句法分析接口可自动分析文本中的依存句法结构信息,利用句子中词与词之间的依存关系来表示词语的句法结构信息(如“主谓”、“动宾”、“定中”等结构关系),并用树状结构来表示整句的结构(如“主谓宾”、“定状补”等)。 + * @param text 待分析文本(目前仅支持UTF8编码),长度不超过256字节 + * options 可选参数: + * mode 模型选择。默认值为0,可选值mode=0(对应web模型);mode=1(对应query模型) + */ + Json::Value dep_parser( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_dep_parser, null, data.toStyledString(), null); + + return result; + } + + /** + * word_embedding + * 词向量表示接口提供中文词向量的查询功能。 + * @param word 文本内容(UTF8编码),最大64字节 + * options 可选参数: + */ + Json::Value word_embedding( + std::string const & word, + const std::map & options) + { + Json::Value data; + + data["word"] = word; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_word_embedding, null, data.toStyledString(), null); + + return result; + } + + /** + * dnnlm_cn + * 中文DNN语言模型接口用于输出切词结果并给出每个词在句子中的概率值,判断一句话是否符合语言表达习惯。 + * @param text 文本内容(UTF8编码),最大512字节,不需要切词 + * options 可选参数: + */ + Json::Value dnnlm_cn( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_dnnlm_cn, null, data.toStyledString(), null); + + return result; + } + + /** + * word_sim_embedding + * 输入两个词,得到两个词的相似度结果。 + * @param word_1 词1(UTF8编码),最大64字节 + * @param word_2 词1(UTF8编码),最大64字节 + * options 可选参数: + * mode 预留字段,可选择不同的词义相似度模型。默认值为0,目前仅支持mode=0 + */ + Json::Value word_sim_embedding( + std::string const & word_1, + std::string const & word_2, + const std::map & options) + { + Json::Value data; + + data["word_1"] = word_1; + data["word_2"] = word_2; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_word_sim_embedding, null, data.toStyledString(), null); + + return result; + } + + /** + * simnet + * 短文本相似度接口用来判断两个文本的相似度得分。 + * @param text_1 待比较文本1(UTF8编码),最大512字节 + * @param text_2 待比较文本2(UTF8编码),最大512字节 + * options 可选参数: + * model 默认为"BOW",可选"BOW"、"CNN"与"GRNN" + */ + Json::Value simnet( + std::string const & text_1, + std::string const & text_2, + const std::map & options) + { + Json::Value data; + + data["text_1"] = text_1; + data["text_2"] = text_2; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_simnet, null, data.toStyledString(), null); + + return result; + } + + /** + * comment_tag + * 评论观点抽取接口用来提取一条评论句子的关注点和评论观点,并输出评论观点标签及评论观点极性。 + * @param text 评论内容(UTF8编码),最大10240字节 + * options 可选参数: + * type 评论行业类型,默认为4(餐饮美食) + */ + Json::Value comment_tag( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_comment_tag, null, data.toStyledString(), null); + + return result; + } + + /** + * sentiment_classify + * 对包含主观观点信息的文本进行情感极性类别(积极、消极、中性)的判断,并给出相应的置信度。 + * @param text 文本内容(UTF8编码),最大102400字节 + * options 可选参数: + */ + Json::Value sentiment_classify( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_sentiment_classify, null, data.toStyledString(), null); + + return result; + } + + /** + * keyword + * 文章标签服务能够针对网络各类媒体文章进行快速的内容理解,根据输入含有标题的文章,输出多个内容标签以及对应的置信度,用于个性化推荐、相似文章聚合、文本内容分析等场景。 + * @param title 篇章的标题,最大80字节 + * @param content 篇章的正文,最大65535字节 + * options 可选参数: + */ + Json::Value keyword( + std::string const & title, + std::string const & content, + const std::map & options) + { + Json::Value data; + + data["title"] = title; + data["content"] = content; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_keyword, null, data.toStyledString(), null); + + return result; + } + + /** + * topic + * 对文章按照内容类型进行自动分类,首批支持娱乐、体育、科技等26个主流内容类型,为文章聚类、文本内容分析等应用提供基础技术支持。 + * @param title 篇章的标题,最大80字节 + * @param content 篇章的正文,最大65535字节 + * options 可选参数: + */ + Json::Value topic( + std::string const & title, + std::string const & content, + const std::map & options) + { + Json::Value data; + + data["title"] = title; + data["content"] = content; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_topic, null, data.toStyledString(), null); + + return result; + } + + /** + * ecnet + * 识别输入文本中有错误的片段,提示错误并给出正确的文本结果。支持短文本、长文本、语音等内容的错误识别,纠错是搜索引擎、语音识别、内容审查等功能更好运行的基础模块之一。 + * @param text 待纠错文本,输入限制511字节 + * options 可选参数: + */ + Json::Value ecnet( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_ecnet, null, data.toStyledString(), null); + + return result; + } + + /** + * emotion + * 针对用户日常沟通文本背后所蕴含情绪的一种直观检测,可自动识别出当前会话者所表现出的情绪类别及其置信度,可以帮助企业更全面地把握产品服务质量、监控客户服务质量 + * @param text 待识别情感文本,输入限制512字节 + * options 可选参数: + * scene default(默认项-不区分场景),talk(闲聊对话-如度秘聊天等),task(任务型对话-如导航对话等),customer_service(客服对话-如电信/银行客服等) + */ + Json::Value emotion( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_emotion, null, data.toStyledString(), null); + + return result; + } + + /** + * news_summary + * 自动抽取新闻文本中的关键信息,进而生成指定长度的新闻摘要 + * @param content 字符串(限3000字符数以内)字符串仅支持UTF8编码,长度需小于3000字符数(即6000字节),请输入前确认字符数没有超限,若字符数超长会返回错误。正文中如果包含段落信息,请使用"\n"分隔,段落信息算法中有重要的作用,请尽量保留 + * @param max_summary_len 此数值将作为摘要结果的最大长度。例如:原文长度1000字,本参数设置为150,则摘要结果的最大长度是150字;推荐最优区间:200-500字 + * options 可选参数: + * title 字符串(限200字符数)字符串仅支持UTF8编码,长度需小于200字符数(即400字节),请输入前确认字符数没有超限,若字符数超长会返回错误。标题在算法中具有重要的作用,若文章确无标题,输入参数的“标题”字段为空即可 + */ + Json::Value news_summary( + std::string const & content, + const int & max_summary_len, + const std::map & options) + { + Json::Value data; + + data["content"] = content; + data["max_summary_len"] = max_summary_len; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_news_summary, null, data.toStyledString(), null); + + return result; + } + + /** + * address + * 针对快递、电商行业中客户在线提交的大量非结构化地址单据,该接口可以帮助精准提取快递填单文本中的姓名、电话、地址信息,通过自然语言处理辅助地址识别做自动补充和纠正,生成标准规范的结构化信息,大幅提升企业处理单据的效率。 + * @param text 待识别的文本内容,不超过1000字节 + * options 可选参数: + */ + Json::Value address( + std::string const & text, + const std::map & options) + { + Json::Value data; + + data["text"] = text; + + std::map::const_iterator it; + for (it = options.begin(); it != options.end(); it++) + { + data[it->first] = it->second; + } + + Json::Value result = + this->request(_address, null, data.toStyledString(), null); + + return result; + } + + }; +} +#endif \ No newline at end of file diff --git a/src/aip-cpp-sdk/ocr.h b/src/aip-cpp-sdk/ocr.h new file mode 100755 index 0000000000000000000000000000000000000000..b08a857725ff291a561a35770f0f6ea8ccdde437 --- /dev/null +++ b/src/aip-cpp-sdk/ocr.h @@ -0,0 +1,1110 @@ +/** + * Copyright (c) 2017 Baidu.com, Inc. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * @author baidu aip + */ + +#ifndef __AIP_OCR_H__ +#define __AIP_OCR_H__ + +#include "base/base.h" + +namespace aip { + + class Ocr: public AipBase + { + public: + + + std::string _general_basic = + "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"; + + std::string _accurate_basic = + "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"; + + std::string _general = + "https://aip.baidubce.com/rest/2.0/ocr/v1/general"; + + std::string _accurate = + "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate"; + + std::string _general_enhanced = + "https://aip.baidubce.com/rest/2.0/ocr/v1/general_enhanced"; + + std::string _web_image = + "https://aip.baidubce.com/rest/2.0/ocr/v1/webimage"; + + std::string _idcard = + "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard"; + + std::string _bankcard = + "https://aip.baidubce.com/rest/2.0/ocr/v1/bankcard"; + + std::string _driving_license = + "https://aip.baidubce.com/rest/2.0/ocr/v1/driving_license"; + + std::string _vehicle_license = + "https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license"; + + std::string _license_plate = + "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate"; + + std::string _business_license = + "https://aip.baidubce.com/rest/2.0/ocr/v1/business_license"; + + std::string _receipt = + "https://aip.baidubce.com/rest/2.0/ocr/v1/receipt"; + + std::string _train_ticket = + "https://aip.baidubce.com/rest/2.0/ocr/v1/train_ticket"; + + std::string _taxi_receipt = + "https://aip.baidubce.com/rest/2.0/ocr/v1/taxi_receipt"; + + std::string _form = + "https://aip.baidubce.com/rest/2.0/ocr/v1/form"; + + std::string _table_recognize = + "https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/request"; + + std::string _table_result_get = + "https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/get_request_result"; + + std::string _vin_code = + "https://aip.baidubce.com/rest/2.0/ocr/v1/vin_code"; + + std::string _quota_invoice = + "https://aip.baidubce.com/rest/2.0/ocr/v1/quota_invoice"; + + std::string _household_register = + "https://aip.baidubce.com/rest/2.0/ocr/v1/household_register"; + + std::string _HK_Macau_exitentrypermit = + "https://aip.baidubce.com/rest/2.0/ocr/v1/HK_Macau_exitentrypermit"; + + std::string _taiwan_exitentrypermit = + "https://aip.baidubce.com/rest/2.0/ocr/v1/taiwan_exitentrypermit"; + + std::string _birth_certificate = + "https://aip.baidubce.com/rest/2.0/ocr/v1/birth_certificate"; + + std::string _vehicle_invoice = + "https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_invoice"; + + std::string _vehicle_certificate = + "https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_certificate"; + + std::string _invoice = + "https://aip.baidubce.com/rest/2.0/ocr/v1/invoice"; + + std::string _air_ticket = + "https://aip.baidubce.com/rest/2.0/ocr/v1/air_ticket"; + + std::string _insurance_documents = + "https://aip.baidubce.com/rest/2.0/ocr/v1/insurance_documents"; + + std::string _vat_invoice = + "https://aip.baidubce.com/rest/2.0/ocr/v1/vat_invoice"; + + std::string _qrcode = + "https://aip.baidubce.com/rest/2.0/ocr/v1/qrcode"; + + std::string _numbers = + "https://aip.baidubce.com/rest/2.0/ocr/v1/numbers"; + + std::string _lottery = + "https://aip.baidubce.com/rest/2.0/ocr/v1/lottery"; + + std::string _passport = + "https://aip.baidubce.com/rest/2.0/ocr/v1/passport"; + + std::string _business_card = + "https://aip.baidubce.com/rest/2.0/ocr/v1/business_card"; + + std::string _handwriting = + "https://aip.baidubce.com/rest/2.0/ocr/v1/handwriting"; + + std::string _custom = + "https://aip.baidubce.com/rest/2.0/solution/v1/iocr/recognise"; + + + Ocr(const std::string & app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + /** + * general_basic + * 用户向服务请求识别某张图中的所有文字 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语; + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) + * probability 是否返回识别结果中每一行的置信度 + */ + Json::Value general_basic( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_general_basic, null, data, null); + + return result; + } + + /** + * general_basic_url + * 用户向服务请求识别某张图中的所有文字 + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语; + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) + * probability 是否返回识别结果中每一行的置信度 + */ + Json::Value general_basic_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_general_basic, null, data, null); + + return result; + } + + /** + * accurate_basic + * 用户向服务请求识别某张图中的所有文字,相对于通用文字识别该产品精度更高,但是识别耗时会稍长。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * probability 是否返回识别结果中每一行的置信度 + */ + Json::Value accurate_basic( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_accurate_basic, null, data, null); + + return result; + } + + /** + * general + * 用户向服务请求识别某张图中的所有文字,并返回文字在图中的位置信息。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置 + * language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语; + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) + * vertexes_location 是否返回文字外接多边形顶点位置,不支持单字位置。默认为false + * probability 是否返回识别结果中每一行的置信度 + */ + Json::Value general( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_general, null, data, null); + + return result; + } + + /** + * general_url + * 用户向服务请求识别某张图中的所有文字,并返回文字在图中的位置信息。 + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置 + * language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语; + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) + * vertexes_location 是否返回文字外接多边形顶点位置,不支持单字位置。默认为false + * probability 是否返回识别结果中每一行的置信度 + */ + Json::Value general_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_general, null, data, null); + + return result; + } + + /** + * accurate + * 用户向服务请求识别某张图中的所有文字,并返回文字在图片中的坐标信息,相对于通用文字识别(含位置信息版)该产品精度更高,但是识别耗时会稍长。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置 + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * vertexes_location 是否返回文字外接多边形顶点位置,不支持单字位置。默认为false + * probability 是否返回识别结果中每一行的置信度 + */ + Json::Value accurate( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_accurate, null, data, null); + + return result; + } + + /** + * general_enhanced + * 某些场景中,图片中的中文不光有常用字,还包含了生僻字,这时用户需要对该图进行文字识别,应使用通用文字识别(含生僻字版)。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语; + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) + * probability 是否返回识别结果中每一行的置信度 + */ + Json::Value general_enhanced( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_general_enhanced, null, data, null); + + return result; + } + + /** + * general_enhanced_url + * 某些场景中,图片中的中文不光有常用字,还包含了生僻字,这时用户需要对该图进行文字识别,应使用通用文字识别(含生僻字版)。 + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * language_type 识别语言类型,默认为CHN_ENG。可选值包括:
- CHN_ENG:中英文混合;
- ENG:英文;
- POR:葡萄牙语;
- FRE:法语;
- GER:德语;
- ITA:意大利语;
- SPA:西班牙语;
- RUS:俄语;
- JAP:日语;
- KOR:韩语; + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) + * probability 是否返回识别结果中每一行的置信度 + */ + Json::Value general_enhanced_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_general_enhanced, null, data, null); + + return result; + } + + /** + * web_image + * 用户向服务请求识别一些网络上背景复杂,特殊字体的文字。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) + */ + Json::Value web_image( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_web_image, null, data, null); + + return result; + } + + /** + * web_image_url + * 用户向服务请求识别一些网络上背景复杂,特殊字体的文字。 + * @param url 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效 + * options 可选参数: + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_language 是否检测语言,默认不检测。当前支持(中文、英语、日语、韩语) + */ + Json::Value web_image_url( + std::string const & url, + const std::map & options) + { + std::map data; + + data["url"] = url; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_web_image, null, data, null); + + return result; + } + + /** + * idcard + * 用户向服务请求识别身份证,身份证识别包括正面和背面。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * @param id_card_side front:身份证含照片的一面;back:身份证带国徽的一面 + * options 可选参数: + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * detect_risk 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能,默认不开启,即:false。可选值:true-开启;false-不开启 + */ + Json::Value idcard( + std::string const & image, + std::string const & id_card_side, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + data["id_card_side"] = id_card_side; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_idcard, null, data, null); + + return result; + } + + /** + * bankcard + * 识别银行卡并返回卡号和发卡行。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value bankcard( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_bankcard, null, data, null); + + return result; + } + + /** + * driving_license + * 对机动车驾驶证所有关键字段进行识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + */ + Json::Value driving_license( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_driving_license, null, data, null); + + return result; + } + + /** + * vehicle_license + * 对机动车行驶证正本所有关键字段进行识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + * accuracy normal 使用快速服务,1200ms左右时延;缺省或其它值使用高精度服务,1600ms左右时延 + */ + Json::Value vehicle_license( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_vehicle_license, null, data, null); + + return result; + } + + /** + * license_plate + * 识别机动车车牌,并返回签发地和号牌。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * multi_detect 是否检测多张车牌,默认为false,当置为true的时候可以对一张图片内的多张车牌进行识别 + */ + Json::Value license_plate( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_license_plate, null, data, null); + + return result; + } + + /** + * business_license + * 识别营业执照,并返回关键字段的值,包括单位名称、法人、地址、有效期、证件编号、社会信用代码等。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value business_license( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_business_license, null, data, null); + + return result; + } + + /** + * receipt + * 用户向服务请求识别医疗票据、发票、的士票、保险保单等票据类图片中的所有文字,并返回文字在图中的位置信息。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置 + * probability 是否返回识别结果中每一行的置信度 + * accuracy normal 使用快速服务,1200ms左右时延;缺省或其它值使用高精度服务,1600ms左右时延 + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + */ + Json::Value receipt( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_receipt, null, data, null); + + return result; + } + + /** + * train_ticket + * 支持对大陆火车票的车票号、始发站、目的站、车次、日期、票价、席别、姓名进行结构化识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value train_ticket( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_train_ticket, null, data, null); + + return result; + } + + /** + * taxi_receipt + * 针对出租车票(现支持北京)的发票号码、发票代码、车号、日期、时间、金额进行结构化识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value taxi_receipt( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_taxi_receipt, null, data, null); + + return result; + } + + /** + * form + * 自动识别表格线及表格内容,结构化输出表头、表尾及每个单元格的文字内容。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value form( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_form, null, data, null); + + return result; + } + + /** + * table_recognize + * 自动识别表格线及表格内容,结构化输出表头、表尾及每个单元格的文字内容。表格文字识别接口为异步接口,分为两个API:提交请求接口、获取结果接口。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value table_recognize( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_table_recognize, null, data, null); + + return result; + } + + /** + * table_result_get + * 获取表格文字识别结果 + * @param request_id 发送表格文字识别请求时返回的request id + * options 可选参数: + * result_type 期望获取结果的类型,取值为“excel”时返回xls文件的地址,取值为“json”时返回json格式的字符串,默认为”excel” + */ + Json::Value table_result_get( + std::string const & request_id, + const std::map & options) + { + std::map data; + + data["request_id"] = request_id; + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_table_result_get, null, data, null); + + return result; + } + + /** + * vin_code + * 对车辆车架上、挡风玻璃上的VIN码进行识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value vin_code( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_vin_code, null, data, null); + + return result; + } + + /** + * quota_invoice + * 对各类定额发票的代码、号码、金额进行识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value quota_invoice( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_quota_invoice, null, data, null); + + return result; + } + + /** + * household_register + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】对出生地、出生日期、姓名、民族、与户主关系、性别、身份证号码字段进行识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value household_register( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_household_register, null, data, null); + + return result; + } + + /** + * HK_Macau_exitentrypermit + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】对港澳通行证证号、姓名、姓名拼音、性别、有效期限、签发地点、出生日期字段进行识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value HK_Macau_exitentrypermit( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_HK_Macau_exitentrypermit, null, data, null); + + return result; + } + + /** + * taiwan_exitentrypermit + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】对台湾通行证证号、签发地、出生日期、姓名、姓名拼音、性别、有效期字段进行识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value taiwan_exitentrypermit( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_taiwan_exitentrypermit, null, data, null); + + return result; + } + + /** + * birth_certificate + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】对台湾通行证证号、签发地、出生日期、姓名、姓名拼音、性别、有效期字段进行识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value birth_certificate( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_birth_certificate, null, data, null); + + return result; + } + + /** + * vehicle_invoice + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】识别机动车销售发票号码、代码、日期、价税合计等14个字段 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value vehicle_invoice( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_vehicle_invoice, null, data, null); + + return result; + } + + /** + * vehicle_certificate + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】识别车辆合格证编号、车架号、排放标准、发动机编号等12个字段 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value vehicle_certificate( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_vehicle_certificate, null, data, null); + + return result; + } + + /** + * invoice + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】对国家/地方税务局发行的横/竖版通用机打发票的号码、代码、日期、合计金额、类型、商品名称字段进行结构化识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * location 是否输出位置信息,true:输出位置信息,false:不输出位置信息,默认false + */ + Json::Value invoice( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_invoice, null, data, null); + + return result; + } + + /** + * air_ticket + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】对飞机行程单中的姓名、始发站、目的站、航班号、日期、票价字段进行结构化识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * location 是否输出位置信息,true:输出位置信息,false:不输出位置信息,默认false + */ + Json::Value air_ticket( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_air_ticket, null, data, null); + + return result; + } + + /** + * insurance_documents + * 【此接口需要您在[申请页面](https://cloud.baidu.com/survey/AICooperativeConsultingApply.html)中提交合作咨询开通权限】对各类保单中投保人、受益人的各项信息、保费、保险名称等字段进行结构化识别 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * rkv_business 是否进行商业逻辑处理,rue:进行商业逻辑处理,false:不进行商业逻辑处理,默认true + */ + Json::Value insurance_documents( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_insurance_documents, null, data, null); + + return result; + } + + /** + * vat_invoice + * 此接口需要您在页面中提交合作咨询开通权限】 识别并结构化返回增值税发票的各个字段及其对应值,包含了发票基础信息9项,货物相关信息12项,购买方/销售方的名称、识别号、地址电话、开户行及账号,共29项结构化字段。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value vat_invoice( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_vat_invoice, null, data, null); + + return result; + } + + /** + * qrcode + * 【此接口需要您在[页面](http://ai.baidu.com/tech/ocr)中提交合作咨询开通权限识别条形码、二维码中包含的URL或其他信息内容 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value qrcode( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_qrcode, null, data, null); + + return result; + } + + /** + * numbers + * 【此接口需要您在[页面](http://ai.baidu.com/tech/ocr)中提交合作咨询开通权限】对图像中的阿拉伯数字进行识别提取,适用于快递单号、手机号、充值码提取等场景 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置 + * detect_direction 是否检测图像朝向,默认不检测,即:false。朝向是指输入图像是正常方向、逆时针旋转90/180/270度。可选值包括:
- true:检测朝向;
- false:不检测朝向。 + */ + Json::Value numbers( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_numbers, null, data, null); + + return result; + } + + /** + * lottery + * 【此接口需要您在[页面](http://ai.baidu.com/tech/ocr)中提交合作咨询开通权限】对大乐透、双色球彩票进行识别,并返回识别结果 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置 + */ + Json::Value lottery( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_lottery, null, data, null); + + return result; + } + + /** + * passport + * 【此接口需要您在[页面](http://ai.baidu.com/tech/ocr)中提交合作咨询开通权限】支持对中国大陆居民护照的资料页进行结构化识别,包含国家码、姓名、性别、护照号、出生日期、签发日期、有效期至、签发地点。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value passport( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_passport, null, data, null); + + return result; + } + + /** + * business_card + * 【此接口需要您在[页面](http://ai.baidu.com/tech/ocr)中提交合作咨询开通权限】提供对各类名片的结构化识别功能,提取姓名、邮编、邮箱、电话、网址、地址、手机号字段 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + */ + Json::Value business_card( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_business_card, null, data, null); + + return result; + } + + /** + * handwriting + * 【此接口需要您在[页面](http://ai.baidu.com/tech/ocr)中提交合作咨询开通权限】提供对各类名片的结构化识别功能,提取姓名、邮编、邮箱、电话、网址、地址、手机号字段 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * recognize_granularity 是否定位单字符位置,big:不定位单字符位置,默认值;small:定位单字符位置 + */ + Json::Value handwriting( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_handwriting, null, data, null); + + return result; + } + + /** + * custom + * 自定义模板文字识别,是针对百度官方没有推出相应的模板,但是当用户需要对某一类卡证/票据(如房产证、军官证、火车票等)进行结构化的提取内容时,可以使用该产品快速制作模板,进行识别。 + * @param image 图像文件二进制内容,可以使用aip::get_file_content函数获取 + * options 可选参数: + * templateSign 您在自定义文字识别平台制作的模板的ID + * classifierId 分类器Id。这个参数和templateSign至少存在一个,优先使用templateSign。存在templateSign时,表示使用指定模板;如果没有templateSign而有classifierId,表示使用分类器去判断使用哪个模板 + */ + Json::Value custom( + std::string const & image, + const std::map & options) + { + std::map data; + + data["image"] = base64_encode(image.c_str(), (int) image.size()); + + std::copy(options.begin(), options.end(), std::inserter(data, data.end())); + + Json::Value result = + this->request(_custom, null, data, null); + + return result; + } + + + }; +} +#endif \ No newline at end of file diff --git a/src/aip-cpp-sdk/speech.h b/src/aip-cpp-sdk/speech.h new file mode 100755 index 0000000000000000000000000000000000000000..7dcd69e00921780f6f3075906808612653450d0a --- /dev/null +++ b/src/aip-cpp-sdk/speech.h @@ -0,0 +1,190 @@ +#ifndef __AIP_SPEECH_H__ +#define __AIP_SPEECH_H__ +#include "base/base.h" + +#include + +namespace aip { + + class Speech: public AipBase + { + public: + + std::string _asr = "https://vop.baidu.com/server_api"; + + std::string _tts = "http://tsn.baidu.com/text2audio"; + + std::string _asr_pro = "https://vop.baidu.com/pro_api"; + + Speech(const std::string app_id, const std::string & ak, const std::string & sk): AipBase(app_id, ak, sk) + { + } + + + Json::Value request_asr( + std::string const & url, + Json::Value & data) + { + std::string response; + Json::Value obj; + int status_code = this->client.post(url, nullptr, data, nullptr, &response); + + if (status_code != CURLcode::CURLE_OK) { + obj[aip::CURL_ERROR_CODE] = status_code; + return obj; + } + + std::string error; + std::unique_ptr reader(crbuilder.newCharReader()); + reader->parse(response.data(), response.data() + response.size(), &obj, &error); + + return obj; + } + + Json::Value request_tts( + const std::string url, + std::map & data, + std::string & file_content) + { + std::string response; + Json::Value obj; + Json::Value file_json; + int status_code = this->client.post(url, nullptr, data, nullptr, &response); + if (status_code != CURLcode::CURLE_OK) { + obj[aip::CURL_ERROR_CODE] = status_code; + return obj; + } + std::string error; + std::unique_ptr reader(crbuilder.newCharReader()); + reader->parse(response.data(), response.data() + response.size(), &obj, &error); + + if (error.empty()) { + // 接口返回错误信息 + obj[aip::CURL_ERROR_CODE] = 0; + } else { + // 接口返回语音文件 + file_content = response; + } + return obj; + } + + + Json::Value recognize(const std::string voice_binary, const std::string & format, const int & rate, std::map const & options) + { + Json::Value data; + + std::map::const_iterator it; + for(it=options.begin(); it!=options.end(); it++) + { + if (it->first == "dev_pid") { + try { + data[it->first] = std::stoi(it->second); + } catch (std::exception &e) { + } + } else { + data[it->first] = it->second; + } + } + + std::string token = this->getAccessToken(); + + data["speech"] = base64_encode(voice_binary.c_str(), (int) voice_binary.size()); + data["format"] = format; + data["rate"] = std::to_string(rate); + data["channel"] = "1"; + data["token"] = token; + data["cuid"] = this->getAk(); + data["len"] = (int) voice_binary.size(); + + Json::Value result = this->request_asr(_asr, data); + return result; + } + + Json::Value recognize_pro(const std::string voice_binary, const std::string & format, const int & rate, std::map const & options) + { + Json::Value data; + + std::map::const_iterator it; + + data["dev_pid"] = 80001; + for (it=options.begin(); it!=options.end(); it++) + { + if (it->first == "dev_pid") { + try { + data[it->first] = std::stoi(it->second); + } catch (std::exception &e) { + + } + } else { + data[it->first] = it->second; + } + } + + std::string token = this->getAccessToken(); + + data["speech"] = base64_encode(voice_binary.c_str(), (int) voice_binary.size()); + data["format"] = format; + data["rate"] = std::to_string(rate); + data["channel"] = "1"; + data["token"] = token; + data["cuid"] = this->getAk(); + data["len"] = (int) voice_binary.size(); + + Json::Value result = this->request_asr(_asr_pro, data); + return result; + } + + + Json::Value recognize_url(const std::string & url, + const std::string & callback, const std::string & format, + const int & rate, + std::map options) + { + Json::Value data; + std::map::iterator it; + + for(it=options.begin(); it!=options.end(); it++) + { + data[it->first] = it->second; + } + + std::string token = this->getAccessToken(); + + data["url"] = url; + data["callback"] = callback; + data["format"] = format; + data["rate"] = std::to_string(rate); + data["channel"] = 1; + data["token"] = token; + data["cuid"] = this->getAk(); + + Json::Value result = this->request_asr(_asr, data); + return result; + } + + Json::Value text2audio(const std::string & text, std::map const & options, std::string & file_content) + { + std::map data; + std::map::const_iterator it; + + for(it = options.begin(); it !=options.end(); it++) + { + data[it->first] = it->second; + } + + std::string token = this->getAccessToken(); + + data["tex"] = text; + data["lan"] = "zh"; + data["ctp"] = "1"; + data["tok"] = token; + data["cuid"] = this->getAk(); + + Json::Value result = this->request_tts(_tts, data, file_content); + return result; + } + + }; + +} +#endif diff --git a/src/database.cpp b/src/database.cpp new file mode 100644 index 0000000000000000000000000000000000000000..be33962150b8d7621a1ffbeb94b57dfa2f6d2066 --- /dev/null +++ b/src/database.cpp @@ -0,0 +1,262 @@ +#include "database.h" + + +Databass::Databass() +{ + db = QSqlDatabase::addDatabase("QSQLITE"); + db.setDatabaseName("attendance.db"); + openDb(); + createTable(); +} + +Databass::~Databass() +{ + db.close(); +} + + +void Databass::createTable() +{ + /** + *此函数用于创建数据库表单 + * 1、创建考勤记录表:根据获取的本地时间,以Attendance_xxxx_xx_xx为名称,默认存在两个字段:序号 员工工号 + * 2、创建员工信息表:名称:employees,默认存在两个字段:employeeId,name + * 当存在此表单,就不创建,不存在就创建; + */ + + //1、创建数据库对象 + QSqlQuery query; + //2、创建Attendance_xxxx/xx/xx考勤记录表 + QString localTime = getTime(); + tableName = "Attendance_"+localTime; + QString creatTable_sql = "create table if not exists " + + tableName + + " (serialNum integer primary key autoincrement," + "employeeId)"; + if(!query.exec(creatTable_sql)) + { + qDebug()<setQuery(query); + int ncolumn = queryModel->columnCount(); + return ncolumn; +} + +int Databass::insertEmployeeInfo(std::string id, std::string name) +{ + /* + * 向employees表中插入员工信息 + * @param id 员工工号 + * @param name 员工姓名 + * @retval 0 插入成功 + * @retval -1 插入失败 + */ + QSqlQuery query; + QString employeeId = QString::fromStdString(id); + QString employeeName = QString::fromStdString(name); + + query.prepare("insert into employees (employeeId,name) values(?,?)"); + query.addBindValue(employeeId); + query.addBindValue(employeeName); + if(!query.exec()) + { + qDebug()< + +#include +#include +#include +#include + +#include +#include + +#include + + +class Databass +{ +public: + Databass(); + ~Databass(); + int punch(std::string id, time_t time); + int getTableColoum(); + + int insertEmployeeInfo(std::string id,std::string name); + int getname(std::string id,std::string & name); + +private: + QSqlDatabase db; + QString tableName; + + void createTable(); + void openDb(); + + QString getTime(); +}; + +#endif // DATABASS_H diff --git a/src/face_attend.pro b/src/face_attend.pro new file mode 100644 index 0000000000000000000000000000000000000000..82214139e718f39c9ec5cba32624db7d16e18f5c --- /dev/null +++ b/src/face_attend.pro @@ -0,0 +1,46 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2020-04-02T14:49:48 +# +#------------------------------------------------- + +QT += core gui sql + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = face_attend +TEMPLATE = app + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which has been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +CONFIG += c++11 link_pkgconfig + +PKGCONFIG += opencv libcurl jsoncpp sqlite3 libcrypto + +SOURCES += \ + main.cpp \ + widget.cpp \ + database.cpp \ + myface.cpp + +HEADERS += \ + widget.h \ + database.h \ + myface.h + +FORMS += \ + widget.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..90b6d53fb950c511da62d02bc34fe46d660069f5 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,11 @@ +#include "widget.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + Widget w; + w.show(); + + return a.exec(); +} diff --git a/src/myface.cpp b/src/myface.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d7beb0a0225bd8f89b9ec309a3445c23fec28196 --- /dev/null +++ b/src/myface.cpp @@ -0,0 +1,73 @@ +#include "myface.h" +#include +#include +#include + +using namespace std; +using namespace cv; + + +MyFace::MyFace(string model) +{ + //加载人脸检测模型 + classifier.load(model); + +} + +void MyFace::detect(cv::Mat image) +{ + Rect face(0, 0, 0, 0); + //处理图像 + cv::cvtColor(image,image, CV_BGR2GRAY); + cv::equalizeHist(image, image); + //获取到的人脸(可以是多个) + vector faces; + //开始识别 + classifier.detectMultiScale(image,faces,1.1,3,0,cv::Size(50,50)); + //有人脸图像 + if(faces.size()) + { + //取第一个人脸图像给face引用 + face = faces[0]; + } + emit detected(face); +} + +void MyFace::recognize(cv::Mat face) +{ + Employee e; + //设置百度的连接信息 + aip::Face *client; + //填写自己的key + client = new aip::Face("","",""); + //设置缓冲区 + vector buf; + //将图像压缩为jpg格式到buf缓冲区中 + imencode(".jpg",face,buf); + //压缩图像后转换成百度需要的base64编码 + string faceimg = aip::base64_encode((char*)buf.data(),buf.size()); + //开始在百度自定义人脸库中搜索,返回结果json + Json::Value json = client->search(faceimg,"BASE64", "group1",aip::null); + /* + Json::StyledWriter writer; + qDebug()<<"hello"; + string temp_str = writer.write(json); + QString qstr = QString::fromStdString(temp_str); + //qDebug()< +#include +#include +#include +#include + +Q_DECLARE_METATYPE(cv::Mat); +Q_DECLARE_METATYPE(cv::Rect); + +using namespace cv; + +struct Employee +{ + std::string depart_id; //<部门 + std::string id; //< 工号 + std::string info; //< 员工信息 + double score; //< 相似度得分 +}; + +Q_DECLARE_METATYPE(Employee); + +typedef int (*face_callback_t)(Employee& e, void* data); +class MyFace : public QObject +{ + Q_OBJECT +public: + MyFace(std::string model); + +signals: + //void detected(cv::Mat image); + void detected(cv::Rect face); + void recognized(Employee e); + +public slots: + /** + * 检测图像中是否存在人脸 + * @param image 待检测图像 + */ + void detect(cv::Mat image); + /** + * 识别人脸 + * 创建线程,将人脸图像进行压缩和BASE64编码后发送给百度云 + * 解析百度云API返回的结果: + * @param face 待识别的人脸图像 + */ + void recognize(cv::Mat face); +private: + cv::CascadeClassifier classifier; + cv::Mat image; + +}; + +#endif // FACE_H diff --git a/src/widget.cpp b/src/widget.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e5d8b43d29dd1d2a548edd412aca57c7a7c3c1db --- /dev/null +++ b/src/widget.cpp @@ -0,0 +1,150 @@ +#include "widget.h" +#include "ui_widget.h" +#include +#include + + +Widget::Widget(QWidget *parent) : + QWidget(parent), + ui(new Ui::Widget), + cam(0), + frame(0), + hit(0) +{ + ui->setupUi(this); + //初始化计时器 + timer = new QTimer(this); + //绑定计时器的时间到了的事件,连接到刷新函数 + connect(timer, &QTimer::timeout, this, &Widget::update); + //开启计时器 + timer->start(40); + //设置使用的人脸检测模型 + std::string model = "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml"; + face = new MyFace(model); + face->moveToThread(&facethread); + db = new Databass(); + + //qt不支持自定义的变量类型在线程间传递,要声明注册之后才可以使用 这是注册 声明在头文件 + qRegisterMetaType("cv::Mat"); + qRegisterMetaType("cv::Rect"); + qRegisterMetaType("Employee"); + + connect(this, &Widget::doDetect, face, &MyFace::detect); + connect(face, &MyFace::detected, this, &Widget::updateFace); + connect(this, &Widget::doRecognize, face, &MyFace::recognize); + connect(face, &MyFace::recognized, this, &Widget::updateInfo); + //connect(&facethread, &QThread::finished, face, &MyFace::deleteL); + + facethread.start(); + +} + +int Widget::show_result(Employee &e, void *data) +{ + return 0; +} +void Widget::updateFace(cv::Rect face) +{ + range = face; + if(face != cv::Rect(0, 0, 0, 0)) + { + hit++; + }else { + hit = 0; +} +} +void Widget::updateInfo(Employee user) +{ + time_t now = QDateTime::currentDateTime().toTime_t(); + if(db->punch(user.id, now)) + { + return; + } + std::string name = ""; + if(db->getname(user.id, name)) + { + return; + } + ui->label_showname->setText(user.id.c_str()); + ui->label_id->setText(name.c_str()); + ui->label_time->setText(QDateTime::fromTime_t(now).toString("yyyy.MM.dd hh:mm:ss")); + +} +void Widget::update() +{ + cv::Mat image; + cam >> image; + frame++; + //每5帧检测一次人脸 + if((frame%5) == 0) + { + frame = 0; + emit doDetect(image); + } + //5次连续检测到人人脸才会调用百度api进行人脸识别 + if(5 == hit) + { + hit = 0; + //根据人脸块的信息从照片中获取到较小的人脸图 + cv::Mat faceimg(image, range); + emit doRecognize(faceimg); + } + //在图像上显示人脸的框 + cv::rectangle(image,range, CV_RGB(255,0,0)); + //格式的转换 让图像可以在qt中显示 + cv::cvtColor(image, image, CV_BGR2RGB); + QImage qimage(image.data, image.cols, image.rows, + image.step, QImage::Format_RGB888); + ui->label->setPixmap(QPixmap::fromImage(qimage)); +} +//void Widget::update() +//{ +// cv::Mat image; +// cam >> image; +// frame++; +// //每5帧检测一次人脸 +// if((frame%5) == 0) +// { +// frame = 0; +// //获取人脸信息到range +// if(face->detect(image)) +// { +// hit++; +// }else { +// hit = 0; +// } +// } +// //5次连续检测到人人脸才会调用百度api进行人脸识别 +// if(5 == hit) +// { +// hit = 0; +// //根据人脸块的信息从照片中获取到较小的人脸图 +// cv::Mat faceimg(image,range); +// //使用人脸识别接口,成功返回1 +// if(face->recognize(faceimg, user)) +// { +// //在ui中显示打卡成功的信息 +// ui->label_result->setText("打卡成功"); +// ui->label_showname->setText(QString::fromStdString(user.id)); +// //时间暂时没用到,在数据库接口里有其他调用 +// time_t t; +// db->punch(user.id, t); +// } +// //std::string name = db->getname(user.id); +// } +// //在图像上显示人脸的框 +// cv::rectangle(image,range, CV_RGB(255,0,0)); +// //格式的转换 让图像可以在qt中显示 +// cv::cvtColor(image, image, CV_BGR2RGB); +// QImage qimage(image.data, image.cols, image.rows, +// image.step, QImage::Format_RGB888); +// ui->label->setPixmap(QPixmap::fromImage(qimage)); +//} + +Widget::~Widget() +{ + delete ui; + //delete face; +} + + diff --git a/src/widget.h b/src/widget.h new file mode 100644 index 0000000000000000000000000000000000000000..229082612cbb9845ae3c95c816039b342325689b --- /dev/null +++ b/src/widget.h @@ -0,0 +1,48 @@ +#ifndef WIDGET_H +#define WIDGET_H + +#include +#include +#include +#include "database.h" +#include +#include + +using namespace cv; +using namespace std; +namespace Ui { +class Widget; +} + +class Widget : public QWidget +{ + Q_OBJECT + +public: + explicit Widget(QWidget *parent = nullptr); + ~Widget(); + int show_result(Employee &e, void *data); +signals: + void doDetect(cv::Mat); + void doRecognize(cv::Mat); +private slots: + void update(); + void updateFace(cv::Rect); + void updateInfo(Employee); + +private: + Ui::Widget *ui; + cv::VideoCapture cam; //摄像头拍摄到的一帧图像 + QTimer* timer; //用于定时,时间到了会触发update函数 + MyFace *face; //人脸检测,识别类 + Rect range; //人脸区域 + int frame; //用于统计相机的帧数 + int hit; // 用于统计识别到人脸的数量 + Employee user; //用户的结构体 + Databass *db; //数据库类 + QThread facethread; + QElapsedTimer t; + +}; + +#endif // WIDGET_H diff --git a/src/widget.ui b/src/widget.ui new file mode 100644 index 0000000000000000000000000000000000000000..28eda05613132fc9d69a3ba67ac7888eb5ee4129 --- /dev/null +++ b/src/widget.ui @@ -0,0 +1,117 @@ + + + Widget + + + + 0 + 0 + 942 + 651 + + + + Widget + + + + + 0 + 170 + 640 + 480 + + + + TextLabel + + + true + + + + + + 90 + 10 + 481 + 111 + + + + XXX公司的logo + + + + + + 750 + 120 + 51 + 22 + + + + 姓名: + + + + + + 830 + 120 + 68 + 22 + + + + TextLabel + + + + + + 750 + 200 + 161 + 91 + + + + + + + true + + + + + + 780 + 70 + 68 + 22 + + + + TextLabel + + + + + + 790 + 170 + 68 + 22 + + + + TextLabel + + + + + + +