mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-20 02:55:38 +08:00
Merge branch 'infrast' of https://github.com/MistEO/MeoAssistance into infrast
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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数量少的,排前面
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ namespace MeoAsstGui
|
||||
levelList.Add(6);
|
||||
}
|
||||
|
||||
asstProxy.AsstRunOpenRecruit(levelList.ToArray(), AutoSetTime);
|
||||
asstProxy.AsstRunOpenRecruit(levelList.ToArray(), levelList.Count, AutoSetTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user