src\ImgProc\GameRecognize\src\Recognizer 目录下都是识别器的实现,如果我们想添加新的识别器,识别器的实现可以放在这个文件夹下。可以为此识别器创建独立的.h和.cpp文件。新的识别器的内容,主要如下。
class CXXXParam : public IObjRegParam
{
……
};
class CXXXRegResult : public IObjRegResult
{
……
};
class CXXXReg : public IObjReg
{
public:
CXXXReg();
~ CXXXReg ();
// interface
virtual int Initialize(IRegParam \*pParam);
virtual int Predict(const tagRegData &stData, IRegResult \*pResult);
virtual int Release();
……
};
定义好新的识别器后,我们需要做一些处理工作到整个框架上,才能让识别器正常工作。
在AISDK中,Agent进程根据游戏需求发送识别任务到GameReg进程。所以我们需要在协议文件中增加此识别类型,并增加Agent端和GameReg端关于此识别类型任务的打解包处理。具体代码增加部分请详见以下内容。
Protocol/gameregProtoc.proto 添加识别器类型
message tagPBResultRes
{
}
enum EREGTYPE
{
TYPE_BEGIN = 0;
……
**TYPE_XXXREG = 13;**
……
};
src\ImgProc\GameRecognize\src\TaskMgr\ TaskContext.cpp
**bool TaskContext::CreateRecognizer(int nTaskID)**
{
switch (m_stParms.GetType())
{
……
case **TYPE_XXXREG**:
{
m_pRecognizer = new CMapReg();
LOGI("create MakReg reg");
break;
}
}
}
src\ImgProc\GameRecognize\src\TaskMgr\TaskResult.cpp
IRegResult \*CTaskResult::GetInstance(EREGTYPE eType)
{
m_eType = eType;
switch (eType)
{
……
case **TYPE_XXXREG**:
{
Create**XXX**Rst();
Break;
}
……
}
}
void CTaskResult:: Create**XXX**Rst()
{
if (NULL == m_pRegRst)
{
m_pRegRst = CGameRegMemPool::getInstance()-\>AllocPoolMemory\<
CXXXRegResult\>();
}
}
src\ImgProc\GameRecognize\src \SerializeProtobuf.cpp
对结果进行打包
class CSerialFrameResult
{
……
int SerialXXXReg(tagPBResult \*pstPBResult, CXXXRegResult \*pPixRegResult);
……
}
//对参数进行解包
class CUnSerialTaskMsg
{
……
private:
int UnSerialTaskMsgAgentXXXElmts(CXXXRegParam \*pParam, const tagPBAgentTaskTsk
\&stPBAgentTaskTsk);
……
}
src\API\AgentAPI\ AgentMsgMgr.py
class MsgMgr(object):
def _Register(self):
#注册新类型打包函数
self.__serialRegerHandle[MSG_REGER_XXX \_TYPE] = self._SerialXXXReg
#注册新类型返回结果解包函数
self.__unSeiralRegerHandle[gameregProtoc_pb2.TYPE_XXX] = self._UnSerialXXXResult
# 打包函数的实现
def _SerialXXXReg (self, taskPB, taskVal):
……
#解包函数的实现
def _UnSerialXXXResult (self, result):
……