feat.支持企鹅物流api的关卡json转识别用的关卡json

This commit is contained in:
MistEO
2021-10-04 18:05:56 +08:00
parent 2e5452503a
commit fac88d3a48
4 changed files with 41750 additions and 7 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -36,6 +36,7 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg)
m_callback(AsstMsg::InitFaild, callback_json, m_callback_arg);
};
/* 项目本身的Configer */
bool ret = Configer::get_instance().load(GetResourceDir() + "config.json");
if (!ret) {
callback_error("config.json");
@@ -57,6 +58,7 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg)
throw "resource broken";
}
/* 项目使用的图片模板 */
m_identify_ptr = std::make_shared<Identify>();
for (const auto& [name, info] : TaskConfiger::get_instance().m_all_tasks_info) {
if (info->algorithm != AlgorithmType::MatchTemplate) {
@@ -77,6 +79,7 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg)
}
}
/* 第三方库`OcrLite`所需资源*/
m_identify_ptr->set_ocr_param(Configer::get_instance().m_options.ocr_gpu_index, Configer::get_instance().m_options.ocr_thread_number);
ret = m_identify_ptr->ocr_init_models(GetResourceDir() + "OcrLiteOnnx\\models\\");
if (!ret) {
@@ -84,6 +87,10 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg)
throw "resource broken";
}
/* 第三方库`penguin-stats-recognize`(企鹅物流掉落识别)所需资源*/
m_identify_ptr->penguin_load_server("CN");
m_identify_ptr->penguin_load_json(GetResourceDir() + "penguin-stats-recognize\\json\\stages.json", GetResourceDir() + "penguin-stats-recognize\\json\\hash_index.json");
for (const auto& file : std::filesystem::directory_iterator(GetResourceDir() + "penguin-stats-recognize\\items")) {
ret = m_identify_ptr->penguin_load_templ(file.path().stem().u8string(), file.path().u8string());
if (!ret) {
@@ -91,9 +98,8 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg)
throw "resource broken";
}
}
m_identify_ptr->penguin_load_json(GetResourceDir() + "penguin-stats-recognize\\json\\stage_index.json", GetResourceDir() + "penguin-stats-recognize\\json\\hash_index.json");
m_identify_ptr->penguin_load_server("CN");
/* 用户配置 */
ret = UserConfiger::get_instance().load(GetCurrentDir() + "user.json");
if (!ret) {
callback_error("user.json");

View File

@@ -7,6 +7,8 @@
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
#include <json.h>
namespace penguin {
#include <penguin-stats-recognize/penguin_wasm.h>
}
@@ -254,15 +256,14 @@ std::vector<TextArea> asst::Identify::find_text(const cv::Mat& image, const std:
bool asst::Identify::penguin_load_server(const std::string& server)
{
m_penguin_server = server;
penguin::load_server(server.c_str());
return true;
}
bool asst::Identify::penguin_load_json(const std::string& stage_path, const std::string& hash_path)
{
// TODO文件检查
auto load_json_string = [](const std::string& path) -> std::string {
auto load_file = [](const std::string& path) -> std::string {
std::ifstream ifs(path, std::ios::in);
if (!ifs.is_open()) {
return std::string();
@@ -273,7 +274,45 @@ bool asst::Identify::penguin_load_json(const std::string& stage_path, const std:
return iss.str();
};
penguin::load_json(load_json_string(stage_path).c_str(), load_json_string(hash_path).c_str());
auto stage_parse_ret = json::parse(load_file(stage_path));
if (!stage_parse_ret) {
return false;
}
// stage_json 来自 https://penguin-stats.io/PenguinStats/api/v2/stages
// 和接口需要的json有点区别这里做个转换
json::value stage_json = std::move(stage_parse_ret.value());
json::object cvt_stage_json;
try {
for (const json::value& stage_info : stage_json.as_array()) {
if (!stage_info.exist("dropInfos")) { // 这种一般是以前的活动关,现在已经关闭了的
continue;
}
std::string key = stage_info.at("code").as_string();
json::value stage_dst;
stage_dst["stageId"] = stage_info.at("stageId");
std::vector<json::value> drops_vector;
for (const json::value& drop_info : stage_info.at("dropInfos").as_array()) {
if (drop_info.exist("itemId")) {
if (drop_info.at("dropType").as_string() == "FURNITURE") { // 幸运掉落,家具啥的,企鹅物流不接,忽略掉
continue;
}
drops_vector.emplace_back(drop_info.at("itemId"));
}
}
stage_dst["drops"] = json::array(std::move(drops_vector));
std::string server = m_penguin_server.empty() ? "CN" : m_penguin_server;
stage_dst["existence"] = stage_info.at("existence").at(server).at("exist");
cvt_stage_json.emplace(std::move(key), std::move(stage_dst));
}
}
catch (json::exception& e) {
DebugTraceError(stage_path, "parse error", e.what());
return false;
}
std::string cvt_stage_string = cvt_stage_json.to_string();
//DebugTrace("stage_index | ", cvt_stage_string);
penguin::load_json(cvt_stage_string.c_str(), load_file(hash_path).c_str());
return true;
}
@@ -293,7 +332,9 @@ std::string asst::Identify::penguin_recognize(const cv::Mat& image)
{
std::vector<uchar> buf;
cv::imencode(".png", image, buf);
return penguin::recognize(buf.data(), buf.size());
std::string res = penguin::recognize(buf.data(), buf.size());
DebugTrace("penguin_recognize | ", res);
return res;
}
/*

View File

@@ -67,6 +67,8 @@ namespace asst {
std::unordered_map<std::string, cv::Mat> m_mat_map;
std::unordered_map<std::string, std::pair<cv::Rect, cv::Mat>> m_cache_map; // 位置、直方图缓存
std::string m_penguin_server;
OcrLiteCaller m_ocr_lite;
};
}