feat.完成基建干员笑脸识别

This commit is contained in:
MistEO
2021-10-16 00:45:25 +08:00
parent 27b84b93b9
commit b36bde547a
17 changed files with 275 additions and 39 deletions

View File

@@ -631,6 +631,16 @@
"ReturnToInfrast"
]
},
"Return": {
"algorithm": "justReturn",
"action": "clickRect",
"specificRect": [
20,
20,
135,
35
]
},
"EnterInfrast": {
"templThreshold": 0.85,
"histThreshold": 0.85,
@@ -810,5 +820,38 @@
"action": "stop",
"cache": false,
"next": []
},
"InfrastSkillsUpper": {
"algorithm": "justReturn",
"roi": [
400,
250,
880,
110
]
},
"InfrastSkillsLower": {
"algorithm": "justReturn",
"roi": [
400,
530,
880,
110
]
},
"InfrastSmileyOnRest": {
"template": "SmileyOnRest.png",
"maskRange": [100, 255],
"templThreshold": 0.8
},
"InfrastSmileyOnWork": {
"template": "SmileyOnWork.png",
"maskRange": [100, 255],
"templThreshold": 0.8
},
"InfrastSmileyOnDistract": {
"template": "SmileyOnDistract.png",
"maskRange": [100, 255],
"templThreshold": 0.8
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 936 B

After

Width:  |  Height:  |  Size: 936 B

View File

@@ -9,6 +9,7 @@
#include "Controller.h"
#include "AsstUtils.hpp"
#include "Logger.hpp"
#include "Resource.h"
using namespace asst;
@@ -75,6 +76,11 @@ bool asst::AbstractTask::click_return_button()
{
LogTraceFunction;
const static Rect ConfirmButtonRect(20, 20, 135, 35);
return ctrler.click(ConfirmButtonRect);
static Rect ReturnButtonRect;
if (ReturnButtonRect.empty()) {
const static auto return_task_ptr = std::dynamic_pointer_cast<MatchTaskInfo>(
resource.task().task_ptr("Return"));
ReturnButtonRect = return_task_ptr->specific_rect;
}
return ctrler.click(ReturnButtonRect);
}

View File

@@ -11,6 +11,12 @@
#include "AsstUtils.hpp"
#include "Resource.h"
#include "ProcessTask.h"
#include "RecruitTask.h"
#include "ScreenCaptureTask.h"
#include "CreditShoppingTask.h"
#include "InfrastShiftTask.h"
using namespace asst;
Assistance::Assistance(AsstCallback callback, void* callback_arg)
@@ -225,7 +231,7 @@ bool Assistance::start_debug_task()
//}
{
constexpr static const char* DebugTaskChain = "Debug";
auto shift_task_ptr = std::make_shared<CreditShoppingTask>(task_callback, (void*)this);
auto shift_task_ptr = std::make_shared<InfrastShiftTask>(task_callback, (void*)this);
shift_task_ptr->set_task_chain(DebugTaskChain);
m_tasks_deque.emplace_back(shift_task_ptr);
}

View File

@@ -10,7 +10,8 @@
#include <deque>
#include "AsstDef.h"
#include "Task.h"
#include "AsstMsg.h"
#include "AbstractTask.h"
namespace cv {
class Mat;

View File

@@ -0,0 +1,23 @@
#include "InfrastShiftTask.h"
#include "Resource.h"
#include "Controller.h"
#include "InfrastSkillsImageAnalyzer.h"
bool asst::InfrastShiftTask::run()
{
json::value task_start_json = json::object{
{ "task_type", "InfrastShiftTask" },
{ "task_chain", m_task_chain}
};
m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg);
const auto& image = ctrler.get_image();
InfrastSkillsImageAnalyzer skills_analyzer(image);
if (skills_analyzer.analyze()) {
}
return false;
}

View File

@@ -0,0 +1,14 @@
#pragma once
#include "AbstractTask.h"
namespace asst {
class InfrastShiftTask : public AbstractTask
{
public:
using AbstractTask::AbstractTask;
virtual ~InfrastShiftTask() = default;
virtual bool run() override;
protected:
};
}

View File

@@ -0,0 +1,28 @@
#include "InfrastSkillsImageAnalyzer.h"
#include "Resource.h"
#include "InfrastSmileyImageAnalyzer.h"
bool asst::InfrastSkillsImageAnalyzer::analyze()
{
const auto upper_task_ptr = resource.task().task_ptr("InfrastSkillsUpper");
const auto lower_task_ptr = resource.task().task_ptr("InfrastSkillsLower");
bool upper_ret = skills_roi_analyze(upper_task_ptr->roi);
bool lower_ret = skills_roi_analyze(lower_task_ptr->roi);
return upper_ret && lower_ret;
}
bool asst::InfrastSkillsImageAnalyzer::skills_roi_analyze(const Rect& roi)
{
InfrastSmileyImageAnalyzer smiley_analyzer(m_image, roi);
if (!smiley_analyzer.analyze()) {
return false;
}
const auto& smiley_res = smiley_analyzer.get_result();
return true;
}

View File

@@ -0,0 +1,14 @@
#pragma once
#include "AbstractImageAnalyzer.h"
namespace asst {
class InfrastSkillsImageAnalyzer : public AbstractImageAnalyzer
{
public:
using AbstractImageAnalyzer::AbstractImageAnalyzer;
virtual ~InfrastSkillsImageAnalyzer() = default;
virtual bool analyze() override;
protected:
bool skills_roi_analyze(const Rect& roi);
};
}

View File

@@ -0,0 +1,43 @@
#include "InfrastSmileyImageAnalyzer.h"
#include "Resource.h"
#include "MultiMatchImageAnalyzer.h"
#include "AsstUtils.hpp"
bool asst::InfrastSmileyImageAnalyzer::analyze()
{
const static std::unordered_map<SmileyType, std::string> smiley_map =
{
{SmileyType::Rest, "InfrastSmileyOnRest"},
{SmileyType::Work, "InfrastSmileyOnWork"},
{SmileyType::Distract, "InfrastSmileyOnDistract"}
};
m_result.clear();
#ifdef LOG_TRACE
cv::Mat image_draw = m_image.clone();
#endif
MultiMatchImageAnalyzer mm_analyzer(m_image, m_roi);
decltype(m_result) temp_result;
for (const auto& [type, task_name] : smiley_map) {
const auto task_ptr = std::dynamic_pointer_cast<MatchTaskInfo>(resource.task().task_ptr(task_name));
mm_analyzer.set_templ_name(task_ptr->templ_name);
mm_analyzer.set_threshold(task_ptr->templ_threshold);
mm_analyzer.set_mask_range(task_ptr->mask_range);
if (!mm_analyzer.analyze()) {
return false;
}
auto& res = mm_analyzer.get_result();
for (const MatchRect& mr : res) {
temp_result.emplace_back(SmileyInfo{ type, mr.rect });
#ifdef LOG_TRACE
cv::rectangle(image_draw, utils::make_rect<cv::Rect>(mr.rect), cv::Scalar(0, 0, 255), 2);
#endif
}
}
m_result = std::move(temp_result);
return true;
}

View File

@@ -0,0 +1,32 @@
#pragma once
#include "AbstractImageAnalyzer.h"
#include "AsstDef.h"
namespace asst {
enum class SmileyType {
Invalid = -1,
Rest, // 休息完成,绿色笑脸
Work, // 工作中,黄色笑脸
Distract // 注意力涣散,红色哭脸
};
struct SmileyInfo {
SmileyType type;
Rect rect;
};
class InfrastSmileyImageAnalyzer : public AbstractImageAnalyzer
{
public:
using AbstractImageAnalyzer::AbstractImageAnalyzer;
virtual ~InfrastSmileyImageAnalyzer() = default;
virtual bool analyze() override;
const std::vector<SmileyInfo>& get_result() const noexcept {
return m_result;
}
protected:
std::vector<SmileyInfo> m_result;
};
}

View File

@@ -24,6 +24,9 @@
<ClInclude Include="CreditShopImageAnalyzer.h" />
<ClInclude Include="GeneralConfiger.h" />
<ClInclude Include="CreditShoppingTask.h" />
<ClInclude Include="InfrastShiftTask.h" />
<ClInclude Include="InfrastSkillsImageAnalyzer.h" />
<ClInclude Include="InfrastSmileyImageAnalyzer.h" />
<ClInclude Include="MultiMatchImageAnalyzer.h" />
<ClInclude Include="OcrImageAnalyzer.h" />
<ClInclude Include="OcrPack.h" />
@@ -38,7 +41,6 @@
<ClInclude Include="ProcessTaskImageAnalyzer.h" />
<ClInclude Include="RecruitConfiger.h" />
<ClInclude Include="ScreenCaptureTask.h" />
<ClInclude Include="Task.h" />
<ClInclude Include="TaskData.h" />
<ClInclude Include="MatchImageAnalyzer.h" />
<ClInclude Include="TemplResource.h" />
@@ -53,6 +55,9 @@
<ClCompile Include="AbstractTask.cpp" />
<ClCompile Include="CreditShopImageAnalyzer.cpp" />
<ClCompile Include="CreditShoppingTask.cpp" />
<ClCompile Include="InfrastShiftTask.cpp" />
<ClCompile Include="InfrastSkillsImageAnalyzer.cpp" />
<ClCompile Include="InfrastSmileyImageAnalyzer.cpp" />
<ClCompile Include="MultiMatchImageAnalyzer.cpp" />
<ClCompile Include="OcrImageAnalyzer.cpp" />
<ClCompile Include="OcrPack.cpp" />

View File

@@ -43,6 +43,18 @@
<Filter Include="源文件\Utils">
<UniqueIdentifier>{a5c43813-70af-4b0e-94ac-9ddecc2e4a3c}</UniqueIdentifier>
</Filter>
<Filter Include="源文件\ImageAnalyzer\Infrast">
<UniqueIdentifier>{a37e0b23-e8f8-499c-adf5-9990277e9ffe}</UniqueIdentifier>
</Filter>
<Filter Include="源文件\ImageAnalyzer\General">
<UniqueIdentifier>{51165426-1842-491a-b5d5-9d26c59facdd}</UniqueIdentifier>
</Filter>
<Filter Include="头文件\ImageAnalyzer\General">
<UniqueIdentifier>{c600668a-0d70-4694-b1e5-6a78cffd0b1a}</UniqueIdentifier>
</Filter>
<Filter Include="头文件\ImageAnalyzer\Infrast">
<UniqueIdentifier>{d173e449-880b-4064-bbab-97007e3d090b}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="Controller.h">
@@ -87,9 +99,6 @@
<ClInclude Include="AsstMsg.h">
<Filter>头文件\Utils</Filter>
</ClInclude>
<ClInclude Include="Task.h">
<Filter>头文件\Task</Filter>
</ClInclude>
<ClInclude Include="AbstractConfiger.h">
<Filter>头文件\Resource</Filter>
</ClInclude>
@@ -111,9 +120,6 @@
<ClInclude Include="ItemConfiger.h">
<Filter>头文件\Resource</Filter>
</ClInclude>
<ClInclude Include="AbstractImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer</Filter>
</ClInclude>
<ClInclude Include="ProcessTaskImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer</Filter>
</ClInclude>
@@ -129,12 +135,6 @@
<ClInclude Include="PenguinPack.h">
<Filter>头文件\Resource</Filter>
</ClInclude>
<ClInclude Include="OcrImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer</Filter>
</ClInclude>
<ClInclude Include="MatchImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer</Filter>
</ClInclude>
<ClInclude Include="RecruitImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer</Filter>
</ClInclude>
@@ -144,8 +144,26 @@
<ClInclude Include="CreditShopImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer</Filter>
</ClInclude>
<ClInclude Include="InfrastShiftTask.h">
<Filter>头文件\Task</Filter>
</ClInclude>
<ClInclude Include="AbstractImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer\General</Filter>
</ClInclude>
<ClInclude Include="MatchImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer\General</Filter>
</ClInclude>
<ClInclude Include="MultiMatchImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer</Filter>
<Filter>头文件\ImageAnalyzer\General</Filter>
</ClInclude>
<ClInclude Include="OcrImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer\General</Filter>
</ClInclude>
<ClInclude Include="InfrastSkillsImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer\Infrast</Filter>
</ClInclude>
<ClInclude Include="InfrastSmileyImageAnalyzer.h">
<Filter>头文件\ImageAnalyzer\Infrast</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
@@ -194,9 +212,6 @@
<ClCompile Include="ItemConfiger.cpp">
<Filter>源文件\Resource</Filter>
</ClCompile>
<ClCompile Include="AbstractImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer</Filter>
</ClCompile>
<ClCompile Include="ProcessTaskImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer</Filter>
</ClCompile>
@@ -212,12 +227,6 @@
<ClCompile Include="PenguinPack.cpp">
<Filter>源文件\Resource</Filter>
</ClCompile>
<ClCompile Include="OcrImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer</Filter>
</ClCompile>
<ClCompile Include="MatchImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer</Filter>
</ClCompile>
<ClCompile Include="RecruitImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer</Filter>
</ClCompile>
@@ -227,8 +236,26 @@
<ClCompile Include="CreditShopImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer</Filter>
</ClCompile>
<ClCompile Include="InfrastShiftTask.cpp">
<Filter>源文件\Task</Filter>
</ClCompile>
<ClCompile Include="InfrastSkillsImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer\Infrast</Filter>
</ClCompile>
<ClCompile Include="InfrastSmileyImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer\Infrast</Filter>
</ClCompile>
<ClCompile Include="AbstractImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer\General</Filter>
</ClCompile>
<ClCompile Include="MatchImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer\General</Filter>
</ClCompile>
<ClCompile Include="MultiMatchImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer</Filter>
<Filter>源文件\ImageAnalyzer\General</Filter>
</ClCompile>
<ClCompile Include="OcrImageAnalyzer.cpp">
<Filter>源文件\ImageAnalyzer\General</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>

View File

@@ -1,6 +0,0 @@
#pragma once
#include "ProcessTask.h"
#include "RecruitTask.h"
#include "ScreenCaptureTask.h"
#include "CreditShoppingTask.h"

View File

@@ -18,11 +18,11 @@ int main(int argc, char** argv)
while (ch != 'q') {
//AsstStartSanity(ptr);
//AsstStartVisit(ptr, true);
{
const int required[] = { 3, 4, 5, 6 };
AsstStartRecruiting(ptr, required, sizeof(required) / sizeof(int), true);
}
//AsstStartDebugTask(ptr);
//{
// const int required[] = { 3, 4, 5, 6 };
// AsstStartRecruiting(ptr, required, sizeof(required) / sizeof(int), true);
//}
AsstStartDebugTask(ptr);
ch = getchar();
}