You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2555 lines
61 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "Algorithm.h"
#include <windows.h>
#pragma execution_character_set("utf-8")
CDetectorAlgorithm::CDetectorAlgorithm() : m_mutex(QReadWriteLock::Recursive)
{
m_nID = LP_DETECTOR_INVALID_ID;
m_nParamBaseID = 0;
m_nOutParamBaseID = 0;
m_vecParams.clear();
m_vecOutParams.clear();
m_mapParams.clear();
m_mapOutParams.clear();
m_pAlgo = NULL;
m_pTask = NULL;
m_bIsFinished = false;
m_bIsExec = true;
m_dExecTime = 0.0;
}
CDetectorAlgorithm::~CDetectorAlgorithm()
{
CleanUp();
}
bool CDetectorAlgorithm::Initialize(IDetectorTask* pTask, IAlgorithmLibMgr* pAlgoLibMgr)
{
if (!pTask)
return false;
m_pTask = pTask;
m_pAlgoLibMgr = pAlgoLibMgr;
return true;
}
void CDetectorAlgorithm::SetID(int nID)
{
m_nID = nID;
}
int CDetectorAlgorithm::GetID() const
{
return m_nID;
}
int CDetectorAlgorithm::GetParamBaseID() const
{
return m_nParamBaseID;
}
int CDetectorAlgorithm::GetOutParamBaseID() const
{
return m_nOutParamBaseID;
}
void CDetectorAlgorithm::Release()
{
delete this;
}
void CDetectorAlgorithm::CleanUp()
{
for (QMap<QString,PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
QString str = p->strName;
if (NULL != p)
{
delete p;
}
}
m_vecParams.clear();
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecOutParams.begin();
iter != m_vecOutParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (NULL != p)
{
delete p;
}
}
m_vecOutParams.clear();
if (m_pAlgo)
{
delete m_pAlgo;
m_pAlgo = NULL;
}
if (m_lib.isLoaded())
{
m_lib.unload();
}
}
bool CDetectorAlgorithm::SetAlgorithmInfo(const PLP_DETECTOR_ALGORITHM pAlgorithmInfo)
{
if (!pAlgorithmInfo)
return false;
m_tAlgorithmInfo.nID = pAlgorithmInfo->nID;
m_tAlgorithmInfo.strName = pAlgorithmInfo->strName;
m_tAlgorithmInfo.strDescription = pAlgorithmInfo->strDescription;
m_tAlgorithmInfo.nRoiID = pAlgorithmInfo->nRoiID;
m_tAlgorithmInfo.strPath = pAlgorithmInfo->strPath;
m_tAlgorithmInfo.strLibName = pAlgorithmInfo->strLibName;
m_tAlgorithmInfo.strFuncName = pAlgorithmInfo->strFuncName;
return true;
}
PLP_DETECTOR_ALGORITHM CDetectorAlgorithm::GetAlgorithmInfo()
{
return &m_tAlgorithmInfo;
}
PLP_ALGORITHM_PARAM CDetectorAlgorithm::AddParam(const PLP_ALGORITHM_PARAM pParam, bool bRet /* = true */)
{//添加输入参数
if (NULL == pParam)
return NULL;
if (bRet){
LP_ALGORITHM_PARAM* p = new LP_ALGORITHM_PARAM;
p->nID = ++m_nParamBaseID;
p->nTaskID = pParam->nTaskID;
p->nSrcAlgoID = pParam->nSrcAlgoID;
p->nSrcParamID = pParam->nSrcParamID;
p->strName = pParam->strName;
p->type = pParam->type;
p->value = pParam->value;
p->strDescription = pParam->strDescription;
p->bIsSave = pParam->bIsSave;
p->bIsLock = pParam->bIsLock;
//m_vecParams.push_back(p);
m_mapParams.insert(p->strName, p);
m_vecParams[p->strName] = p;
return p;
}
else
{
if (m_vecParams.contains(pParam->strName))
{
QMap<QString, PLP_ALGORITHM_PARAM>::iterator its= m_vecParams.find(pParam->strName);
(*its)->nTaskID = pParam->nTaskID;
(*its)->nSrcAlgoID = pParam->nSrcAlgoID;
(*its)->nSrcParamID = pParam->nSrcParamID;
(*its)->value = pParam->value;
//(*its)->strDescription = pParam->strDescription;
(*its)->bIsSave = pParam->bIsSave;
(*its)->bIsLock = pParam->bIsLock;
if (m_mapParams.contains(pParam->strName))
m_mapParams[pParam->strName] = (*its);
return (*its);
}
}
return NULL;
}
bool CDetectorAlgorithm::DeleteParam(int nParamID)
{//删除输入参数
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (NULL != p)
{
if (p->nID == nParamID)
{
iter = m_vecParams.erase(iter);
m_mapParams.remove(p->strName);
delete *iter;
return true;
}
}
}
return false;
}
PLP_ALGORITHM_PARAM CDetectorAlgorithm::GetParam(int nParamID)
{
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
if (NULL != *iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (p->nID == nParamID)
return p;
}
}
return NULL;
}
int CDetectorAlgorithm::EnumParam(LP_ALGORITHM_PARAM** lppParam, int nCount)
{
if (!lppParam || nCount < m_vecParams.size())
return m_vecParams.size();
int nIndex = 0;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
if (NULL != *iter)
{
lppParam[nIndex] = *iter;
nIndex++;
}
}
return nIndex;
}
PLP_ALGORITHM_PARAM CDetectorAlgorithm::AddOutParam(const PLP_ALGORITHM_PARAM pParam, bool bRet /* = true */)
{
if (NULL == pParam)
return NULL;
if (bRet)//添加模式
{
PLP_ALGORITHM_PARAM p = new LP_ALGORITHM_PARAM;
p->nID = ++m_nOutParamBaseID;
p->nTaskID = pParam->nTaskID;
p->nSrcAlgoID = pParam->nSrcAlgoID;
p->nSrcParamID = pParam->nSrcParamID;
p->strName = pParam->strName;
p->type = pParam->type;
p->value = pParam->value;
p->strDescription = pParam->strDescription;
p->bIsSave = pParam->bIsSave;
m_vecOutParams[p->strName] = p;
m_mapOutParams.insert(p->strName, p);
return p;
}
else//修改输出参数模式
{
if (m_vecOutParams.contains(pParam->strName))
{
QMap<QString,PLP_ALGORITHM_PARAM>::iterator its = m_vecOutParams.find(pParam->strName);
(*its)->nSrcAlgoID = pParam->nTaskID;
(*its)->nSrcAlgoID = pParam->nSrcAlgoID;
(*its)->nSrcParamID = pParam->nSrcParamID;
(*its)->value = pParam->value;
//(*its)->strDescription = pParam->strDescription;
(*its)->bIsSave = pParam->bIsSave;
m_mapOutParams[pParam->strName] = (*its);
return (*its);
}
}
return NULL;
}
bool CDetectorAlgorithm::DeleteOutParam(int nOutParamID)
{
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecOutParams.begin();
iter != m_vecOutParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (NULL != p)
{
if (p->nID == nOutParamID)
{
iter = m_vecOutParams.erase(iter);
m_mapOutParams.remove(p->strName);
delete *iter;
return true;
}
}
}
return false;
}
PLP_ALGORITHM_PARAM CDetectorAlgorithm::GetOutParam(int nOutParamID)
{
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecOutParams.begin();
iter != m_vecOutParams.end(); ++iter)
{
if (NULL != *iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (p->nID == nOutParamID)
return p;
}
}
return NULL;
}
int CDetectorAlgorithm::EnumOutParam(LP_ALGORITHM_PARAM** lppOutParam, int nCount)
{
if (!lppOutParam || nCount < m_vecOutParams.size())
return m_vecOutParams.size();
int nIndex = 0;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecOutParams.begin();
iter != m_vecOutParams.end(); ++iter)
{
if (NULL != *iter)
{
lppOutParam[nIndex] = *iter;
nIndex++;
}
}
return nIndex;
}
bool CDetectorAlgorithm::SerializeParamPropertyToJson(QJsonObject* pJsonObject, QVariantMap& vProperty)
{
if (!pJsonObject)
return false;
if (vProperty.empty())
return true;
QJsonArray PropertyArray;
for (QMap<QString, QVariant>::iterator iter = vProperty.begin();
iter != vProperty.end(); ++iter)
{
if (NULL != *iter)
{
QJsonObject propertys;
propertys.insert("prop_name", iter.key());
propertys.insert("prop_type", iter.value().type());
switch (iter.value().type())
{
case QMetaType::Bool:
{
propertys.insert("prop_value", iter.value().toBool());
break;
}
case QMetaType::Int:
{
propertys.insert("prop_value", iter.value().toInt());
break;
}
case QMetaType::Double:
{
propertys.insert("prop_value", iter.value().toDouble());
break;
}
case QMetaType::QString:
{
propertys.insert("prop_value", iter.value().toString());
break;
}
default:
break;
}
PropertyArray.push_back(propertys);
}
}
pJsonObject->insert("property", PropertyArray);
return true;
}
bool CDetectorAlgorithm::SerializeToJson(QJsonDocument* pJsonDocument, QJsonArray* pAlgorithmArray)
{
QJsonObject jsonObject;
jsonObject.insert("algo_name", m_tAlgorithmInfo.strName);
jsonObject.insert("algo_description", m_tAlgorithmInfo.strDescription);
jsonObject.insert("algo_path", m_tAlgorithmInfo.strPath);
jsonObject.insert("algo_roi_id", m_tAlgorithmInfo.nRoiID);
jsonObject.insert("algo_id", m_nID);
jsonObject.insert("algo_base_id", m_nParamBaseID);
jsonObject.insert("algo_OutParam_base_id", m_nOutParamBaseID);
jsonObject.insert("algo_lib_name", m_tAlgorithmInfo.strLibName);
jsonObject.insert("algo_func_name", m_tAlgorithmInfo.strFuncName);
jsonObject.insert("algo_exec_enabled", m_bIsExec);
QJsonArray paramArray;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
if (*iter)
{
PLP_ALGORITHM_PARAM p = (PLP_ALGORITHM_PARAM)*iter;
QJsonObject jsonParam;
jsonParam.insert("param_id", p->nID);
jsonParam.insert("param_src_task_id", p->nTaskID);
jsonParam.insert("param_src_algo_id", p->nSrcAlgoID);
jsonParam.insert("param_src_param_id", p->nSrcParamID);
jsonParam.insert("param_name", p->strName);
jsonParam.insert("param_type", p->type);
jsonParam.insert("param_lock", p->bIsLock);
switch (p->type)
{
case LP_INT:
{
jsonParam.insert("param_value", p->value.toInt());
break;
}
case LP_BOOLEAN:
{
jsonParam.insert("param_value", p->value.toBool());
break;
}
case LP_STRING:
{
jsonParam.insert("param_value", p->value.toString());
break;
}
case LP_DOUBLE:
{
jsonParam.insert("param_value", p->value.toDouble());
break;
}
case LP_POINT:
{
jsonParam.insert("param_value_point_1", p->value.toPoint().x());
jsonParam.insert("param_value_point_2", p->value.toPoint().y());
break;
}
case LP_POINTF:
{
jsonParam.insert("param_value_point_1", p->value.toPointF().x());
jsonParam.insert("param_value_point_2", p->value.toPointF().y());
break;
}
case LP_IMAGE:
{
break;
}
case LP_RECT:
{
QPolygonF polygon = p->value.value<QPolygonF>();
jsonParam.insert("param_value_ptx0", polygon.at(0).x());
jsonParam.insert("param_value_pty0", polygon.at(0).y());
jsonParam.insert("param_value_ptx1", polygon.at(1).x());
jsonParam.insert("param_value_pty1", polygon.at(1).y());
jsonParam.insert("param_value_ptx2", polygon.at(2).x());
jsonParam.insert("param_value_pty2", polygon.at(2).y());
jsonParam.insert("param_value_ptx3", polygon.at(3).x());
jsonParam.insert("param_value_pty3", polygon.at(3).y());
break;
}
case LP_TRANSFORM:
{
QTransform tranform = p->value.value<QTransform>();
jsonParam.insert("param_value_m11", tranform.m11());
jsonParam.insert("param_value_m12", tranform.m12());
jsonParam.insert("param_value_m13", tranform.m13());
jsonParam.insert("param_value_m21", tranform.m21());
jsonParam.insert("param_value_m22", tranform.m22());
jsonParam.insert("param_value_m23", tranform.m23());
jsonParam.insert("param_value_m31", tranform.m31());
jsonParam.insert("param_value_m32", tranform.m32());
jsonParam.insert("param_value_m33", tranform.m33());
break;
}
case LP_MAT:
{
cv::Mat matResult = p->value.value<cv::Mat>();
//QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = m_pTask->GetPath();// strExePath + LP_DETECTOR_BUSSINESS_IN_PARAM_FILE_DIR;
QString strName = QString("%1_%2_%3_%4").arg(m_pTask->GetParentSolution()->GetID()).arg(m_pTask->GetID()).arg(m_nID).arg(p->nID);
QString strFileName = strName + "_in" + ".bmp";
QString strFileName2 = strFileName;
strFileName2.replace(".bmp", ".wsf");
QString strFilePath2 = strFilePath + strFileName2;
strFilePath += strFileName;
jsonParam.insert("param_file_path", strFileName2);
std::string strpath = strFilePath.toLocal8Bit().toStdString();
if (!cv::imwrite(strpath/*strFilePath.toLatin1().data()*/, matResult))
break;
QFile(strFilePath2).remove();
QFile::rename(strFilePath, strFilePath2);
QFile(strFilePath).remove();
if (m_pTask)
m_pTask->AppendOtherFile(strFilePath2);
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roiData = p->value.value<LP_DETECTOR_ROI_DATA>();
int nCount = roiData.records.size();
if (nCount > 0)
{
QJsonArray recordArray;
for (int i = 0; i < nCount; i++)
{
QJsonArray itemArray;
Item_List record = roiData.records.at(i);
int nItemCount = record.size();
for (int j = 0; j < nItemCount; j++)
{
QJsonObject itemJson;
Feature_List item = record.at(j);
itemJson.insert("roi_item_type", item.first);
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
itemJson.insert("roi_item_value1", item.second.at(0));
itemJson.insert("roi_item_value2", item.second.at(1));
itemJson.insert("roi_item_value3", item.second.at(2));
itemJson.insert("roi_item_value4", item.second.at(3));
break;
}
case CIRCLE:
{
itemJson.insert("roi_item_value1", item.second.at(0));
itemJson.insert("roi_item_value2", item.second.at(1));
itemJson.insert("roi_item_value3", item.second.at(2));
break;
}
case POLY:
{
break;
}
default:
break;
}
itemArray.push_back(itemJson);
}
recordArray.push_back(itemArray);
}
jsonParam.insert("param_value", recordArray);
}
break;
}
case LP_LINEF:
case LP_RECTF:
case LP_POLYGONF:
{
QPolygonF polygon = p->value.value<QPolygonF>();
for (int i = 0; i < polygon.size(); i++)
{
QString strPtKey = QString("%1%2").arg("param_value_pt").arg(QString::number(i));
QString strPtValue = QString("%1,%2").arg(QString::number(polygon.at(i).x())).arg(QString::number(polygon.at(i).y()));
jsonParam.insert(strPtKey, strPtValue);
}
break;
}
case LP_USER:
{
if (m_pAlgo)
{
m_pAlgo->SaveUserParamValue(m_pTask, this, p->strName);
}
else
{
if (m_pAlgoLibMgr)
{
IAlgorithmLib* pAlgoLib = m_pAlgoLibMgr->GetAlgorithmLib(m_tAlgorithmInfo.strLibName);
if (pAlgoLib)
{
pAlgoLib->SaveUserParamValue(m_pTask, this, p->strName);
}
}
}
break;
}
default:
break;
}
jsonParam.insert("param_description", p->strDescription);
SerializeParamPropertyToJson(&jsonParam, p->vProperty);
paramArray.push_back(jsonParam);
}
}
if (paramArray.size() > 0)
jsonObject.insert("paramArray", paramArray);
QJsonArray outParamArray;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecOutParams.begin();
iter != m_vecOutParams.end(); ++iter)
{
if (*iter)
{
PLP_ALGORITHM_PARAM p = (PLP_ALGORITHM_PARAM)*iter;
QJsonObject jsonParam;
jsonParam.insert("out_param_id", p->nID);
jsonParam.insert("out_param_dest_task_id", p->nTaskID);
jsonParam.insert("out_param_dest_algo_id", p->nSrcAlgoID);
jsonParam.insert("out_param_dest_param_id", p->nSrcParamID);
jsonParam.insert("out_param_name", p->strName);
jsonParam.insert("out_param_type", p->type);
jsonParam.insert("out_param_description", p->strDescription);
jsonParam.insert("out_param_save", p->bIsSave);
switch (p->type)
{
case LP_INT:
{
jsonParam.insert("out_param_value", p->value.toInt());
break;
}
case LP_BOOLEAN:
{
jsonParam.insert("out_param_value", p->value.toBool());
break;
}
case LP_STRING:
{
jsonParam.insert("out_param_value", p->value.toString());
break;
}
case LP_DOUBLE:
{
jsonParam.insert("out_param_value", p->value.toDouble());
break;
}
case LP_IMAGE:
{
break;
}
case LP_MAT:
{
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roiData = p->value.value<LP_DETECTOR_ROI_DATA>();
int nCount = roiData.records.size();
if (nCount > 0)
{
QJsonArray recordArray;
for (int i = 0; i < nCount; i++)
{
QJsonArray itemArray;
Item_List record = roiData.records.at(i);
int nItemCount = record.size();
for (int j = 0; j < nItemCount; j++)
{
QJsonObject itemJson;
Feature_List item = record.at(j);
itemJson.insert("roi_item_type", item.first);
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
itemJson.insert("roi_item_value1", item.second.at(0));
itemJson.insert("roi_item_value2", item.second.at(1));
itemJson.insert("roi_item_value3", item.second.at(2));
itemJson.insert("roi_item_value4", item.second.at(3));
break;
}
case CIRCLE:
{
itemJson.insert("roi_item_value1", item.second.at(0));
itemJson.insert("roi_item_value2", item.second.at(1));
itemJson.insert("roi_item_value3", item.second.at(2));
break;
}
case POLY:
{
break;
}
default:
break;
}
itemArray.push_back(itemJson);
}
recordArray.push_back(itemArray);
}
jsonParam.insert("out_param_value", recordArray);
}
break;
}
case LP_POLYGONF:
{
break;
}
case LP_USER:
{
if (m_pAlgo)
{
m_pAlgo->SaveUserParamValue(m_pTask, this, p->strName);
}
else
{
if (m_pAlgoLibMgr)
{
IAlgorithmLib* pAlgoLib = m_pAlgoLibMgr->GetAlgorithmLib(m_tAlgorithmInfo.strLibName);
if (pAlgoLib)
{
pAlgoLib->SaveUserParamValue(m_pTask, this, p->strName);
}
}
}
break;
}
default:
break;
}
outParamArray.push_back(jsonParam);
}
}
if (outParamArray.size() > 0)
jsonObject.insert("outParamArray", outParamArray);
pAlgorithmArray->push_back(jsonObject);
return true;
}
bool CDetectorAlgorithm::SerializeParamPropertyFromJson(QJsonObject* pJsonObject, QVariantMap& vProperty)
{
if (!pJsonObject)
return false;
if (!pJsonObject->contains("property"))
return true;
vProperty.clear();
QJsonArray propertyArray = pJsonObject->value("property").toArray();
for (int i = 0; i < propertyArray.size(); i++)
{
QJsonObject propertyObject = propertyArray[i].toObject();
switch (propertyObject.value("prop_type").toInt())
{
case QMetaType::Bool:
{
vProperty.insert(propertyObject.value("prop_name").toString(), propertyObject.value("prop_value").toBool());
break;
}
case QMetaType::Int:
{
vProperty.insert(propertyObject.value("prop_name").toString(), propertyObject.value("prop_value").toInt());
break;
}
case QMetaType::Double:
{
vProperty.insert(propertyObject.value("prop_name").toString(), propertyObject.value("prop_value").toDouble());
break;
}
case QMetaType::QString:
{
vProperty.insert(propertyObject.value("prop_name").toString(), propertyObject.value("prop_value").toString());
break;
}
default:
break;
}
}
return true;
}
bool CDetectorAlgorithm::SerializeFromJson(QJsonObject* pJsonObject)
{
m_nID = pJsonObject->value("algo_id").toInt();
if (m_tAlgorithmInfo.strPath.size() > 0)
{
Load(m_tAlgorithmInfo.strPath.left(m_tAlgorithmInfo.strPath.lastIndexOf(".")));
}
else
{
Load(m_tAlgorithmInfo.strName);
}
if (m_Init == false)
{
if (m_pAlgo)
{
m_pAlgo->Init(m_pTask, this);
m_Init = true;
}
}
QJsonArray paramArray = pJsonObject->value("paramArray").toArray();
for (int i = 0; i < paramArray.size(); i++)
{
LP_ALGORITHM_PARAM param;
QJsonObject jsonObject = paramArray[i].toObject();
param.nID = jsonObject.value("param_id").toInt();
param.nTaskID = jsonObject.value("param_src_task_id").toInt(LP_DETECTOR_INVALID_ID);
param.nSrcAlgoID = jsonObject.value("param_src_algo_id").toInt();
param.nSrcParamID = jsonObject.value("param_src_param_id").toInt();
param.strName = jsonObject.value("param_name").toString();
param.type = (AlgoParamType)jsonObject.value("param_type").toInt();
param.bIsLock = jsonObject.value("param_lock").toBool();
switch (param.type)
{
case LP_INT:
{
param.value = jsonObject.value("param_value").toInt();
break;
}
case LP_BOOLEAN:
{
param.value = jsonObject.value("param_value").toBool();
break;
}
case LP_STRING:
{
param.value = jsonObject.value("param_value").toString();
break;
}
case LP_DOUBLE:
{
param.value = jsonObject.value("param_value").toDouble();
break;
}
case LP_POINT:
{
QPoint pt;
pt.setX(jsonObject.value("param_value_point_1").toInt());
pt.setY(jsonObject.value("param_value_point_2").toInt());
param.value = pt;
break;
}
case LP_POINTF:
{
QPointF pt;
pt.setX(jsonObject.value("param_value_point_1").toDouble());
pt.setY(jsonObject.value("param_value_point_2").toDouble());
param.value = pt;
break;
}
case LP_IMAGE:
{
break;
}
case LP_RECT:
{
QPolygonF polygon;
polygon << QPointF(jsonObject.value("param_value_ptx0").toDouble(), jsonObject.value("param_value_pty0").toDouble())
<< QPointF(jsonObject.value("param_value_ptx1").toDouble(), jsonObject.value("param_value_pty1").toDouble())
<< QPointF(jsonObject.value("param_value_ptx2").toDouble(), jsonObject.value("param_value_pty2").toDouble())
<< QPointF(jsonObject.value("param_value_ptx3").toDouble(), jsonObject.value("param_value_pty3").toDouble());
param.value = polygon;
break;
}
case LP_TRANSFORM:
{
QTransform tranform;
qreal m11 = jsonObject.value("param_value_m11").toDouble();
qreal m12 = jsonObject.value("param_value_m12").toDouble();
qreal m13 = jsonObject.value("param_value_m13").toDouble();
qreal m21 = jsonObject.value("param_value_m21").toDouble();
qreal m22 = jsonObject.value("param_value_m22").toDouble();
qreal m23 = jsonObject.value("param_value_m23").toDouble();
qreal m31 = jsonObject.value("param_value_m31").toDouble();
qreal m32 = jsonObject.value("param_value_m32").toDouble();
qreal m33 = jsonObject.value("param_value_m33").toDouble();
tranform.setMatrix(m11, m12, m13, m21, m22, m23, m31, m32, m33);
param.value = tranform;
break;
}
case LP_MAT:
{
//QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = m_pTask->GetPath(); //strExePath + LP_DETECTOR_BUSSINESS_IN_PARAM_FILE_DIR;
QString strFileName = jsonObject.value("param_file_path").toString();
strFilePath += strFileName;
QFile file(strFilePath);
if (file.exists())
{
std::string strpath = strFilePath.toLocal8Bit().toStdString();
cv::Mat resultFile = cv::imread(strpath, CV_LOAD_IMAGE_UNCHANGED);
param.value.setValue(resultFile);
if (m_pTask)
m_pTask->AppendOtherFile(QString(strpath.c_str()));
}
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roiData;
roiData.img = m_pTask->GetTaskInfo()->templateImg;
QJsonArray recordArray = jsonObject.value("param_value").toArray();
int nRecordCount = recordArray.size();
if (nRecordCount > 0)
{
Record_List recordList;
for (int i = 0; i < nRecordCount; i++)
{
QJsonArray itemArray = recordArray.at(i).toArray();
int nItemCount = itemArray.size();
if (nItemCount > 0)
{
Item_List itemList;
for (int j = 0; j < nItemCount; j++)
{
QJsonObject itemJson = itemArray.at(j).toObject();
Feature_List item;
item.first = itemJson.value("roi_item_type").toInt();
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
item.second.push_back(itemJson.value("roi_item_value1").toDouble());
item.second.push_back(itemJson.value("roi_item_value2").toDouble());
item.second.push_back(itemJson.value("roi_item_value3").toDouble());
item.second.push_back(itemJson.value("roi_item_value4").toDouble());
break;
}
case CIRCLE:
{
item.second.push_back(itemJson.value("roi_item_value1").toDouble());
item.second.push_back(itemJson.value("roi_item_value2").toDouble());
item.second.push_back(itemJson.value("roi_item_value3").toDouble());
break;
}
case POLY:
{
break;
}
default:
break;
}
itemList.push_back(item);
}
recordList.push_back(itemList);
}
roiData.records = recordList;
}
}
param.value.setValue(roiData);
break;
}
case LP_LINEF:
case LP_RECTF:
case LP_POLYGONF:
{
QPolygonF polygon;
QStringList ptList = jsonObject.keys();
int k = 0;
for (int i = 0; i < ptList.size(); i++)
{
if (ptList.at(i).contains("param_value_pt"))
{
QString strPtKey = QString("%1%2").arg("param_value_pt").arg(QString::number(k));
QString strPtValue = jsonObject.value(strPtKey).toString();
QStringList strList = strPtValue.split(",");
if (strList.size() == 2)
{
polygon << QPointF(strList.at(0).toDouble(), strList.at(1).toDouble());
}
k++;
}
}
param.value = polygon;
}
case LP_USER:
{
if (m_pAlgo)
{
m_pAlgo->LoadUserParamValue(m_pTask, this, param.strName, param.value);
}
else
{
if (m_pAlgoLibMgr)
{
IAlgorithmLib* pAlgoLib = m_pAlgoLibMgr->GetAlgorithmLib(m_tAlgorithmInfo.strLibName);
if (pAlgoLib)
{
pAlgoLib->LoadUserParamValue(m_pTask, this, param.strName, param.value);
}
}
}
break;
}
default:
break;
}
PLP_ALGORITHM_PARAM pParam = (PLP_ALGORITHM_PARAM)AddParam(&param,false);
if (pParam)
{
SerializeParamPropertyFromJson(&jsonObject, param.vProperty);
}
}
QJsonArray outParamArray = pJsonObject->value("outParamArray").toArray();
for (int i = 0; i < outParamArray.size(); i++)
{
LP_ALGORITHM_PARAM param;
QJsonObject jsonObject = outParamArray[i].toObject();
param.nID = jsonObject.value("out_param_id").toInt();
param.nTaskID = jsonObject.value("out_param_dest_task_id").toInt(LP_DETECTOR_INVALID_ID);
param.nSrcAlgoID = jsonObject.value("out_param_dest_algo_id").toInt(LP_DETECTOR_INVALID_ID);
param.nSrcParamID = jsonObject.value("out_param_dest_param_id").toInt(LP_DETECTOR_INVALID_ID);
param.strName = jsonObject.value("out_param_name").toString();
param.type = (AlgoParamType)jsonObject.value("out_param_type").toInt();
switch (param.type)
{
case LP_INT:
{
param.value = jsonObject.value("out_param_value").toInt();
break;
}
case LP_BOOLEAN:
{
param.value = jsonObject.value("out_param_value").toBool();
break;
}
case LP_STRING:
{
param.value = jsonObject.value("out_param_value").toString();
break;
}
case LP_DOUBLE:
{
param.value = jsonObject.value("out_param_value").toDouble();
break;
}
case LP_IMAGE:
{
break;
}
case LP_MAT:
{
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roiData;
QJsonArray recordArray = jsonObject.value("out_param_value").toArray();
int nRecordCount = recordArray.size();
if (nRecordCount > 0)
{
Record_List recordList;
for (int i = 0; i < nRecordCount; i++)
{
QJsonArray itemArray = recordArray.at(i).toArray();
int nItemCount = itemArray.size();
if (nItemCount > 0)
{
Item_List itemList;
for (int j = 0; j < nItemCount; j++)
{
QJsonObject itemJson = itemArray.at(j).toObject();
Feature_List item;
item.first = itemJson.value("roi_item_type").toInt();
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
item.second.push_back(itemJson.value("roi_item_value1").toDouble());
item.second.push_back(itemJson.value("roi_item_value2").toDouble());
item.second.push_back(itemJson.value("roi_item_value3").toDouble());
item.second.push_back(itemJson.value("roi_item_value4").toDouble());
break;
}
case CIRCLE:
{
item.second.push_back(itemJson.value("roi_item_value1").toDouble());
item.second.push_back(itemJson.value("roi_item_value2").toDouble());
item.second.push_back(itemJson.value("roi_item_value3").toDouble());
break;
}
case POLY:
{
break;
}
default:
break;
}
itemList.push_back(item);
}
recordList.push_back(itemList);
}
roiData.records = recordList;
}
}
param.value.setValue(roiData);
break;
}
case LP_POLYGONF:
{
break;
}
case LP_USER:
{
if (m_pAlgo)
{
m_pAlgo->LoadUserParamValue(m_pTask, this, param.strName, param.value);
}
else
{
if (m_pAlgoLibMgr)
{
IAlgorithmLib* pAlgoLib = m_pAlgoLibMgr->GetAlgorithmLib(m_tAlgorithmInfo.strLibName);
if (pAlgoLib)
{
pAlgoLib->LoadUserParamValue(m_pTask, this, param.strName, param.value);
}
}
}
break;
}
default:
break;
}
param.bIsSave = jsonObject.value("out_param_save").toBool();
PLP_ALGORITHM_PARAM pParam = (PLP_ALGORITHM_PARAM)AddOutParam(&param,false);
}
m_nParamBaseID = pJsonObject->value("algo_base_id").toInt();
m_nOutParamBaseID = pJsonObject->value("algo_OutParam_base_id").toInt();
PLP_ALGORITHM_PARAM relyCoordinate = GetParamByName(LP_DETECTOR_ALGO_PARAM_RELY_COORDINATE);
PLP_ALGORITHM_PARAM relatvieRoi = GetParamByName(LP_DETECTOR_ALGO_PARAM_RELATIVE_ROI);
if (relyCoordinate && relatvieRoi)
{
QPolygonF polygon = relatvieRoi->value.value<QPolygonF>();
QTransform transform = relyCoordinate->value.value<QTransform>();
m_worldRoi = transform.map(polygon);
}
return true;
}
bool CDetectorAlgorithm::Load(QString dllPath)
{
if (m_pAlgo)
{
delete m_pAlgo;
m_pAlgo = NULL;
}
if (m_lib.isLoaded())
{
m_lib.unload();
}
QString strDll = dllPath + ".dll";
QString strFileName = dllPath.mid(dllPath.lastIndexOf("/") + 1) + ".dll";
QFile file(strDll);
if (file.exists())
{
m_lib.setFileName(strDll);
if (!m_lib.load())
return false;
}
else
{
//QString strExePath = QCoreApplication::applicationDirPath();
QString strDefaultFilePath = m_pTask->GetPath();// strExePath + LP_DETECTOR_BUSSINESS_CONFIG_ALGO_DIR + strFileName;
QFile defaultFile(strDefaultFilePath);
if (defaultFile.exists())
{
m_lib.setFileName(strDefaultFilePath);
if (!m_lib.load())
return false;
}
}
FnLpAlgoNewInstance pfnLpNewInstance = (FnLpAlgoNewInstance)m_lib.resolve("LpAlgoNewInstance");
if (pfnLpNewInstance)
pfnLpNewInstance(&m_pAlgo);
if (!m_pAlgo)
return false;
return true;
}
QString CDetectorAlgorithm::showVariant(const AlgoParamType type, const QVariant &var) {
switch (type)
{
case LP_INT:
{
return QString::number(var.toInt());
break;
}
case LP_BOOLEAN:
case LP_STRING:
{
return var.toString();
break;
}
case LP_DOUBLE:
{
return QString::number(var.toDouble());
break;
}
case LP_IMAGE:
{
if (!var.isNull())
{
QImage img = var.value<QImage>();
if (!img.isNull())
{
return QString("[%1*%2]").arg(img.width()).arg(img.height());
}
}
break;
}
case LP_POINTF:
{
QPointF pt = var.toPointF();
QString str = "(%1,%2)"; str = str.arg(pt.x()).arg(pt.y());
return str;
break;
}
case LP_POINT:
{
QPoint pt = var.toPoint();
QString str = "(%1,%2)"; str = str.arg(pt.x()).arg(pt.y());
return str;
break;
}
case LP_MAT:
{
cv::Mat matResult = var.value<cv::Mat>();
return QString("[%1*%2]").arg(matResult.cols).arg(matResult.rows);
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roi = var.value<LP_DETECTOR_ROI_DATA>();
int nCount = roi.records.size();
if (nCount > 0)
{
for (int i = 0; i < nCount; i++)
{
Item_List record = roi.records.at(i);
int nItemCount = record.size();
for (int j = 0; j < nItemCount; j++)
{
Feature_List item = record.at(j);
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
QString strResult = "(%1,%2,%3,%4)";
strResult = strResult.arg(item.second.at(0)).arg(item.second.at(1)).arg(item.second.at(2)).arg(item.second.at(3));
return strResult;
break;
}
case CIRCLE:
{
QString strResult = "(%1,%2,%3)";
strResult = strResult.arg(item.second.at(0)).arg(item.second.at(1)).arg(item.second.at(2));
return strResult;
break;
}
case POLY:
{
break;
}
default:
break;
}
}
}
}
break;
}
default:
break;
}
return var.toString();
}
QList<int> CDetectorAlgorithm::UpdateRelyOnAlgo()
{
if (!m_pTask)
return QList<int>();
QList<int> rltList;
int nAlgoCount = m_pTask->EnumAlgorithm(NULL, 0);
if (nAlgoCount > 0)
{
CDetectorAlgorithm** lppAlgo = new CDetectorAlgorithm*[nAlgoCount];
nAlgoCount = m_pTask->EnumAlgorithm((IDetectorAlgorithm**)lppAlgo, nAlgoCount);
for (int i = 0; i < nAlgoCount; i++)
{
if (lppAlgo[i])
{
int nParamCount = lppAlgo[i]->EnumParam(NULL, 0);
if (nParamCount > 0)
{
PLP_ALGORITHM_PARAM* lppParam = new PLP_ALGORITHM_PARAM[nParamCount];
nParamCount = lppAlgo[i]->EnumParam(lppParam, nParamCount);
for (int j = 0; j < nParamCount; j++)
{
if (lppParam[j] && lppParam[j]->nSrcAlgoID == m_nID)
{
PLP_ALGORITHM_PARAM param = this->GetOutParam(lppParam[j]->nSrcParamID);
if (param)
{
lppParam[j]->value = param->value;
// QString strParaName = param->strName;
// QString str = showVariant(param->type, param->value);
rltList.push_back(lppAlgo[i]->GetID());
if (lppParam[j]->strName == LP_DETECTOR_ALGO_PARAM_RELY_COORDINATE && lppParam[j]->type == LP_TRANSFORM)
{
lppAlgo[i]->InitRoiInfo();
}
}
}
}
delete[] lppParam;
}
}
}
delete[] lppAlgo;
}
return rltList;
}
QList<int> CDetectorAlgorithm::GetRelyOnAlgo()
{
if (!m_pTask)
return QList<int>();
QList<int> rltList;
int nAlgoCount = m_pTask->EnumAlgorithm(NULL, 0);
if (nAlgoCount > 0)
{
CDetectorAlgorithm** lppAlgo = new CDetectorAlgorithm*[nAlgoCount];
nAlgoCount = m_pTask->EnumAlgorithm((IDetectorAlgorithm**)lppAlgo, nAlgoCount);
for (int i = 0; i < nAlgoCount; i++)
{
if (lppAlgo[i])
{
int nParamCount = lppAlgo[i]->EnumParam(NULL, 0);
if (nParamCount > 0)
{
PLP_ALGORITHM_PARAM* lppParam = new PLP_ALGORITHM_PARAM[nParamCount];
nParamCount = lppAlgo[i]->EnumParam(lppParam, nParamCount);
for (int j = 0; j < nParamCount; j++)
{
if (lppParam[j] && lppParam[j]->nSrcAlgoID == m_nID)
{
PLP_ALGORITHM_PARAM param = this->GetOutParam(lppParam[j]->nSrcParamID);
if (param)
{
rltList.push_back(lppAlgo[i]->GetID());
}
}
}
delete[] lppParam;
}
}
}
delete[] lppAlgo;
}
return rltList;
}
bool CDetectorAlgorithm::Exec()
{
//quint64 msec = QDateTime::currentMSecsSinceEpoch();
int64 start = cv::getTickCount();
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (p && !p->bIsLock && p->nSrcAlgoID != LP_DETECTOR_INVALID_ID && p->nSrcParamID != LP_DETECTOR_INVALID_ID)
{
//qWarning() << "handle rely algo";
IDetectorAlgorithm* pAlgo = m_pTask->GetAlgorithm(p->nSrcAlgoID);
if (pAlgo)
{
if (pAlgo->Exec())
{
PLP_ALGORITHM_PARAM pOutValue = pAlgo->GetOutParam(p->nSrcParamID);
if (pOutValue && (pOutValue->type == p->type || p->type == LP_VARIANT))
{
p->value = pOutValue->value;
}
}
else
return false;
}
}
}
if (m_pAlgo)
{
qDebug("running old version");
m_pAlgo->Exec(m_pTask, this);
}
else
{
qDebug("running new version");
if (m_pAlgoLibMgr)
{
IAlgorithmLib* pAlgoLib = m_pAlgoLibMgr->GetAlgorithmLib(m_tAlgorithmInfo.strLibName);
if (pAlgoLib)
{
if (!InitRoiInfo())
{
// qWarning("init algorithm roi info fail");
}
pAlgoLib->CallFunc(m_tAlgorithmInfo.strFuncName, m_pTask, this);
}
}
}
m_dExecTime = (cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
qDebug()<<QString("algo name:%1, algo exec time: %2").arg(m_tAlgorithmInfo.strName).arg(m_dExecTime);
return true;
}
bool CDetectorAlgorithm::ExecOnce()
{
int64 start = cv::getTickCount();
if (m_bIsFinished)
return true;
//double start = (double)cv::getTickCount();
//quint64 msec = QDateTime::currentMSecsSinceEpoch();
//LARGE_INTEGER litmp;
//LONGLONG startTime, endTime;
//double dfMinus, dfFreq, dfTime;
//QueryPerformanceFrequency(&litmp);
//dfFreq = (double)litmp.QuadPart;
//QueryPerformanceCounter(&litmp);
//startTime = litmp.QuadPart;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (p && !p->bIsLock && p->nSrcAlgoID != LP_DETECTOR_INVALID_ID && p->nSrcParamID != LP_DETECTOR_INVALID_ID)
{
CDetectorAlgorithm* pAlgo = (CDetectorAlgorithm*)m_pTask->GetAlgorithm(p->nSrcAlgoID);
if (pAlgo && pAlgo->IsEnabled())
{
if (pAlgo->ExecOnce())
{
PLP_ALGORITHM_PARAM pOutValue = pAlgo->GetOutParam(p->nSrcParamID);
if (pOutValue && (pOutValue->type == p->type || p->type == LP_VARIANT))
{
p->value = pOutValue->value;
}
}
else
return false;
}
}
}
if (m_pAlgo)
{
m_pAlgo->Exec(m_pTask, this);
m_bIsFinished = true;
}
else
{
if (m_pAlgoLibMgr)
{
IAlgorithmLib* pAlgoLib = m_pAlgoLibMgr->GetAlgorithmLib(m_tAlgorithmInfo.strLibName);
if (pAlgoLib)
{
if (!InitRoiInfo())
{
// qWarning("init algorithm roi info fail");
}
pAlgoLib->CallFunc(m_tAlgorithmInfo.strFuncName, m_pTask, this);
m_bIsFinished = true;
}
}
}
//QueryPerformanceCounter(&litmp);
//endTime = litmp.QuadPart;
//dfMinus = (double)(endTime - startTime);
//dfTime = dfMinus / dfFreq;
m_dExecTime = (cv::getTickCount() - start) / cv::getTickFrequency() * 1000;
qDebug() << QString("algo name:%1, algo exec time: %2").arg(m_tAlgorithmInfo.strName).arg(m_dExecTime);
return true;
}
void CDetectorAlgorithm::SetRoiInfo(const QPolygonF& roi)
{
//QWriteLocker locker(&m_mutex);
//m_Roi = roi;
m_worldRoi = roi;
}
bool CDetectorAlgorithm::InitRoiInfo()
{
PLP_ALGORITHM_PARAM relyCoordinateParam = GetParamByName(LP_DETECTOR_ALGO_PARAM_RELY_COORDINATE);
PLP_ALGORITHM_PARAM relativeRoiParam = GetParamByName(LP_DETECTOR_ALGO_PARAM_RELATIVE_ROI);
PLP_ALGORITHM_PARAM RoiParam = GetParamByName("roi");
if (!relyCoordinateParam || !relativeRoiParam || !RoiParam)
return false;
//获取输入参数
QPolygonF relativeRoi = relativeRoiParam->value.value<QPolygonF>();
QTransform relyCoordinate = relyCoordinateParam->value.value<QTransform>();
QPolygonF roi = RoiParam->value.value<QPolygonF>();
//判断roi是否存在如果是则更新对应的relative_roi
if (/*m_Roi.size()*/ roi.size() > 0)
{
relativeRoi = relyCoordinate.inverted().map(roi);
UpdateParamValueByName("roi", (QVariant)QPolygonF());
UpdateParamValueByName(LP_DETECTOR_ALGO_PARAM_RELATIVE_ROI, (QVariant)relativeRoi);
//m_Roi.clear();
}
//计算世界坐标系下的roi
//qWarning("relativeRoi:(%d,%d),(%d,%d),(%d,%d),(%d.%d)", relativeRoi.at(0).x(), relativeRoi.at(0).y(), relativeRoi.at(1).x(), relativeRoi.at(1).y(), relativeRoi.at(2).x(), relativeRoi.at(2).y(), relativeRoi.at(3).x(), relativeRoi.at(3).y());
//qWarning("relyCoordinate:%d,%d,%d,%d", relyCoordinate.m11(), relyCoordinate.m12(), relyCoordinate.m21(), relyCoordinate.m22());
m_worldRoi = relyCoordinate.map(relativeRoi);
return true;
}
QVariant CDetectorAlgorithm::GetParamValue(QString strKey, AlgoParamType type)
{
if (m_mapParams.value(strKey))
{
return m_mapParams.value(strKey)->value;
}
return NULL;
}
QVariant CDetectorAlgorithm::GetOutParamValue(QString strKey, AlgoParamType type)
{
if (m_mapOutParams.value(strKey))
{
return m_mapOutParams.value(strKey)->value;
}
return NULL;
}
bool CDetectorAlgorithm::SetOutParamValue(QString strKey, QVariant value)
{
PLP_ALGORITHM_PARAM pParam = m_mapOutParams.value(strKey);
if (pParam)
{
if (pParam->type == LP_IMAGE)
{
QImage img = value.value<QImage>();
pParam->value = img;
}
else
{
pParam->value = value;
}
return true;
}
else
{
PLP_ALGORITHM_PARAM p = new LP_ALGORITHM_PARAM;
p->nID = ++m_nOutParamBaseID;
p->strName = strKey;
p->type = LP_VARIANT;
p->value = value;
m_vecOutParams[p->strName] = p;
m_mapOutParams.insert(p->strName, p);
}
return false;
}
bool CDetectorAlgorithm::Copy(IDetectorAlgorithm* pSrcAlgo, bool bRet /* = true */)
{
if (!pSrcAlgo)
return false;
if (bRet)
m_nID = pSrcAlgo->GetID();
if (!SetAlgorithmInfo(pSrcAlgo->GetAlgorithmInfo()))
return false;
m_bIsExec = pSrcAlgo->IsEnabled();
int nParamCount = pSrcAlgo->EnumParam(NULL, 0);
if (nParamCount > 0)
{
PLP_ALGORITHM_PARAM* lppParam = new PLP_ALGORITHM_PARAM[nParamCount];
nParamCount = pSrcAlgo->EnumParam(lppParam, nParamCount);
for (int i = 0; i < nParamCount; i++)
{
if (lppParam[i])
{
LP_ALGORITHM_PARAM* p = new LP_ALGORITHM_PARAM;
p->nID = lppParam[i]->nID;
p->nTaskID = lppParam[i]->nTaskID;
p->nSrcAlgoID = lppParam[i]->nSrcAlgoID;
p->nSrcParamID = lppParam[i]->nSrcParamID;
p->strName = lppParam[i]->strName;
p->type = lppParam[i]->type;
p->value = lppParam[i]->value;
p->strDescription = lppParam[i]->strDescription;
p->bIsSave = lppParam[i]->bIsSave;
p->bIsLock = lppParam[i]->bIsLock;
m_vecParams[p->strName] = p;
m_mapParams.insert(p->strName, p);
qWarning() << "copy lock state :" << p->bIsLock;
}
}
delete[] lppParam;
}
int nParamOutCount = pSrcAlgo->EnumOutParam(NULL, 0);
if (nParamOutCount > 0)
{
PLP_ALGORITHM_PARAM* lppOutParam = new PLP_ALGORITHM_PARAM[nParamOutCount];
nParamOutCount = pSrcAlgo->EnumOutParam(lppOutParam, nParamOutCount);
for (int i = 0; i < nParamOutCount; i++)
{
if (lppOutParam[i])
{
LP_ALGORITHM_PARAM* p = new LP_ALGORITHM_PARAM;
p->nID = lppOutParam[i]->nID;
p->nTaskID = lppOutParam[i]->nTaskID;
p->nSrcAlgoID = lppOutParam[i]->nSrcAlgoID;
p->nSrcParamID = lppOutParam[i]->nSrcParamID;
p->strName = lppOutParam[i]->strName;
p->type = lppOutParam[i]->type;
p->value = lppOutParam[i]->value;
p->strDescription = lppOutParam[i]->strDescription;
p->bIsSave = lppOutParam[i]->bIsSave;
p->bIsLock = lppOutParam[i]->bIsLock;
m_vecOutParams[p->strName] = p;
m_mapOutParams.insert(p->strName, p);
}
}
delete[] lppOutParam;
}
m_nParamBaseID = pSrcAlgo->GetParamBaseID();
m_nOutParamBaseID = pSrcAlgo->GetOutParamBaseID();
if (m_tAlgorithmInfo.strLibName.size() > 0 && m_tAlgorithmInfo.strFuncName.size() > 0)
return true;
if (m_tAlgorithmInfo.strPath.size() > 0)
{
Load(m_tAlgorithmInfo.strPath.left(m_tAlgorithmInfo.strPath.lastIndexOf(".")));
}
else
{
Load(m_tAlgorithmInfo.strName);
}
return true;
}
bool CDetectorAlgorithm::InitAlgo()
{
if (!m_pTask)
return false;
m_nOutParamBaseID = 0;
m_nParamBaseID = 0;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (NULL != p)
{
delete p;
}
}
m_vecParams.clear();
m_mapParams.clear();
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecOutParams.begin();
iter != m_vecOutParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (NULL != p)
{
delete p;
}
}
m_vecOutParams.clear();
m_mapOutParams.clear();
if (m_pAlgo)
{
return m_pAlgo->Init(m_pTask, this);
}
else
{
if (m_pAlgoLibMgr)
{
IAlgorithmLib* pAlgoLib = m_pAlgoLibMgr->GetAlgorithmLib(m_tAlgorithmInfo.strLibName);
if (pAlgoLib)
{
return pAlgoLib->InitAlgo(m_pTask, this);
}
}
}
return true;
}
bool CDetectorAlgorithm::ImportParam(QJsonArray paramArray)//导入参数
{
if (!paramArray.isEmpty() && paramArray.size() > 0)
{
m_nParamBaseID = 0;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (NULL != p)
{
delete p;
}
}
m_vecParams.clear();
}
for (int i = 0; i < paramArray.size(); i++)
{
LP_ALGORITHM_PARAM param;
QJsonObject jsonObject = paramArray[i].toObject();
// param.nID = jsonObject.value("param_id").toInt();
// param.nSrcAlgoID = jsonObject.value("param_src_algo_id").toInt();
// param.nSrcParamID = jsonObject.value("param_src_param_id").toInt();
param.strName = jsonObject.value("param_name").toString();
param.type = (AlgoParamType)jsonObject.value("param_type").toInt();
switch (param.type)
{
case LP_INT:
{
param.value = jsonObject.value("param_value").toInt();
break;
}
case LP_BOOLEAN:
{
param.value = jsonObject.value("param_value").toBool();
break;
}
case LP_STRING:
{
param.value = jsonObject.value("param_value").toString();
break;
}
case LP_DOUBLE:
{
param.value = jsonObject.value("param_value").toDouble();
break;
}
case LP_IMAGE:
{
break;
}
case LP_MAT:
{
QString strFileName = jsonObject.value("param_value").toString();
std::string strpath = strFileName.toLocal8Bit().toStdString();
cv::Mat resultFile = cv::imread(strpath, CV_LOAD_IMAGE_UNCHANGED);
param.value.setValue(resultFile);
if (m_pTask)
m_pTask->AppendOtherFile(QString(strpath.c_str()));
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roiData;
//QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = m_pTask->GetPath(); //strExePath + LP_DETECTOR_BUSSINESS_IMAGE_DIR;
QString strFileName = strFilePath + QString::number(param.nID) + ".bmp";
std::string strpath = strFileName.toLocal8Bit().toStdString();
roiData.img = cv::imread(strpath, CV_LOAD_IMAGE_UNCHANGED);
QJsonArray recordArray = jsonObject.value("param_value").toArray();
int nRecordCount = recordArray.size();
if (nRecordCount > 0)
{
Record_List recordList;
for (int i = 0; i < nRecordCount; i++)
{
QJsonArray itemArray = recordArray.at(i).toArray();
int nItemCount = itemArray.size();
if (nItemCount > 0)
{
Item_List itemList;
for (int j = 0; j < nItemCount; j++)
{
QJsonObject itemJson = itemArray.at(j).toObject();
Feature_List item;
item.first = itemJson.value("roi_item_type").toInt();
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
item.second.push_back(itemJson.value("roi_item_value1").toDouble());
item.second.push_back(itemJson.value("roi_item_value2").toDouble());
item.second.push_back(itemJson.value("roi_item_value3").toDouble());
item.second.push_back(itemJson.value("roi_item_value4").toDouble());
break;
}
case CIRCLE:
{
item.second.push_back(itemJson.value("roi_item_value1").toDouble());
item.second.push_back(itemJson.value("roi_item_value2").toDouble());
item.second.push_back(itemJson.value("roi_item_value3").toDouble());
break;
}
case POLY:
{
break;
}
default:
break;
}
itemList.push_back(item);
}
recordList.push_back(itemList);
}
roiData.records = recordList;
}
}
param.value.setValue(roiData);
break;
}
default:
break;
}
param.strDescription = jsonObject.value("param_description").toString();
PLP_ALGORITHM_PARAM pParam = (PLP_ALGORITHM_PARAM)AddParam(&param,false);
}
return true;
}
QByteArray CDetectorAlgorithm::ExportParam()
{
QJsonDocument document;
QJsonArray paramArray;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
if (*iter)
{
PLP_ALGORITHM_PARAM p = (PLP_ALGORITHM_PARAM)*iter;
QJsonObject jsonParam;
// jsonParam.insert("param_id", p->nID);
// jsonParam.insert("param_src_algo_id", p->nSrcAlgoID);
// jsonParam.insert("param_src_param_id", p->nSrcParamID);
jsonParam.insert("param_name", p->strName);
jsonParam.insert("param_type", p->type);
switch (p->type)
{
case LP_INT:
{
jsonParam.insert("param_value", p->value.toInt());
break;
}
case LP_BOOLEAN:
{
jsonParam.insert("param_value", p->value.toBool());
break;
}
case LP_STRING:
{
jsonParam.insert("param_value", p->value.toString());
break;
}
case LP_DOUBLE:
{
jsonParam.insert("param_value", p->value.toDouble());
break;
}
case LP_IMAGE:
{
break;
}
case LP_MAT:
{
cv::Mat matResult = p->value.value<cv::Mat>();
QString strExePath = m_pTask->GetPath(); //QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + "/" + "paramfiles/";
QString strFileName = strFilePath + QString::number(p->nID) + ".bmp";
std::string strpath = strFileName.toLocal8Bit().toStdString();
if (!matResult.empty() && !cv::imwrite(strpath, matResult))
return false;
jsonParam.insert("param_value", strFileName);
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roiData = p->value.value<LP_DETECTOR_ROI_DATA>();
QString strExePath = m_pTask->GetPath(); //QCoreApplication::applicationDirPath();
QString strFilePath = m_pTask->GetPath()+"/"; //strExePath + "/" + "images/";
QString strFileName = strFilePath + QString::number(p->nID) + ".bmp";
std::string strpath = strFileName.toLocal8Bit().toStdString();
if (!roiData.img.empty() && !cv::imwrite(strpath, roiData.img))
return false;
int nCount = roiData.records.size();
if (nCount > 0)
{
QJsonArray recordArray;
for (int i = 0; i < nCount; i++)
{
QJsonArray itemArray;
Item_List record = roiData.records.at(i);
int nItemCount = record.size();
for (int j = 0; j < nItemCount; j++)
{
QJsonObject itemJson;
Feature_List item = record.at(j);
itemJson.insert("roi_item_type", item.first);
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
itemJson.insert("roi_item_value1", item.second.at(0));
itemJson.insert("roi_item_value2", item.second.at(1));
itemJson.insert("roi_item_value3", item.second.at(2));
itemJson.insert("roi_item_value4", item.second.at(3));
break;
}
case CIRCLE:
{
itemJson.insert("roi_item_value1", item.second.at(0));
itemJson.insert("roi_item_value2", item.second.at(1));
itemJson.insert("roi_item_value3", item.second.at(2));
break;
}
case POLY:
{
break;
}
default:
break;
}
itemArray.push_back(itemJson);
}
recordArray.push_back(itemArray);
}
jsonParam.insert("param_value", recordArray);
}
break;
}
default:
break;
}
jsonParam.insert("param_description", p->strDescription);
paramArray.push_back(jsonParam);
}
}
if (paramArray.size() > 0)
document.setArray(paramArray);
return document.toJson();
}
bool CDetectorAlgorithm::ImportOutParam(QJsonArray outParamArray)//导入参数
{
if (!outParamArray.isEmpty() && outParamArray.size() > 0)
{
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecOutParams.begin();
iter != m_vecOutParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (NULL != p)
{
delete p;
}
}
m_vecOutParams.clear();
m_mapOutParams.clear();
}
for (int i = 0; i < outParamArray.size(); i++)
{
LP_ALGORITHM_PARAM param;
QJsonObject jsonObject = outParamArray[i].toObject();
// param.nID = jsonObject.value("out_param_id").toInt();
param.strName = jsonObject.value("param_name").toString();
param.type = (AlgoParamType)jsonObject.value("param_type").toInt();
switch (param.type)
{
case LP_INT:
{
param.value = jsonObject.value("param_value").toInt();
break;
}
case LP_BOOLEAN:
{
param.value = jsonObject.value("param_value").toBool();
break;
}
case LP_STRING:
{
param.value = jsonObject.value("param_value").toString();
break;
}
case LP_DOUBLE:
{
param.value = jsonObject.value("param_value").toDouble();
break;
}
case LP_IMAGE:
{
break;
}
case LP_MAT:
{
QString strFileName = jsonObject.value("param_value").toString();
std::string strpath = strFileName.toLocal8Bit().toStdString();
cv::Mat resultFile = cv::imread(strpath);
param.value.setValue(resultFile);
if (m_pTask)
m_pTask->AppendOtherFile(QString(strpath.c_str()));
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roiData;
//QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = m_pTask->GetPath()+"/"; //strExePath + LP_DETECTOR_BUSSINESS_IMAGE_DIR;
QString strFileName = strFilePath + QString::number(param.nID) + ".bmp";
std::string strpath = strFileName.toLocal8Bit().toStdString();
roiData.img = cv::imread(strpath, CV_LOAD_IMAGE_UNCHANGED);
QJsonArray recordArray = jsonObject.value("param_value").toArray();
int nRecordCount = recordArray.size();
if (nRecordCount > 0)
{
Record_List recordList;
for (int i = 0; i < nRecordCount; i++)
{
QJsonArray itemArray = recordArray.at(i).toArray();
int nItemCount = itemArray.size();
if (nItemCount > 0)
{
Item_List itemList;
for (int j = 0; j < nItemCount; j++)
{
QJsonObject itemJson = itemArray.at(j).toObject();
Feature_List item;
item.first = itemJson.value("roi_item_type").toInt();
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
item.second.push_back(itemJson.value("roi_item_value1").toDouble());
item.second.push_back(itemJson.value("roi_item_value2").toDouble());
item.second.push_back(itemJson.value("roi_item_value3").toDouble());
item.second.push_back(itemJson.value("roi_item_value4").toDouble());
break;
}
case CIRCLE:
{
item.second.push_back(itemJson.value("roi_item_value1").toDouble());
item.second.push_back(itemJson.value("roi_item_value2").toDouble());
item.second.push_back(itemJson.value("roi_item_value3").toDouble());
break;
}
case POLY:
{
break;
}
default:
break;
}
itemList.push_back(item);
}
recordList.push_back(itemList);
}
roiData.records = recordList;
}
}
param.value.setValue(roiData);
break;
}
default:
break;
}
//param.strDescription = jsonObject.value("out_param_description").toString();
PLP_ALGORITHM_PARAM pParam = (PLP_ALGORITHM_PARAM)AddOutParam(&param,false);
}
return true;
}
QByteArray CDetectorAlgorithm::ExportOutParam()//导出参数
{
QJsonDocument document;
QJsonArray outParamArray;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecOutParams.begin();
iter != m_vecOutParams.end(); ++iter)
{
if (*iter)
{
PLP_ALGORITHM_PARAM p = (PLP_ALGORITHM_PARAM)*iter;
QJsonObject jsonParam;
// jsonParam.insert("out_param_id", p->nID);
jsonParam.insert("param_name", p->strName);
jsonParam.insert("param_type", p->type);
switch (p->type)
{
case LP_INT:
{
jsonParam.insert("param_value", p->value.toInt());
break;
}
case LP_BOOLEAN:
{
jsonParam.insert("param_value", p->value.toBool());
break;
}
case LP_STRING:
{
jsonParam.insert("param_value", p->value.toString());
break;
}
case LP_DOUBLE:
{
jsonParam.insert("param_value", p->value.toDouble());
break;
}
case LP_IMAGE:
{
break;
}
case LP_MAT:
{
cv::Mat matResult = p->value.value<cv::Mat>();
//QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = m_pTask->GetPath()+"/"; //strExePath + "/" + "paramfiles/";
QString strFileName = strFilePath + QString::number(p->nID) + ".bmp";
std::string strpath = strFileName.toLocal8Bit().toStdString();
if (!matResult.empty() && !cv::imwrite(strpath, matResult))
return false;
jsonParam.insert("param_value", strFileName);
break;
}
case LP_ROI:
{
LP_DETECTOR_ROI_DATA roiData = p->value.value<LP_DETECTOR_ROI_DATA>();
QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + "/" + "images/";
QString strFileName = strFilePath + QString::number(p->nID) + ".bmp";
std::string strpath = strFileName.toLocal8Bit().toStdString();
if (!roiData.img.empty() && !cv::imwrite(strpath, roiData.img))
return false;
int nCount = roiData.records.size();
if (nCount > 0)
{
QJsonArray recordArray;
for (int i = 0; i < nCount; i++)
{
QJsonArray itemArray;
Item_List record = roiData.records.at(i);
int nItemCount = record.size();
for (int j = 0; j < nItemCount; j++)
{
QJsonObject itemJson;
Feature_List item = record.at(j);
itemJson.insert("roi_item_type", item.first);
switch (item.first)
{
case RECTANGLE:
case ELLIPSE:
{
itemJson.insert("roi_item_value1", item.second.at(0));
itemJson.insert("roi_item_value2", item.second.at(1));
itemJson.insert("roi_item_value3", item.second.at(2));
itemJson.insert("roi_item_value4", item.second.at(3));
break;
}
case CIRCLE:
{
itemJson.insert("roi_item_value1", item.second.at(0));
itemJson.insert("roi_item_value2", item.second.at(1));
itemJson.insert("roi_item_value3", item.second.at(2));
break;
}
case POLY:
{
break;
}
default:
break;
}
itemArray.push_back(itemJson);
}
recordArray.push_back(itemArray);
}
jsonParam.insert("param_value", recordArray);
}
break;
}
default:
break;
}
jsonParam.insert("param_description", p->strDescription);
outParamArray.push_back(jsonParam);
}
}
if (outParamArray.size() > 0)
document.setArray(outParamArray);
return document.toJson();
}
bool CDetectorAlgorithm::SwapParamOrder(int nID1, int nID2)
{
PLP_ALGORITHM_PARAM pParam1 = NULL, pParam2 = NULL;
LP_ALGORITHM_PARAM tempParam;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
if (NULL != *iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (p->nID == nID1)
{
pParam1 = p;
}
if (p->nID == nID2)
{
pParam2 = p;
}
if (pParam1 && pParam2)
{
tempParam = *pParam1;
*pParam1 = *pParam2;
*pParam2 = tempParam;
return true;
}
}
}
return false;
}
bool CDetectorAlgorithm::InsertParamOrder(int nID, int nIndex)
{
if (nIndex < 0 || nIndex > m_vecParams.count() - 1)
return false;
PLP_ALGORITHM_PARAM pParam = NULL;
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (NULL != p && p->nID == nID)
{
pParam = p;
iter = m_vecParams.erase(iter);
PLP_ALGORITHM_PARAM tempP = m_vecParams.take(iter.key());
delete tempP;
break;
}
}
if (pParam)
m_vecParams.insert(pParam->strName, pParam);
return true;
}
bool CDetectorAlgorithm::UpdateParamValue(int nParamID, QVariant& value)
{
PLP_ALGORITHM_PARAM pParam = GetParam(nParamID);
if (!pParam)
return false;
pParam->value = value;
return true;
}
PLP_ALGORITHM_PARAM CDetectorAlgorithm::GetParamByName(QString strName)
{
QReadLocker locker(&m_mutex);
return m_mapParams.value(strName);
}
PLP_ALGORITHM_PARAM CDetectorAlgorithm::GetOutParamByName(QString strName)
{
QReadLocker locker(&m_mutex);
return m_mapOutParams.value(strName);
}
bool CDetectorAlgorithm::UpdateParamValueByName(QString strName, QVariant& value)
{
QWriteLocker locker(&m_mutex);
bool bRet = false;
PLP_ALGORITHM_PARAM p = m_mapParams.value(strName);
if (p)
{
p->value = value;
bRet = true;
}
return bRet;
}
void CDetectorAlgorithm::LoadUserParamValue(int nParamID /*= LP_DETECTOR_INVALID_ID*/)
{
if (!m_pAlgo)
return;
if (nParamID == LP_DETECTOR_INVALID_ID)
{
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
if (NULL != *iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (p->type == LP_USER)
m_pAlgo->LoadUserParamValue(m_pTask, this, p->strName, p->value);
}
}
}
else
{
PLP_ALGORITHM_PARAM p = GetParam(nParamID);
if (p)
{
if (p->type == LP_USER)
m_pAlgo->LoadUserParamValue(m_pTask, this, p->strName, p->value);
}
}
}
void CDetectorAlgorithm::SaveUserParamValue(int nParamID /*= LP_DETECTOR_INVALID_ID*/)
{
if (!m_pAlgo)
return;
if (nParamID == LP_DETECTOR_INVALID_ID)
{
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
if (NULL != *iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (p->type == LP_USER)
m_pAlgo->SaveUserParamValue(m_pTask, this, p->strName);
}
}
}
else
{
PLP_ALGORITHM_PARAM p = GetParam(nParamID);
if (p)
{
if (p->type == LP_USER)
m_pAlgo->SaveUserParamValue(m_pTask, this, p->strName);
}
}
}
void CDetectorAlgorithm::ClearUserParamValue(int nParamID /*= LP_DETECTOR_INVALID_ID*/)
{
if (!m_pAlgo)
return;
if (nParamID == LP_DETECTOR_INVALID_ID)
{
for (QMap<QString, PLP_ALGORITHM_PARAM>::iterator iter = m_vecParams.begin();
iter != m_vecParams.end(); ++iter)
{
if (NULL != *iter)
{
PLP_ALGORITHM_PARAM p = *iter;
if (p->type == LP_USER)
p->value.clear();
}
}
}
else
{
PLP_ALGORITHM_PARAM p = GetParam(nParamID);
if (p)
{
if (p->type == LP_USER)
p->value.clear();
}
}
}
bool CDetectorAlgorithm::HandleEvent(QString strParamName /*= ""*/, int event/* = -1*/)
{
IAlgorithmLib* pAlgoLib = m_pAlgoLibMgr->GetAlgorithmLib(m_tAlgorithmInfo.strLibName);
if (pAlgoLib)
{
return pAlgoLib->HandleEvent(m_pTask, this, strParamName, event);
}
return false;
}