Merge branch 'infrast' of https://github.com/MistEO/MeoAssistance into infrast

This commit is contained in:
MistEO
2021-09-03 21:08:06 +08:00
7 changed files with 34 additions and 11 deletions

View File

@@ -102,14 +102,13 @@ bool AsstSetParam(asst::Assistance* p_asst, const char* type, const char* param,
return p_asst->set_param(type, param, value);
}
bool AsstRunOpenRecruit(asst::Assistance* p_asst, const int required_level[], bool set_time)
bool AsstRunOpenRecruit(asst::Assistance* p_asst, const int required_level[], int required_len, bool set_time)
{
if (p_asst == NULL) {
return false;
}
int len = sizeof(required_level) / sizeof(const int);
std::vector<int> level_vector;
level_vector.assign(required_level, required_level + len);
level_vector.assign(required_level, required_level + required_len);
p_asst->start_open_recruit(level_vector, set_time);
return true;
}

View File

@@ -86,7 +86,7 @@ std::pair<std::vector<cv::KeyPoint>, cv::Mat> asst::Identify::surf_detect(const
constexpr int min_hessian = 400;
// SURF特征点检测
cv::Ptr<SURF> detector = SURF::create(min_hessian);
static cv::Ptr<SIFT> detector = SIFT::create(min_hessian);
std::vector<KeyPoint> keypoints;
cv::Mat mat_vector;
// 找到特征点并计算特征描述子(向量)
@@ -191,7 +191,7 @@ std::optional<asst::Rect> asst::Identify::feature_match(
std::vector<cv::DMatch> good_matchs;
std::vector<cv::Point> good_points;
// TODO这个阈值需要根据分辨率进行缩放而且最好写到配置文件里
constexpr static int DistanceThreshold = 200;
constexpr static int DistanceThreshold = 100;
for (size_t i = 0; i != train_ransac_keypoints.size(); ++i) {
// 没必要算距离x y各算一下就行了省点CPU时间
//int distance = std::sqrt(std::pow(avg_point.x - cur_x, 2) + std::pow(avg_point.y - cur_y, 2));

View File

@@ -159,6 +159,8 @@ std::vector<TextArea> asst::IdentifyOperTask::detect_opers(
int cropped_height = image.rows * m_cropped_height_ratio;
int cropped_upper_y = image.rows * m_cropped_upper_y_ratio;
cv::Mat upper_part_name_image = image(cv::Rect(0, cropped_upper_y, image.cols, cropped_height));
cv::cvtColor(upper_part_name_image, upper_part_name_image, cv::COLOR_BGR2GRAY);
cv::cvtColor(upper_part_name_image, upper_part_name_image, cv::COLOR_GRAY2BGR);
std::vector<TextArea> upper_text_area = ocr_detect(upper_part_name_image); // 所有文字
// 因为图片是裁剪过的,所以对应原图的坐标要加上裁剪的参数
@@ -181,6 +183,8 @@ std::vector<TextArea> asst::IdentifyOperTask::detect_opers(
// 下半部分的干员
int cropped_lower_y = image.rows * m_cropped_lower_y_ratio;
cv::Mat lower_part_name_image = image(cv::Rect(0, cropped_lower_y, image.cols, cropped_height));
cv::cvtColor(lower_part_name_image, lower_part_name_image, cv::COLOR_BGR2GRAY);
cv::cvtColor(lower_part_name_image, lower_part_name_image, cv::COLOR_GRAY2BGR);
std::vector<TextArea> lower_text_area = ocr_detect(lower_part_name_image); // 所有文字
// 因为图片是裁剪过的,所以对应原图的坐标要加上裁剪的参数
@@ -230,6 +234,12 @@ std::vector<TextArea> asst::IdentifyOperTask::detect_opers(
// 用特征检测再筛选一遍OCR识别漏了的——有关键字的
for (const TextArea& textarea : all_text_area) {
auto find_iter = std::find_if(all_opers_textarea.cbegin(), all_opers_textarea.cend(),
[&textarea](const auto& rhs) -> bool {
return textarea.text == rhs.text; });
if (find_iter != all_opers_textarea.cend()) {
continue;
}
for (auto iter = feature_cond.begin(); iter != feature_cond.end(); ++iter) {
auto& [key, value] = *iter;
// 识别到了key但是没识别到value这种情况就需要进行特征检测进一步确认了
@@ -322,8 +332,22 @@ int asst::IdentifyOperTask::detect_elite(const cv::Mat& image, const asst::Rect
cv::Mat elite_mat = image(elite_rect);
// for debug
// 这两个图是在2560*1440下截的准备做模板匹配所以要缩放一下
// TODO后面再弄完整的工程化先简单缩放下
static cv::Mat elite1 = cv::imread(GetResourceDir() + "operators\\Elite1.png");
static cv::Mat elite2 = cv::imread(GetResourceDir() + "operators\\Elite2.png");
static bool scaled = false;
if (!scaled) {
scaled = true;
double ratio = image.rows / 1440.0;
cv::Size size1(elite1.size().width * ratio, elite1.size().height * ratio);
cv::resize(elite1, elite1, size1);
cv::Size size2(elite2.size().width * ratio, elite2.size().height * ratio);
cv::resize(elite2, elite2, size2);
}
auto&& [score1, point1] = OcrAbstractTask::m_identify_ptr->match_template(elite_mat, elite1);
auto&& [score2, point2] = OcrAbstractTask::m_identify_ptr->match_template(elite_mat, elite2);
if (score1 > score2 && score1 > 0.7) {

View File

@@ -160,7 +160,7 @@ bool OpenRecruitTask::run()
return lhs.second.max_level > rhs.second.max_level;
}
// 平均等级高的,排前面
else if (std::fabs(lhs.second.avg_level - rhs.second.avg_level) < DoubleDiff) {
else if (std::fabs(lhs.second.avg_level - rhs.second.avg_level) > DoubleDiff) {
return lhs.second.avg_level > rhs.second.avg_level;
}
// Tag数量少的排前面

View File

@@ -34,7 +34,7 @@ namespace MeoAsstGui
[DllImport("MeoAssistance.dll")] static private extern bool AsstStart(IntPtr ptr, string task);
[DllImport("MeoAssistance.dll")] static private extern void AsstStop(IntPtr ptr);
[DllImport("MeoAssistance.dll")] static private extern bool AsstSetParam(IntPtr p_asst, string type, string param, string value);
[DllImport("MeoAssistance.dll")] static private extern bool AsstRunOpenRecruit(IntPtr ptr, int[] required_level, bool set_time);
[DllImport("MeoAssistance.dll")] static private extern bool AsstRunOpenRecruit(IntPtr ptr, int[] required_level, int required_len, bool set_time);
private CallbackDelegate _callback;
public AsstProxy(IContainer container, IWindowManager windowManager)
@@ -241,9 +241,9 @@ namespace MeoAsstGui
AsstSetParam(_ptr, type, param, value);
}
public bool AsstRunOpenRecruit(int[] required_level, bool set_time)
public bool AsstRunOpenRecruit(int[] required_level, int required_len, bool set_time)
{
return AsstRunOpenRecruit(_ptr, required_level, set_time);
return AsstRunOpenRecruit(_ptr, required_level, required_len, set_time);
}
}

View File

@@ -120,7 +120,7 @@ namespace MeoAsstGui
levelList.Add(6);
}
asstProxy.AsstRunOpenRecruit(levelList.ToArray(), AutoSetTime);
asstProxy.AsstRunOpenRecruit(levelList.ToArray(), levelList.Count, AutoSetTime);
}
}
}

View File

@@ -17,7 +17,7 @@ extern "C" {
MEOAPI_PORT bool AsstStart(asst::Assistance* p_asst, const char* task);
MEOAPI_PORT void AsstStop(asst::Assistance* p_asst);
MEOAPI_PORT bool AsstSetParam(asst::Assistance* p_asst, const char* type, const char* param, const char* value);
MEOAPI_PORT bool AsstRunOpenRecruit(asst::Assistance* p_asst, const int required_level[], bool set_time);
MEOAPI_PORT bool AsstRunOpenRecruit(asst::Assistance* p_asst, const int required_level[], int required_len, bool set_time);
MEOAPI_PORT bool AsstStartInfrast(asst::Assistance* p_asst);
MEOAPI_PORT bool AsstTestOcr(asst::Assistance* p_asst, const char** text_array, int array_size, bool need_click);