1、优化旧lpengine模块中的解决方案管理流程

master
bob.pan 5 years ago
parent 5922b42a1e
commit 9acbdfb7e8

@ -164,10 +164,6 @@ CMainFrame::CMainFrame(QWidget *parent)
ui->statusBar->addWidget(m_plablStatus);
_pSaveStatus = ui->label_SaveStatus;
// m_tParamMgrDlg.setParent(this);
// m_tParamMgrDlg.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
//m_tParamDlg.setParent(parent);
//m_tParamDlg.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
}
CMainFrame::~CMainFrame()
@ -195,12 +191,6 @@ bool CMainFrame::OnMainMenuTrigger(QAction* pAction)
if (!oldMat.empty())
_pOldTask->GetTaskInfo()->templateImg = oldMat;
}
// if (m_pDE && m_pDE->SaveTasks(m_TaskChangeList))
// {
// m_TaskChangeList.clear();
// return true;
// }
return false;
}
}
@ -217,28 +207,28 @@ void CMainFrame::OnTrigger()
if (!oldMat.empty())
_pOldTask->GetTaskInfo()->templateImg = oldMat;
}
// if (m_pDE && m_pDE->SaveTasks(m_TaskChangeList))
// {
// if (_pSaveStatus)
// {
// _pSaveStatus->setText(QObject::tr(" 标定数据保存完成!"));
// QTimer::singleShot(1500, [&](){
// _pSaveStatus->setText("");
// update();
// });
// m_TaskChangeList.clear();
// SystemStateInfo::bParamStateFlag = false;
// }
// }
// else
// {
// if (_pSaveStatus)
// {
// _pSaveStatus->setText(QObject::tr(" 保存失败!"));
// QTimer::singleShot(2000, [&](){_pSaveStatus->setText(""); });
// update();
// }
// }
if (m_pDE && m_pSolutionMgr->SaveByNames(m_TaskChangeList))
{
if (_pSaveStatus)
{
_pSaveStatus->setText(QObject::tr(" 标定数据保存完成!"));
QTimer::singleShot(1500, [&](){
_pSaveStatus->setText("");
update();
});
m_TaskChangeList.clear();
SystemStateInfo::bParamStateFlag = false;
}
}
else
{
if (_pSaveStatus)
{
_pSaveStatus->setText(QObject::tr(" 保存失败!"));
QTimer::singleShot(2000, [&](){_pSaveStatus->setText(""); });
update();
}
}
}
}
@ -280,19 +270,19 @@ bool CMainFrame::InitGraphView()
ui->textEdit->setWordWrapMode(QTextOption::NoWrap);
int nSolutionCount = m_pSolutionMgr->EnumSolution(NULL, 0);
if (nSolutionCount > 0)
//int nSolutionCount = m_pSolutionMgr->GetSolutionCount();
//if (nSolutionCount > 0)
{
IDetectorSolution** lppSolution = new IDetectorSolution*[nSolutionCount];
nSolutionCount = m_pSolutionMgr->EnumSolution(lppSolution, nSolutionCount);
for (int i = 0; i < nSolutionCount; i++)
QMap<int, IDetectorSolution*> tmp = m_pSolutionMgr->GetAllSolutions();
for (QMap<int, IDetectorSolution*>::iterator it = tmp.begin();it!= tmp.end();++it)
{
if (lppSolution[i])
IDetectorSolution* tmpSolution = *it;
if (tmpSolution != nullptr)
{
PLP_DETECTOR_SOLUTION pSolutionInfo = lppSolution[i]->GetSolutionInfo();
PLP_DETECTOR_SOLUTION pSolutionInfo = tmpSolution->GetSolutionInfo();
QTreeWidgetItem *solutionItem = NULL;
if (m_pSolutionMgr->GetRunSolution() && m_pSolutionMgr->GetRunSolution()->GetID() == lppSolution[i]->GetID())
if (m_pSolutionMgr->GetRunSolution() && m_pSolutionMgr->GetRunSolution()->GetID() == tmpSolution->GetID())
{
QString strText = pSolutionInfo->strName + tr("(√)");
solutionItem = new QTreeWidgetItem(ui->treeWidget, QStringList(strText));
@ -302,14 +292,14 @@ bool CMainFrame::InitGraphView()
solutionItem = new QTreeWidgetItem(ui->treeWidget, QStringList(pSolutionInfo->strName));
}
solutionItem->setData(0, Qt::UserRole, lppSolution[i]->GetID());
solutionItem->setData(0, Qt::UserRole, tmpSolution->GetID());
solutionItem->setData(1, Qt::UserRole, SOLUTION);
QStringList strKeys = lppSolution[i]->GetAllTaskNames();
QStringList strKeys = tmpSolution->GetAllTaskNames();
QMap<int, TaskMapStr> m_tmpMap;
for (int n = 0; n < strKeys.size();n++)
{
IDetectorTask* pTask = lppSolution[i]->GetTask(strKeys[n]);
IDetectorTask* pTask = tmpSolution->GetTask(strKeys[n]);
if (pTask)
{
PLP_DETECTOR_TASK pTaskInfo = pTask->GetTaskInfo();
@ -336,7 +326,7 @@ bool CMainFrame::InitGraphView()
int camID = its.key();
QString strStationName = QString(QObject::tr("工位%1")).arg(camID);
QTreeWidgetItem *childItem = new QTreeWidgetItem(solutionItem, QStringList(strStationName));
childItem->setData(0, Qt::UserRole, lppSolution[i]->GetID());
childItem->setData(0, Qt::UserRole, tmpSolution->GetID());
childItem->setData(1, Qt::UserRole, SOLUTION);
solutionItem->addChild(childItem);
@ -373,26 +363,24 @@ bool CMainFrame::InitGraphView()
}
}
if (i == 0)
//if (i == 0)
{
ui->treeWidget->setCurrentItem(solutionItem);
}
if (m_pSolutionMgr->GetRunSolution() && m_pSolutionMgr->GetRunSolution()->GetID() == lppSolution[i]->GetID())
if (m_pSolutionMgr->GetRunSolution() && m_pSolutionMgr->GetRunSolution()->GetID() == tmpSolution->GetID())
{
ui->treeWidget->setCurrentItem(solutionItem);
ui->treeWidget->expandItem(solutionItem);
ui->treeWidget->setCurrentItem( solutionItem);
ui->treeWidget->setCurrentItem(solutionItem);
}
}
}
delete[] lppSolution;
}
if (!InitCurrentTask())
return false;
m_TaskChangeList.clear();
if (!InitCurrentTask())
return true;
return true;
}
@ -674,7 +662,7 @@ bool CMainFrame::InitCurrentNode()
m_pCurrentSolution->ClearUserParamValue();
int nSolutionID = currentItem->data(0, Qt::UserRole).toInt();
m_pCurrentSolution = m_pSolutionMgr->GetSolution(nSolutionID);
m_pCurrentSolution = m_pSolutionMgr->GetSolutionByID(nSolutionID);
if (!m_pCurrentSolution)
return false;
@ -686,7 +674,7 @@ bool CMainFrame::InitCurrentNode()
if (currentItem->parent())
{
int nSolutionID = currentItem->parent()->data(0, Qt::UserRole).toInt();
m_pCurrentSolution = m_pSolutionMgr->GetSolution(nSolutionID);
m_pCurrentSolution = m_pSolutionMgr->GetSolutionByID(nSolutionID);
if (!m_pCurrentSolution)
return false;

@ -2,7 +2,6 @@
#include<QGraphicsSceneMouseEvent>
#include<QGraphicsRectItem>
#include "RoiItem.h"
//#include "colossusbase.h"
#include "QGraphicsSceneEvent"
#include "colossusbase.h"
#pragma execution_character_set("utf-8")

@ -467,8 +467,8 @@ bool CDetectorAlgorithm::SerializeToJson(QJsonDocument* pJsonDocument, QJsonArra
case LP_MAT:
{
cv::Mat matResult = p->value.value<cv::Mat>();
QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + LP_DETECTOR_BUSSINESS_IN_PARAM_FILE_DIR;
//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;
@ -880,8 +880,8 @@ bool CDetectorAlgorithm::SerializeFromJson(QJsonObject* pJsonObject)
}
case LP_MAT:
{
QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + LP_DETECTOR_BUSSINESS_IN_PARAM_FILE_DIR;
//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);
@ -1195,8 +1195,8 @@ bool CDetectorAlgorithm::Load(QString dllPath)
}
else
{
QString strExePath = QCoreApplication::applicationDirPath();
QString strDefaultFilePath = strExePath + LP_DETECTOR_BUSSINESS_CONFIG_ALGO_DIR + strFileName;
//QString strExePath = QCoreApplication::applicationDirPath();
QString strDefaultFilePath = m_pTask->GetPath();// strExePath + LP_DETECTOR_BUSSINESS_CONFIG_ALGO_DIR + strFileName;
QFile defaultFile(strDefaultFilePath);
if (defaultFile.exists())
@ -1849,8 +1849,8 @@ bool CDetectorAlgorithm::ImportParam(QJsonArray paramArray)//导入参数
LP_DETECTOR_ROI_DATA roiData;
QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + LP_DETECTOR_BUSSINESS_IMAGE_DIR;
//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);
@ -1973,7 +1973,7 @@ QByteArray CDetectorAlgorithm::ExportParam()
{
cv::Mat matResult = p->value.value<cv::Mat>();
QString strExePath = QCoreApplication::applicationDirPath();
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();
@ -1988,8 +1988,8 @@ QByteArray CDetectorAlgorithm::ExportParam()
LP_DETECTOR_ROI_DATA roiData = p->value.value<LP_DETECTOR_ROI_DATA>();
QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + "/" + "images/";
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))
@ -2136,8 +2136,8 @@ bool CDetectorAlgorithm::ImportOutParam(QJsonArray outParamArray)//导入参数
LP_DETECTOR_ROI_DATA roiData;
QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + LP_DETECTOR_BUSSINESS_IMAGE_DIR;
//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);
@ -2263,8 +2263,8 @@ QByteArray CDetectorAlgorithm::ExportOutParam()//导出参数
{
cv::Mat matResult = p->value.value<cv::Mat>();
QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + "/" + "paramfiles/";
//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))

@ -39,6 +39,49 @@ IDetectorSolutionMgr* CDetectorEngine::getSolutionMgr() const
return (IDetectorSolutionMgr*)&m_SolutionMgr;
}
bool CDetectorEngine::detect(cv::Mat srcImg, QString modeName, AlgResultCallBack func)
{
IDetectorSolution* pSolution = m_SolutionMgr.GetRunSolution();
if (pSolution)
{
IDetectorTask* pTask = pSolution->GetTask(modeName);
if (pTask)
{
pTask->GetTaskInfo()->detectImg = srcImg;
IDetectorAlgorithm* pAlgo = pTask->GetRunAlgo();
if (pAlgo) {
pAlgo->Exec();
int nOutParam = pAlgo->EnumOutParam(NULL, 0);
if (nOutParam > 0)
{
QVariantMap map;
map.clear();
LP_ALGORITHM_PARAM** lppOutParam = new LP_ALGORITHM_PARAM*[nOutParam];
nOutParam = pAlgo->EnumOutParam(lppOutParam, nOutParam);
for (int j = 0; j < nOutParam; j++)
{
if (lppOutParam[j])
{
map.insert(lppOutParam[j]->strName, lppOutParam[j]->value);
}
}
map.insert("taskID", pTask->GetID());
map.insert("originImage", EngineBase::convMat2QImage(srcImg));
map.insert("tasktime", pTask->ExecTime());
if (func)
{
func(map);
}
delete[] lppOutParam;
}
}
}
}
return false;
}
bool CDetectorEngine::CheckConfigFolder()
{
QString strExePath = QCoreApplication::applicationDirPath();

@ -10,8 +10,9 @@ class CDetectorEngine:public IDetectorEngine
public:
CDetectorEngine();
~CDetectorEngine();
IAlgorithmLibMgr* getAlgorithmLibMgr() const;
IDetectorSolutionMgr* getSolutionMgr() const;
virtual IAlgorithmLibMgr* getAlgorithmLibMgr() const;
virtual IDetectorSolutionMgr* getSolutionMgr() const;
virtual bool detect(cv::Mat srcImg, QString modeName, AlgResultCallBack func);
bool Initialize();
virtual bool Save();
virtual bool SaveTasks(QStringList strTaskNames);

@ -1,21 +1,20 @@
#include "Solution.h"
#include "Task.h"
CDetectorSolution::CDetectorSolution() : m_mutex(QMutex::Recursive)
Solution::Solution() : m_mutex(QMutex::Recursive)
{
m_nID = LP_DETECTOR_INVALID_ID;
m_nBaseID = 0;
m_bIsRun = false;
m_bIsModify = false;
}
CDetectorSolution::~CDetectorSolution()
Solution::~Solution()
{
CleanUp();
}
bool CDetectorSolution::Initialize(IAlgorithmLibMgr* pAlgoLibMgr)
bool Solution::Initialize(IAlgorithmLibMgr* pAlgoLibMgr)
{
if (!pAlgoLibMgr)
return false;
@ -25,7 +24,7 @@ bool CDetectorSolution::Initialize(IAlgorithmLibMgr* pAlgoLibMgr)
return true;
}
bool CDetectorSolution::SetSolutionInfo(const PLP_DETECTOR_SOLUTION pSolution)
bool Solution::SetSolutionInfo(const PLP_DETECTOR_SOLUTION pSolution)
{
if (NULL == pSolution)
return false;
@ -36,12 +35,12 @@ bool CDetectorSolution::SetSolutionInfo(const PLP_DETECTOR_SOLUTION pSolution)
return true;
}
PLP_DETECTOR_SOLUTION CDetectorSolution::GetSolutionInfo()
PLP_DETECTOR_SOLUTION Solution::GetSolutionInfo()
{
return &m_tSolutionInfo;
}
IDetectorTask* CDetectorSolution::AddTask(const PLP_DETECTOR_TASK pTask, QString strPath)
IDetectorTask* Solution::AddTask(const PLP_DETECTOR_TASK pTask, QString strPath)
{
if (NULL == pTask)
return NULL;
@ -63,7 +62,7 @@ IDetectorTask* CDetectorSolution::AddTask(const PLP_DETECTOR_TASK pTask, QString
return NULL;
}
bool CDetectorSolution::AddTaskByCopy(IDetectorTask* pSrc)
bool Solution::AddTaskByCopy(IDetectorTask* pSrc)
{
if (pSrc == nullptr)
return false;
@ -82,7 +81,7 @@ bool CDetectorSolution::AddTaskByCopy(IDetectorTask* pSrc)
return false;
}
IDetectorTask* CDetectorSolution::AddTask(const PLP_DETECTOR_TASK pTask, bool bRet /*= true*/)
IDetectorTask* Solution::AddTask(const PLP_DETECTOR_TASK pTask, bool bRet /*= true*/)
{
if (NULL == pTask)
return NULL;
@ -101,7 +100,7 @@ IDetectorTask* CDetectorSolution::AddTask(const PLP_DETECTOR_TASK pTask, bool bR
return NULL;
}
bool CDetectorSolution::SetRunTask(int nCameraID, QString strTaskName)
bool Solution::SetRunTask(int nCameraID, QString strTaskName)
{
QMap<QString, IDetectorTask*>::iterator it = m_TaskMapByName.find(strTaskName);
if (it != m_TaskMapByName.end())
@ -112,7 +111,7 @@ bool CDetectorSolution::SetRunTask(int nCameraID, QString strTaskName)
return false;
}
bool CDetectorSolution::DeleteTask(int nTaskID)
bool Solution::DeleteTask(int nTaskID)
{
QMap<int, IDetectorTask*>::iterator it = m_TaskMapByID.find(nTaskID);
if (it != m_TaskMapByID.end()){
@ -126,7 +125,7 @@ bool CDetectorSolution::DeleteTask(int nTaskID)
}
return true;
}
bool CDetectorSolution::DeleteTask(QString strName)
bool Solution::DeleteTask(QString strName)
{
QMap<QString, IDetectorTask*>::iterator its = m_TaskMapByName.find(strName);
if (its != m_TaskMapByName.end())
@ -141,7 +140,7 @@ bool CDetectorSolution::DeleteTask(QString strName)
return false;
}
IDetectorTask* CDetectorSolution::GetTask(int nTaskID)
IDetectorTask* Solution::GetTask(int nTaskID)
{
QMap<int, IDetectorTask*>::iterator it = m_TaskMapByID.find(nTaskID);
if (it != m_TaskMapByID.end()){
@ -154,7 +153,7 @@ IDetectorTask* CDetectorSolution::GetTask(int nTaskID)
return nullptr;
}
IDetectorTask* CDetectorSolution::GetTask(QString strName)
IDetectorTask* Solution::GetTask(QString strName)
{
QMap<QString, IDetectorTask*>::iterator its = m_TaskMapByName.find(strName);
if (its != m_TaskMapByName.end())
@ -164,46 +163,27 @@ IDetectorTask* CDetectorSolution::GetTask(QString strName)
return nullptr;
}
int CDetectorSolution::EnumTask(IDetectorTask** lppTask, int nCount)
{
// if (!lppTask || nCount < m_vecTask.size())
// return m_vecTask.size();
int nIndex = 0;
// for (QVector<IDetectorTask*>::iterator iter = m_vecTask.begin();
// iter != m_vecTask.end(); ++iter)
// {
// if (*iter)
// {
// lppTask[nIndex] = *iter;
// nIndex++;
// }
// }
return nIndex;
}
void CDetectorSolution::SetID(int nID)
void Solution::SetID(int nID)
{
m_nID = nID;
}
int CDetectorSolution::GetID() const
int Solution::GetID() const
{
return m_nID;
}
int CDetectorSolution::GetTaskBaseID() const
int Solution::GetTaskBaseID() const
{
return m_nBaseID;
}
void CDetectorSolution::Release()
void Solution::Release()
{
delete this;
}
void CDetectorSolution::CleanUp()
void Solution::CleanUp()
{
for (QMap<int, IDetectorTask*>::iterator it = m_TaskMapByID.begin(); it != m_TaskMapByID.end(); ++it)
{
@ -215,7 +195,7 @@ void CDetectorSolution::CleanUp()
m_CurRunTaskMap.clear();
}
bool CDetectorSolution::CheckTask(int nTaskID, QString strTaskName)
bool Solution::CheckTask(int nTaskID, QString strTaskName)
{
QMap<QString, IDetectorTask*>::iterator it = m_TaskMapByName.find(strTaskName);
if (it != m_TaskMapByName.end())
@ -224,7 +204,7 @@ bool CDetectorSolution::CheckTask(int nTaskID, QString strTaskName)
return false;
}
bool CDetectorSolution::SaveFileEx(const QString& strPath, QStringList sTaskNames)
bool Solution::SaveFileEx(const QString& strPath, QStringList sTaskNames)
{
QDir dir;
if (!dir.exists(strPath))
@ -234,22 +214,27 @@ bool CDetectorSolution::SaveFileEx(const QString& strPath, QStringList sTaskName
dir.setPath(strPath);
foreach(QString strObj, sTaskNames){
foreach(QString strObj, sTaskNames) {
CDetectorTask *p = (CDetectorTask*)m_TaskMapByName.value(strObj);
if (p)
{
QString strTaskFilePath = strPath + "/" + QString::number(p->GetID()) + "_" + p->GetTaskInfo()->strName + ".json";
QString taskPath = strPath + "/" + strObj;
if (!dir.exists(taskPath)) {
dir.mkpath(taskPath);
}
QString strTaskFilePath = taskPath + "/" + /*QString::number(p->GetID()) + "_" + p->GetTaskInfo()->strName*/ + "taskinfo.json";
if (!p->SaveFile(strTaskFilePath))
{
qWarning("save task:%s fail", p->GetTaskInfo()->strName);
}
}
}
return true;
}
bool CDetectorSolution::SaveFileEx(const QString& strPath)
bool Solution::SaveFileEx(const QString& strPath)
{
QDir dir;
if (!dir.exists(strPath))
@ -258,35 +243,18 @@ bool CDetectorSolution::SaveFileEx(const QString& strPath)
}
dir.setPath(strPath);
//
// QJsonDocument document;
// QJsonObject jsonObject;
//
// jsonObject.insert("solution_name", m_tSolutionInfo.strName);
// jsonObject.insert("solution_type", m_tSolutionInfo.nType);
// jsonObject.insert("solution_description", m_tSolutionInfo.strDescription);
// jsonObject.insert("solution_id", m_nID);
//
// document.setObject(jsonObject);
// QByteArray byteArray = document.toJson();
// if (byteArray.isEmpty())
// return false;
//
// QString strFilePath = strPath + "/" + "info" + ".json";
// QFile file(strFilePath);
// if (file.open(QFile::WriteOnly | QFile::Text))
// {
// file.write(byteArray);
// file.flush();
// file.close();
// }
for (QMap<int, IDetectorTask*>::iterator iter = m_TaskMapByID.begin(); iter != m_TaskMapByID.end(); ++iter)
{
if (*iter)
{
for (QMap<int, IDetectorTask*>::iterator iter = m_TaskMapByID.begin(); iter != m_TaskMapByID.end(); ++iter) {
if (*iter) {
CDetectorTask *p = (CDetectorTask*)*iter;
QString strTaskFilePath = strPath + "/" + QString::number(p->GetID()) + "_" + p->GetTaskInfo()->strName + ".json";
QString taskPath = strPath + "/" + p->GetTaskInfo()->strName;
if (!dir.exists(taskPath)) {
dir.mkpath(taskPath);
}
QString strTaskFilePath = taskPath + "/" + /*QString::number(p->GetID()) + "_" + p->GetTaskInfo()->strName +*/ "taskinfo.json";
if (!p->SaveFile(strTaskFilePath))
{
qWarning("save task:%s fail", p->GetTaskInfo()->strName);
@ -322,70 +290,62 @@ bool CDetectorSolution::SaveFileEx(const QString& strPath)
return true;
}
/*
solutiontask
bool CDetectorSolution::LoadFileEx(const QString& strPath)
solution_1 ---------- info.json //
---------- Task1() -----taskinfo.json
-----image.jpg // 图像
-----param.ts //标定模板参数
---------- Task2() -----taskinfo.json
-----image.jpg // 图像
-----param.ts //标定模板参数
----------
*/
bool Solution::LoadFileEx(const QString& strPath)
{
QByteArray byteArray;
QDir dir(strPath);
if (!dir.exists()) {
return false;
}
QJsonDocument document;
QJsonParseError parse_error;
if (!dir.exists())
{
QString strInfoFile = strPath + "/info.json";
QFile infoFile(strInfoFile);
if (!infoFile.open(QFile::ReadOnly)) {
return false;
}
QByteArray infoByteArray = infoFile.readAll();
QJsonObject infoObj = QJsonDocument::fromJson(infoByteArray).object();
if (infoObj.isEmpty())
return false;
//解析solution基本信息
m_tSolutionInfo.strName = infoObj.value("solution_name").toString();
m_tSolutionInfo.nType = infoObj.value("solution_type").toInt(0);
m_tSolutionInfo.strDescription = infoObj.value("solution_description").toString();
m_nID = infoObj.value("solution_id").toInt();
QJsonArray childTask = infoObj.value("tasklist").toArray();
int nBaseID = 0;
bool bCheckInfo = false;
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList fileList = dir.entryInfoList();
for (int i = 0; i < fileList.size(); i++)
for (QJsonArray::iterator it = childTask.begin(); it != childTask.end(); ++it)
{
QString strFile = strPath + "/" + fileList.at(i).fileName();
QFile file(strFile);
if (fileList.at(i).fileName() == "." || fileList.at(i).fileName() == "..")
continue;
if (!file.open(QFile::ReadOnly))
{
continue;
}
byteArray = file.readAll();
if (byteArray.isEmpty())
{
QString taskName = it->toString();
if(taskName.isEmpty())
continue;
}
if (fileList.at(i).fileName() == "info.json")
{
document = QJsonDocument::fromJson(byteArray, &parse_error);
if (parse_error.error == QJsonParseError::NoError)
{
if (!document.isEmpty() && !document.isNull())
{
if (document.isObject())
{
QJsonObject solution = document.object();
m_tSolutionInfo.strName = solution.value("solution_name").toString();
m_tSolutionInfo.nType = solution.value("solution_type").toInt(0);
m_tSolutionInfo.strDescription = solution.value("solution_description").toString();
m_nID = solution.value("solution_id").toInt();
bCheckInfo = true;
}
}
}
if(m_tasklist.contains(taskName))
continue;
}
m_tasklist.append(taskName);
QString strTaskPath = strPath + "/" + taskName;
LP_DETECTOR_TASK Task;
CDetectorTask* pTask = (CDetectorTask*)AddTask(&Task,strFile);
Task.strName = taskName;
CDetectorTask* pTask = (CDetectorTask*)AddTask(&Task, strTaskPath);//有隐藏bug
if (!pTask)
{
qWarning("load task: %s fail", strFile);
qWarning("load task: %s fail", strTaskPath);
DeleteTask(pTask->GetID());
pTask = NULL;
continue;
@ -393,78 +353,75 @@ bool CDetectorSolution::LoadFileEx(const QString& strPath)
if (pTask)
nBaseID = pTask->GetID() > nBaseID ? pTask->GetID() : nBaseID;
file.close();
}
m_nBaseID = nBaseID;
return bCheckInfo;
}
bool CDetectorSolution::SaveFile(const QString& strPath)
{
QJsonDocument document;
QJsonObject jsonObject;
if (!SerializeToJson(jsonObject))
{
return false;
}
document.setObject(jsonObject);
QByteArray byteArray = document.toJson();
if (byteArray.isEmpty())
return false;
QFile file(strPath);
if (file.open(QFile::WriteOnly | QFile::Text))
{
file.write(byteArray);
file.flush();
file.close();
return true;
}
return false;
infoFile.close();
return true;
}
bool CDetectorSolution::LoadFile(const QString& strPath)
{
QJsonDocument document;
QJsonParseError parse_error;
QFile solutionFile(strPath);
if (!solutionFile.open(QFile::ReadOnly))
{
return false;
}
QByteArray byteArray;
byteArray = solutionFile.readAll();
if (byteArray.isEmpty())
return false;
document = QJsonDocument::fromJson(byteArray, &parse_error);
if (parse_error.error == QJsonParseError::NoError)
{
if (!document.isEmpty() && !document.isNull())
{
if (document.isObject())
{
QJsonObject solutionJsonObject = document.object();
if (!SerializeFromJson(&solutionJsonObject))
{
return false;
}
}
}
}
// bool Solution::SaveFile(const QString& strPath)
// {
// QJsonDocument document;
// QJsonObject jsonObject;
//
// if (!SerializeToJson(jsonObject)) {
// return false;
// }
//
// document.setObject(jsonObject);
// QByteArray byteArray = document.toJson();
// if (byteArray.isEmpty())
// return false;
//
// QFile file(strPath);
// if (file.open(QFile::WriteOnly | QFile::Text))
// {
// file.write(byteArray);
// file.flush();
// file.close();
// return true;
// }
//
// return false;
// }
return true;
}
// bool Solution::LoadFile(const QString& strPath)
// {
// QJsonDocument document;
// QJsonParseError parse_error;
//
// QFile solutionFile(strPath);
// if (!solutionFile.open(QFile::ReadOnly))
// {
// return false;
// }
//
// QByteArray byteArray;
// byteArray = solutionFile.readAll();
// if (byteArray.isEmpty())
// return false;
//
// document = QJsonDocument::fromJson(byteArray, &parse_error);
// if (parse_error.error == QJsonParseError::NoError)
// {
// if (!document.isEmpty() && !document.isNull())
// {
// if (document.isObject())
// {
// QJsonObject solutionJsonObject = document.object();
// if (!SerializeFromJson(&solutionJsonObject))
// {
// return false;
// }
// }
// }
// }
//
// return true;
// }
bool CDetectorSolution::SerializeToJson(QJsonObject& jsonObject)
bool Solution::SerializeToJson(QJsonObject& jsonObject)
{
jsonObject.insert("solution_name", m_tSolutionInfo.strName);
jsonObject.insert("solution_type", m_tSolutionInfo.nType);
@ -472,7 +429,6 @@ bool CDetectorSolution::SerializeToJson(QJsonObject& jsonObject)
jsonObject.insert("solution_id", m_nID);
QJsonArray TaskArray;
for (QMap<int, IDetectorTask*>::iterator iter = m_TaskMapByID.begin(); iter != m_TaskMapByID.end(); ++iter){
if (*iter)
{
@ -488,41 +444,48 @@ bool CDetectorSolution::SerializeToJson(QJsonObject& jsonObject)
if (TaskArray.size() > 0)
jsonObject.insert("taskArray", TaskArray);
return true;
}
bool CDetectorSolution::SerializeFromJson(QJsonObject* pJsonObject)
{
if (!pJsonObject)
return false;
m_tSolutionInfo.strName = pJsonObject->value("solution_name").toString();
m_tSolutionInfo.nType = pJsonObject->value("solution_type").toInt(0);
m_tSolutionInfo.strDescription = pJsonObject->value("solution_description").toString();
m_nID = pJsonObject->value("solution_id").toInt();
int nBaseID = 0;
QJsonArray TaskArray = pJsonObject->value("taskArray").toArray();
for (int i = 0; i < TaskArray.size(); i++)
QJsonArray tasklist;
foreach(QString var, m_tasklist)
{
LP_DETECTOR_TASK Task;
QJsonObject jsonObject = TaskArray[i].toObject();
CDetectorTask* pTask = (CDetectorTask*)AddTask(&Task);
if (!pTask->SerializeFromJson(&jsonObject))
return false;
nBaseID = pTask->GetID() > nBaseID ? pTask->GetID() : nBaseID;
tasklist.append(var);
}
jsonObject.insert("tasklist", tasklist);
m_nBaseID = nBaseID;
return true;
}
IDetectorSolution* CDetectorSolution::Copy()
// bool Solution::SerializeFromJson(QJsonObject* pJsonObject)
// {
// if (!pJsonObject)
// return false;
//
// m_tSolutionInfo.strName = pJsonObject->value("solution_name").toString();
// m_tSolutionInfo.nType = pJsonObject->value("solution_type").toInt(0);
// m_tSolutionInfo.strDescription = pJsonObject->value("solution_description").toString();
// m_nID = pJsonObject->value("solution_id").toInt();
//
// int nBaseID = 0;
// QJsonArray TaskArray = pJsonObject->value("taskArray").toArray();
// for (int i = 0; i < TaskArray.size(); i++)
// {
// LP_DETECTOR_TASK Task;
// QJsonObject jsonObject = TaskArray[i].toObject();
//
// CDetectorTask* pTask = (CDetectorTask*)AddTask(&Task);
// if (!pTask->SerializeFromJson(&jsonObject))
// return false;
//
// nBaseID = pTask->GetID() > nBaseID ? pTask->GetID() : nBaseID;
// }
//
// m_nBaseID = nBaseID;
// return true;
// }
IDetectorSolution* Solution::Copy()
{
QMutexLocker locker(&m_mutex);
CDetectorSolution* pNewSolution = new CDetectorSolution();
Solution* pNewSolution = new Solution();
pNewSolution->Initialize(m_pAlgoLibMgr);
pNewSolution->SetID(m_nID);
@ -546,27 +509,27 @@ IDetectorSolution* CDetectorSolution::Copy()
return pNewSolution;
}
void CDetectorSolution::SetRunState(bool bRun)
void Solution::SetRunState(bool bRun)
{
m_bIsRun = bRun;
}
bool CDetectorSolution::GetRunState()
bool Solution::GetRunState()
{
return m_bIsRun;
}
void CDetectorSolution::SetModifyFlag(bool bModify)
void Solution::SetModifyFlag(bool bModify)
{
m_bIsModify = bModify;
}
bool CDetectorSolution::GetModifyFlag()
bool Solution::GetModifyFlag()
{
return m_bIsModify;
}
IDetectorTask* CDetectorSolution::GetTaskByCameraID(int nCameraID)
IDetectorTask* Solution::GetTaskByCameraID(int nCameraID)
{
QMap<int, IDetectorTask*>::iterator iter = m_CurRunTaskMap.find(nCameraID);
if (iter != m_CurRunTaskMap.end())
@ -577,7 +540,7 @@ IDetectorTask* CDetectorSolution::GetTaskByCameraID(int nCameraID)
return nullptr;
}
bool CDetectorSolution::Copy(IDetectorSolution* pSrcSolution, bool bRet /* = true */)
bool Solution::Copy(IDetectorSolution* pSrcSolution, bool bRet /* = true */)
{
if (!pSrcSolution)
return false;
@ -588,34 +551,12 @@ bool CDetectorSolution::Copy(IDetectorSolution* pSrcSolution, bool bRet /* = tru
if (!SetSolutionInfo(pSrcSolution->GetSolutionInfo()))
return false;
// int nTaskCount = pSrcSolution->EnumTask(NULL, 0);
// if (nTaskCount > 0)
// {
// IDetectorTask** lppTask = new IDetectorTask*[nTaskCount];
// nTaskCount = pSrcSolution->EnumTask(lppTask, nTaskCount);
//
// for (int i = 0; i < nTaskCount; i++)
// {
// if (lppTask[i])
// {
// CDetectorTask* pNewTask = (CDetectorTask*)AddTask(lppTask[i]->GetTaskInfo());
// if (pNewTask && !pNewTask->Copy(lppTask[i]))
// {
// return false;
// }
// }
// }
//
// delete[] lppTask;
// }
m_nBaseID = pSrcSolution->GetTaskBaseID();
return true;
}
IDetectorTask* CDetectorSolution::AddAndCopyTask(IDetectorTask* pSrcTask, LP_DETECTOR_TASK tTaskInfo)
IDetectorTask* Solution::AddAndCopyTask(IDetectorTask* pSrcTask, LP_DETECTOR_TASK tTaskInfo)
{
if (!pSrcTask)
return NULL;
@ -634,43 +575,8 @@ IDetectorTask* CDetectorSolution::AddAndCopyTask(IDetectorTask* pSrcTask, LP_DET
return pNewTask;
}
bool CDetectorSolution::ExportData(QString strFileName, QString strStarTime, QString strEndTime)
{
return false;
}
bool CDetectorSolution::GenerateDataTable()
{
return false;
}
bool CDetectorSolution::InsertTaskOrder(int nID, int nIndex)
{
// if (nIndex < 0 || nIndex > m_vecTask.count() - 1)
// return false;
//
// IDetectorTask* pTask = NULL;
//
// for (QVector<IDetectorTask*>::iterator iter = m_vecTask.begin();
// iter != m_vecTask.end(); ++iter)
// {
// IDetectorTask* p = *iter;
//
// if (NULL != p && p->GetID() == nID)
// {
// pTask = p;
// iter = m_vecTask.erase(iter);
// break;
// }
// }
//
// if (pTask)
// m_vecTask.insert(nIndex, pTask);
return true;
}
void CDetectorSolution::LoadUserParamValue()
void Solution::LoadUserParamValue()
{
for (QMap<int, IDetectorTask*>::iterator iter = m_TaskMapByID.begin(); iter != m_TaskMapByID.end(); ++iter)
{
@ -682,7 +588,7 @@ void CDetectorSolution::LoadUserParamValue()
}
}
void CDetectorSolution::SaveUserParamValue()
void Solution::SaveUserParamValue()
{
for (QMap<int, IDetectorTask*>::iterator iter = m_TaskMapByID.begin(); iter != m_TaskMapByID.end(); ++iter)
{
@ -694,7 +600,7 @@ void CDetectorSolution::SaveUserParamValue()
}
}
void CDetectorSolution::ClearUserParamValue()
void Solution::ClearUserParamValue()
{
for (QMap<int, IDetectorTask*>::iterator iter = m_TaskMapByID.begin(); iter != m_TaskMapByID.end(); ++iter)
{
@ -706,12 +612,14 @@ void CDetectorSolution::ClearUserParamValue()
}
}
QStringList CDetectorSolution::GetAllTaskNames()
QStringList Solution::GetAllTaskNames()
{
return m_TaskMapByName.keys();
}
QMap<int, IDetectorTask*> CDetectorSolution::GetRunningTask()
QMap<int, IDetectorTask*> Solution::GetRunningTask()
{
return m_CurRunTaskMap;
}

@ -3,11 +3,11 @@
#include "lpbengine.h"
class CDetectorSolution : public IDetectorSolution
class Solution : public IDetectorSolution
{
public:
CDetectorSolution();
virtual ~CDetectorSolution();
Solution();
virtual ~Solution();
virtual bool SetSolutionInfo(const PLP_DETECTOR_SOLUTION pSolution);
virtual PLP_DETECTOR_SOLUTION GetSolutionInfo();
virtual IDetectorTask* AddTask(const PLP_DETECTOR_TASK pTask, bool bRet = true);
@ -18,7 +18,6 @@ public:
bool DeleteTask(QString strName);
virtual IDetectorTask* GetTask(int nTaskID);
IDetectorTask* GetTask(QString strName);
virtual int EnumTask(IDetectorTask** lppTask, int nCount);
virtual void Release();
virtual int GetID() const;
void SetID(int nID);
@ -30,16 +29,11 @@ public:
virtual void SetModifyFlag(bool bModify);
virtual IDetectorTask* GetTaskByCameraID(int nCameraID);
bool Initialize(/*IAlgorithmShare* pAlgoShare,*/ IAlgorithmLibMgr* pAlgoLibMgr);
bool Initialize(IAlgorithmLibMgr* pAlgoLibMgr);
void CleanUp();
virtual IDetectorSolution* Copy();
virtual bool Copy(IDetectorSolution* pSrcSolution, bool bRet = true);
virtual IDetectorTask* AddAndCopyTask(IDetectorTask* pSrcTask, LP_DETECTOR_TASK tTaskInfo);
virtual bool GenerateDataTable();
virtual bool ExportData(QString strFileName, QString strStarTime = "", QString strEndTime = "");
virtual bool InsertTaskOrder(int nID, int nIndex);
virtual void SaveUserParamValue();
virtual void LoadUserParamValue();
virtual void ClearUserParamValue();
@ -51,8 +45,8 @@ public:
virtual bool SaveFileEx(const QString& strPath);
virtual bool SaveFileEx(const QString& strPath, QStringList sTaskNames);
virtual bool LoadFileEx(const QString& strPath);
virtual bool SaveFile(const QString& strPath);
virtual bool LoadFile(const QString& strPath);
//virtual bool SaveFile(const QString& strPath);
// virtual bool LoadFile(const QString& strPath);
bool SerializeToJson(QJsonObject& jsonObject);
bool SerializeFromJson(QJsonObject* pJsonObject);
private:
@ -64,11 +58,10 @@ private:
QMap<QString, IDetectorTask*> m_TaskMapByName;
QMap<int, IDetectorTask*> m_TaskMapByID;
QMap<int, IDetectorTask*> m_CurRunTaskMap;//CamID(int),TaskPtr(IDetectorTask*)
// IAlgorithmShare* m_pAlgoShare;
IAlgorithmLibMgr* m_pAlgoLibMgr;
QMutex m_mutex;
QStringList m_tasklist;//task名列表
};
#endif // SOLUTION_H

@ -24,7 +24,7 @@ IDetectorSolution* CDetectorSolutionMgr::AddSolution(const PLP_DETECTOR_SOLUTION
if (NULL == pSolution)
return NULL;
CDetectorSolution* p = new CDetectorSolution();
Solution* p = new Solution();
if (p->Initialize(m_pAlgoLibMgr) && p->SetSolutionInfo(pSolution))
{
@ -37,7 +37,7 @@ IDetectorSolution* CDetectorSolutionMgr::AddSolution(const PLP_DETECTOR_SOLUTION
return NULL;
}
bool CDetectorSolutionMgr::DeleteSolution(int nSolutionID)
bool CDetectorSolutionMgr::DeleteSolutionByID(int nSolutionID)
{
if (m_nRunSolutionID == nSolutionID)
m_nRunSolutionID = LP_DETECTOR_INVALID_ID;
@ -51,8 +51,10 @@ bool CDetectorSolutionMgr::DeleteSolution(int nSolutionID)
return false;
}
IDetectorSolution* CDetectorSolutionMgr::GetSolution(int nSolutionID)
IDetectorSolution* CDetectorSolutionMgr::GetSolutionByID(int nSolutionID)
{
if (nSolutionID == 0)
return m_vecSolution.first();
QMap<int, IDetectorSolution *>::iterator it = m_vecSolution.find(nSolutionID);
if (it != m_vecSolution.end())
{
@ -62,6 +64,16 @@ IDetectorSolution* CDetectorSolutionMgr::GetSolution(int nSolutionID)
return NULL;
}
int CDetectorSolutionMgr::GetSolutionCount()
{
return m_vecSolution.size();
}
QMap<int, IDetectorSolution*> CDetectorSolutionMgr::GetAllSolutions()
{
return m_vecSolution;
}
bool CDetectorSolutionMgr::CheckSolution(int nSolutionID, QString strSolutionName)
{
for (QMap<int, IDetectorSolution *>::iterator iter = m_vecSolution.begin();
@ -78,25 +90,6 @@ bool CDetectorSolutionMgr::CheckSolution(int nSolutionID, QString strSolutionNam
return false;
}
int CDetectorSolutionMgr::EnumSolution(IDetectorSolution** lppSolution, int nCount)
{
if (!lppSolution || nCount < m_vecSolution.size())
return m_vecSolution.size();
int nIndex = 0;
for (QMap<int, IDetectorSolution *>::iterator iter = m_vecSolution.begin();
iter != m_vecSolution.end(); ++iter)
{
if (NULL != *iter)
{
lppSolution[nIndex] = *iter;
nIndex++;
}
}
return nIndex;
}
void CDetectorSolutionMgr::CleanUp()
{
for (QMap<int, IDetectorSolution *>::iterator iter = m_vecSolution.begin();
@ -121,7 +114,7 @@ bool CDetectorSolutionMgr::Save()
{
if (*iter)
{
CDetectorSolution* p = (CDetectorSolution*)*iter;
Solution* p = (Solution*)*iter;
if (p->GetSolutionInfo()->nType == SolutionType::LP_EXTRA)
continue;
@ -179,7 +172,7 @@ bool CDetectorSolutionMgr::SaveByNames(QStringList strNames)
{
if (*iter)
{
CDetectorSolution* p = (CDetectorSolution*)*iter;
Solution* p = (Solution*)*iter;
if (p->GetSolutionInfo()->nType == SolutionType::LP_EXTRA)
continue;
@ -225,7 +218,7 @@ bool CDetectorSolutionMgr::SaveByNames(QStringList strNames)
}
return true;
}
//加载配置文件
bool CDetectorSolutionMgr::Load()
{
QString strExePath = QCoreApplication::applicationDirPath();
@ -236,7 +229,7 @@ bool CDetectorSolutionMgr::Load()
solutionDir.mkdir(strSolutionDirPath);
}
m_nRunSolutionID = 1;
m_nRunSolutionID = 0;
solutionDir.setFilter(QDir::Dirs | QDir::Hidden | QDir::NoSymLinks);
solutionDir.setSorting(QDir::Size | QDir::Reversed);
@ -248,43 +241,26 @@ bool CDetectorSolutionMgr::Load()
if (dirList.at(i).fileName() == "." || dirList.at(i).fileName() == "..")
continue;
//加载解决方案文件夹
QString strSolutionFile = strSolutionDirPath + dirList.at(i).fileName();
LP_DETECTOR_SOLUTION solutionInfo;
CDetectorSolution* pSolution = (CDetectorSolution*)AddSolution(&solutionInfo);
if (!pSolution->LoadFileEx(strSolutionFile))
{
qErrnoWarning("load solution: %s fail", strSolutionFile.toLocal8Bit().data());
DeleteSolution(pSolution->GetID());
pSolution = NULL;
}
if (pSolution)
nBaseID = pSolution->GetID() > nBaseID ? pSolution->GetID() : nBaseID;
}
//兼容老版本的solution处理
solutionDir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
solutionDir.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList fileList = solutionDir.entryInfoList();
for (int i = 0; i < fileList.size(); i++)
{
if (fileList.at(i).fileName() == "." || fileList.at(i).fileName() == "..")
QString path = strSolutionFile + "/info.json";
QFileInfo finfo(path);
if(false == finfo.exists())
continue;
QString strSolutionFile = strSolutionDirPath + fileList.at(i).fileName();
LP_DETECTOR_SOLUTION solutionInfo;
CDetectorSolution* pSolution = (CDetectorSolution*)AddSolution(&solutionInfo);
if (!pSolution->LoadFile(strSolutionFile))
{
Solution* pSolution = (Solution*)AddSolution(&solutionInfo);
if (!pSolution->LoadFileEx(strSolutionFile))
{//有bug
qErrnoWarning("load solution: %s fail", strSolutionFile.toLocal8Bit().data());
DeleteSolution(pSolution->GetID());
DeleteSolutionByID(pSolution->GetID());//
pSolution = NULL;
}
if (pSolution)
nBaseID = pSolution->GetID() > nBaseID ? pSolution->GetID() : nBaseID;
}
m_nBaseID = nBaseID;
return true;
@ -308,14 +284,14 @@ bool CDetectorSolutionMgr::ReLoad()
bool CDetectorSolutionMgr::SetRunSolution(int nSolutionID)
{
m_nRunSolutionID = nSolutionID;
IDetectorSolution* pRunSolution = GetSolution(nSolutionID);
IDetectorSolution* pRunSolution = GetSolutionByID(nSolutionID);
return true;
}
IDetectorSolution* CDetectorSolutionMgr::GetRunSolution()
{
return GetSolution(m_nRunSolutionID);
return GetSolutionByID(m_nRunSolutionID);
}
IDetectorSolution* CDetectorSolutionMgr::AddAndCopySolution(IDetectorSolution* pSrcSolution)

@ -9,9 +9,11 @@ public:
CDetectorSolutionMgr();
virtual ~CDetectorSolutionMgr();
IDetectorSolution* AddSolution(const PLP_DETECTOR_SOLUTION pSolution, bool bRet = true);
bool DeleteSolution(int nSolutionID);
IDetectorSolution* GetSolution(int nSolutionID);
int EnumSolution(IDetectorSolution** lppSolution, int nCount);
bool DeleteSolutionByID(int nSolutionID);
IDetectorSolution* GetSolutionByID(int nSolutionID);
int GetSolutionCount();
QMap<int, IDetectorSolution*> GetAllSolutions();
void CleanUp();
bool Initialize(IAlgorithmLibMgr* pAlgoLibMgr);

@ -342,13 +342,13 @@ bool CDetectorTask::SerializeToJson(QJsonObject& jsonObject)
return true;
}
/*解析json数据*/
bool CDetectorTask::SerializeFromJson(QJsonObject* pJsonObject)
{
if (!pJsonObject)
return false;
m_tTask.strName = pJsonObject->value("task_name").toString();
//m_tTask.strName = pJsonObject->value("task_name").toString();
m_tTask.nCameraID = pJsonObject->value("task_cameraID").toInt();
m_tTask.strDescription = pJsonObject->value("task_description").toString();
m_tTask.strDirPath = pJsonObject->value("task_default_dir").toString();
@ -356,24 +356,21 @@ bool CDetectorTask::SerializeFromJson(QJsonObject* pJsonObject)
m_tTask.bIsRun = pJsonObject->value("task_run").toBool(true);
m_nID = pJsonObject->value("task_id").toInt();
m_nRunAlgoID = pJsonObject->value("task_algo_run_id").toInt();
{
//加载默认图片
QString strExePath = QCoreApplication::applicationDirPath();
QString strImagePath = strExePath + LP_DETECTOR_BUSSINESS_IMAGE_DIR;
QString strImageName = strImagePath + QString::number(m_pSolution->GetID()) + "_" + QString::number(m_nID) + ".bmp";
std::string strpath = strImageName.toLocal8Bit().toStdString();
m_tTask.templateImg = cv::imread(strpath/*strImageName.toLatin1().data()*/, CV_LOAD_IMAGE_UNCHANGED);
_strPath = strpath;
strtempImgPath = strImageName;
}
//加载模板标定图片
//QString strExePath = QCoreApplication::applicationDirPath();
QString strImagePath = m_taskPath;// strExePath + LP_DETECTOR_BUSSINESS_IMAGE_DIR;
QString strImageName = strImagePath + "/template.png";// QString::number(m_pSolution->GetID()) + "_" + QString::number(m_nID) + ".bmp";
std::string strpath = strImageName.toLocal8Bit().toStdString();
m_tTask.templateImg = cv::imread(strpath, CV_LOAD_IMAGE_UNCHANGED);
_strPath = strpath;
strtempImgPath = strImageName;
//加载扩展参数
if (!SerializePropertyFromJson(pJsonObject))
return false;
//加载算法参数
QJsonArray algoArray = pJsonObject->value("algoArray").toArray();
for (int i = 0; i < algoArray.size(); i++)
{
@ -414,8 +411,8 @@ bool CDetectorTask::SaveFile(const QString& strPath)
if (m_pSolution && !m_tTask.templateImg.empty())
{
QString strExePath = QCoreApplication::applicationDirPath();
QString strFilePath = strExePath + LP_DETECTOR_BUSSINESS_IMAGE_DIR;
//QString strExePath = m_taskPath;// QCoreApplication::applicationDirPath();
QString strFilePath = m_taskPath;// strExePath + LP_DETECTOR_BUSSINESS_IMAGE_DIR;
QDir dir;
if (!dir.exists(strFilePath))
{
@ -423,7 +420,7 @@ bool CDetectorTask::SaveFile(const QString& strPath)
return false;
}
QString strFileName = strFilePath + QString::number(m_pSolution->GetID()) + "_" + QString::number(m_nID) + ".bmp";
QString strFileName = strFilePath + /*QString::number(m_pSolution->GetID()) + "_" + QString::number(m_nID)*/ + "template.png";
std::string strpath = strFileName.toLocal8Bit().toStdString();
if (!cv::imwrite(strpath/*strFileName.toLatin1().data()*/, m_tTask.templateImg))
@ -451,11 +448,12 @@ bool CDetectorTask::SaveFile(const QString& strPath)
bool CDetectorTask::LoadFile(const QString& strPath)
{
strParamFilePath = strPath;
m_taskPath = strPath;
strParamFilePath = strPath +"/taskinfo.json";
QJsonDocument document;
QJsonParseError parse_error;
QFile taskFile(strPath);
QFile taskFile(strParamFilePath);
if (!taskFile.open(QFile::ReadOnly))
{
return false;
@ -470,15 +468,11 @@ bool CDetectorTask::LoadFile(const QString& strPath)
}
document = QJsonDocument::fromJson(byteArray, &parse_error);
if (parse_error.error == QJsonParseError::NoError)
{
if (!document.isEmpty() && !document.isNull())
{
if (document.isObject())
{
if (parse_error.error == QJsonParseError::NoError) {
if (!document.isEmpty() && !document.isNull()) {
if (document.isObject()) {
QJsonObject taskJsonObject = document.object();
if (!SerializeFromJson(&taskJsonObject))
{
if (!SerializeFromJson(&taskJsonObject)) {
taskFile.close();
return false;
}
@ -560,8 +554,6 @@ void CDetectorTask::CleanUp()
if (!m_tTask.templateImg.empty())
{
m_tTask.templateImg.release();
//cvReleaseImage(&m_tTask.pImg);
//m_tTask.pImg = NULL;
}
for (QVector<IDetectorROI*>::iterator iter = m_vecROI.begin();

@ -68,6 +68,8 @@ public:
virtual double ExecTime() const { return m_dExecTime; }
virtual bool SyncMapResult(const QVariantMap& vMap);
virtual QString GetPath() { return m_taskPath; }
protected:
int GetProductCount();
@ -81,7 +83,6 @@ private:
QVector<IDetectorAlgorithm*> m_vecAlgorithm;
IDetectorSolution* m_pSolution;
//IAlgorithmShare* m_pAlgoShare;
IAlgorithmLibMgr* m_pAlgoLibMgr;
bool m_bRunning;
@ -91,6 +92,7 @@ private:
QString strtempImgPath;
QString strParamFilePath;
QStringList strPathList;
QString m_taskPath;
};
#endif // RTask_H

@ -0,0 +1,79 @@
#include "algEg.h"
#include "caliCenter.h"
#include "qtcvutils.h"
using namespace luffy_base;
algEg::algEg()
{
}
algEg::~algEg()
{
}
bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
{
qDebug() << "start cali center";
//<! detect
CaliCenter m_objDetect;
InputParam paramInput;
OutputParam paramOutput;
paramInput.roi = lpAlgorithm->GetParamValue("ROI", LP_ROI).value<LP_DETECTOR_ROI_DATA>();
int nID = lpTask->GetTaskInfo()->nCameraID;
Mat gray;
if (!lpTask->GetTaskInfo()->detectImg.empty()) {
luffy_imageProc::createImage(lpTask->GetTaskInfo()->detectImg, gray, luffy_imageProc::emCreateGray);
}
if (gray.empty()) {
qWarning() << "cali center, gray is empty";
return false;
}
if (gray.size() != paramInput.roi.img.size())
{
qWarning() << "img size not compare";
return false;
}
Mat mask;
luffy_imageProc::createImage(gray, mask, luffy_imageProc::emCreateColor);
m_objDetect.detect(gray, paramInput, paramOutput, mask);
QPointF pt(paramOutput.ptCenter.x, paramOutput.ptCenter.y);
lpAlgorithm->SetOutParamValue("center", pt);
lpAlgorithm->SetOutParamValue("image", EngineBase::convMat2QImage(mask));
QVariant getCenterRoi;
getCenterRoi.setValue(paramOutput.centerRoi);
lpAlgorithm->SetOutParamValue("centerRoi", getCenterRoi);
qDebug() << "finish cali center";
return true;
}
bool algEg::Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
{
LP_ALGORITHM_PARAM param1("ROI", LP_ROI, QVariant(), QObject::tr("圆心模板"));
lpAlgorithm->AddParam(&param1, 1);
LP_ALGORITHM_PARAM param2("center", LP_POINTF);
lpAlgorithm->AddOutParam(&param2, 1);
LP_ALGORITHM_PARAM param3("image", LP_IMAGE);
lpAlgorithm->AddOutParam(&param3, 1);
LP_ALGORITHM_PARAM param4("centerRoi", LP_MAT);
lpAlgorithm->AddOutParam(&param4, 1);
return true;
}
void LpAlgoNewInstance(IAlgo** lppAlgo)
{
*lppAlgo = (IAlgo*)new algEg();
}
bool LpAlgoDeleteInstance()
{
return true;
}

@ -0,0 +1,23 @@
#ifndef _ALG_EG_H_
#define _ALG_EG_H_
#include ".\lpbengine.h"
#include ".\lpalgorithm.h"
class algEg : IAlgo
{
public:
algEg();
~algEg();
virtual bool Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm);
virtual bool Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm);
private:
};
#endif // _ALG_EG_H_

@ -0,0 +1,12 @@
#ifndef _ALG_EG_GLOBAL_H_
#define _ALG_EG_GLOBAL_H_
#include <QtCore/qglobal.h>
#ifdef ALG_EG_LIB
# define ALG_EG_EXPORT Q_DECL_EXPORT
#else
# define ALG_EG_EXPORT Q_DECL_IMPORT
#endif
#endif // _ALG_EG_GLOBAL_H_

@ -0,0 +1,70 @@
#include "caliCenter.h"
#include "lpbengine.h"
using namespace luffy_base;
CaliCenter::CaliCenter()
{
}
CaliCenter::~CaliCenter()
{
}
cv::Mat createCenterRoi(Mat &src, const Point2f &center, const float & radius)
{
Mat srcImg = src.clone();
//Mat centerMask(srcImg.size(), src.type(), Scalar::all(0));
if ((center.x - radius) < 0 || (center.y - radius) < 0 || (center.x - radius + 2 * radius) > srcImg.cols || (center.y - radius + 2 * radius) > srcImg.rows)
return Mat();
return srcImg(Rect(center.x - radius, center.y - radius, 2*radius, 2*radius));
}
bool CaliCenter::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst /*= Mat()*/)
{
Record_List records = paramIn.roi.records;
int nCircleCount = records.size();
if (nCircleCount == 0) {
qWarning() << "no circle count";
return false;
}
if (nCircleCount >= 2) {
qWarning() << "circle count is more than 1";
}
luffy_base::luffyCircle realCircle;
for (int i = 0; i < nCircleCount; i++)
{
Item_List item = records.at(i);
Feature_List feature = item.at(0);
if (1 == feature.first) {
realCircle.ptCenter = Point2f(feature.second.at(0), feature.second.at(1));
realCircle.fRadius = feature.second.at(2);
break;
}
}
//bob add abs fRadius会出现负数
realCircle.fRadius = abs(realCircle.fRadius);
Mat centerRoi = createCenterRoi(imgSrc, realCircle.ptCenter, realCircle.fRadius);
paramOut.centerRoi = centerRoi;
/*Mat imgBinary;
cv::threshold(imgSrc, imgBinary, paramIn.nGray, 255.0, THRESH_BINARY);
Mat imgHit;
vector<Point> vecHits;
luffy_hit::firstHit4Circle(imgBinary, imgHit, vecHits, realCircle.ptCenter, 10, realCircle.fRadius + 100, 60, luffy_hit::emHitIn2Out);
vector<Point> vecRes = luffy_imageProc::fitModelbyRansac(vecHits, luffy_imageProc::emModelCircle, 0.4, 3, 20, 20, 30);
luffy_imageProc::lsCircleFit(vecRes, realCircle.fRadius, realCircle.ptCenter);*/
paramOut.ptCenter = realCircle.ptCenter;
if (!imgDst.empty()) {
cv::circle(imgDst, realCircle.ptCenter, realCircle.fRadius, LP_COLOR_RED, 2);
cv::circle(imgDst, realCircle.ptCenter, 5, LP_COLOR_BLUE, -1);
}
return true;
}

@ -0,0 +1,29 @@
#ifndef LP_VALVE_DETECTOR_H
#define LP_VALVE_DETECTOR_H
#include "Luffy.h"
#include "lpbengine.h"
using namespace luffy_base;
struct InputParam
{
LP_DETECTOR_ROI_DATA roi;
};
struct OutputParam
{
Point2f ptCenter;
Mat centerRoi;
};
class CaliCenter
{
public:
CaliCenter();
~CaliCenter();
bool detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst = Mat());
};
#endif //LP_VALVE_DETECTOR_H

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="algEg.cpp" />
<ClCompile Include="caliCenter.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="algEg.h" />
<ClInclude Include="algEg_global.h" />
<ClInclude Include="caliCenter.h" />
</ItemGroup>
<ItemGroup>
<None Include="calicenter_en.ts" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{C87504ED-3FD2-4539-AD1F-CF56BDE735FE}</ProjectGuid>
<Keyword>Qt4VSv1.0</Keyword>
<ProjectName>caliCenter</ProjectName>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>12.0.30501.0</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<TargetName>$(ProjectName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PreprocessorDefinitions>_UNICODE;_UNICODE;_UNICODE;ALGO_LIB;QT_CORE_LIB;QT_GUI_LIB;UNICODE;WIN32;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtGui;.\..\..\3part\tadpole\include\tpBase;.\..\..\3part\opencv3.4.1\include;.\..\..\3part\opencv3.4.1\include\opencv;.\..\..\3part\opencv3.4.1\include\opencv2;.\..\..\..\Cyclops\include;.\..\..\3part\Cyclops\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<OutputFile>$(SolutionDir)..\runner17\algorithmLib\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(OutDir);..\..\3part\opencv3.4.1\x64\vc15\lib;..\..\3part\Cyclops\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Widgetsd.lib;Qt5Guid.lib;luffyd.lib;cyclopsd.lib;opencv_world341d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalOptions> /SUBSYSTEM:WINDOWS </AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>_UNICODE;_UNICODE;_UNICODE;ALGO2_LIB;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_NO_DEBUG;UNICODE;WIN32;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtGui;.\..\..\3part\tadpole\include\tpBase;.\..\..\3part\opencv3.4.1\include;.\..\..\3part\opencv3.4.1\include\opencv;.\..\..\3part\opencv3.4.1\include\opencv2;.\..\..\..\Cyclops\include;.\..\..\3part\Cyclops\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat>
</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<OutputFile>$(SolutionDir)..\runner17\algorithmLib\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(OutDir);..\..\3part\opencv3.4.1\x64\vc15\lib;..\..\3part\Cyclops\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>false</GenerateDebugInformation>
<AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Widgets.lib;Qt5Gui.lib;luffy.lib;cyclops.lib;opencv_world341.lib;%(AdditionalDependencies)</AdditionalDependencies>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalOptions> /SUBSYSTEM:WINDOWS </AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties MocDir=".\GeneratedFiles\$(ConfigurationName)" UicDir=".\GeneratedFiles" RccDir=".\GeneratedFiles" lupdateOptions="" lupdateOnBuild="0" lreleaseOptions="" Qt5Version_x0020_Win32="qt5.4.2-msvc" Qt5Version_x0020_x64="qt5.9.4-msvc2017-x64" MocOptions="" />
</VisualStudio>
</ProjectExtensions>
</Project>

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;cxx;c;def</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h</Extensions>
</Filter>
<Filter Include="Form Files">
<UniqueIdentifier>{99349809-55BA-4b9d-BF79-8FDBB0286EB3}</UniqueIdentifier>
<Extensions>ui</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}</UniqueIdentifier>
<Extensions>qrc;*</Extensions>
<ParseFiles>false</ParseFiles>
</Filter>
<Filter Include="Generated Files">
<UniqueIdentifier>{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}</UniqueIdentifier>
<Extensions>moc;h;cpp</Extensions>
<SourceControlFiles>False</SourceControlFiles>
</Filter>
<Filter Include="Translation Files">
<UniqueIdentifier>{639EADAA-A684-42e4-A9AD-28FC9BCB8F7C}</UniqueIdentifier>
<Extensions>ts</Extensions>
<ParseFiles>false</ParseFiles>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="algEg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="caliCenter.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="algEg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="algEg_global.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="caliCenter.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="calicenter_en.ts">
<Filter>Translation Files</Filter>
</None>
</ItemGroup>
</Project>

@ -0,0 +1,190 @@
#include "algEg.h"
#include "CaliValve.h"
#include "qtcvutils.h"
using namespace luffy_base;
#pragma execution_character_set("utf-8")
algEg::algEg()
{
luffy_triangle::createNewTrigValue(360);
}
algEg::~algEg()
{
}
bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
{
qDebug() << "start cali valve";
//<! detect
CaliValve m_objDetect;
InputParam paramInput;
OutputParam paramOutput;
int nID = lpTask->GetTaskInfo()->nCameraID;
QString strObj = lpTask->GetTaskInfo()->strName;
if (strObj.isEmpty()) {
qWarning() << "cali valve, obj is empty";
return false;
}
paramInput.roi = lpAlgorithm->GetParamValue("ROI", LP_ROI).value<LP_DETECTOR_ROI_DATA>();
paramInput.barROI = lpAlgorithm->GetParamValue("barROI", LP_ROI).value<LP_DETECTOR_ROI_DATA>();
paramInput.barNum = lpAlgorithm->GetParamValue("barNum", LP_INT).toInt();
paramInput.flagCircle = lpAlgorithm->GetParamValue("flagCircle", LP_INT).toInt();
paramInput.backgroundThresh = lpAlgorithm->GetParamValue("backgroundThresh", LP_INT).toInt();
paramInput.ifClasify = lpAlgorithm->GetParamValue("ifClasify", LP_INT).toInt();
paramInput.ibackground = lpAlgorithm->GetParamValue("ibackground", LP_INT).toInt();
QPointF pt = lpAlgorithm->GetParamValue("center", LP_POINTF).toPointF();
paramInput.ptCenter = Point2f(pt.x(), pt.y());
if (pt.x()==0 || pt.y() == 0) {
qWarning() << "cali valve, center is zero";
}
Mat mask;Mat gray;
if (!lpTask->GetTaskInfo()->detectImg.empty()) {
luffy_imageProc::createImage(lpTask->GetTaskInfo()->detectImg, gray, luffy_imageProc::emCreateGray);
}
// else {
// luffy_imageProc::createImage(paramInput.roi.img, gray, luffy_imageProc::emCreateGray);
// }
if (gray.empty()) {
qWarning() << "cali valve, gray is empty";
return false;
}
if (gray.size() != paramInput.roi.img.size())
{
qWarning() << "img size not compare";
return false;
}
//if (paramInput.ifClasify == 1)
if (paramInput.ibackground == 1)
{
QString str = qApp->applicationDirPath() + QString("\\backGround\\%1.BMP").arg(nID);//imread("E:\\1.BMP");
if (str.isEmpty())
{
qDebug() << "cali valve : cannot background dir ";
return false;
}
else
{
std::string starName = str.toLocal8Bit().toStdString();
paramOutput.background = imread(starName,0);
}
if (paramOutput.background.empty())
{
qDebug() << "cali valve : background image is empty";
//return false;
}
}
luffy_imageProc::createImage(gray, mask, luffy_imageProc::emCreateColor);
m_objDetect.detect(gray, paramInput, paramOutput, mask);
QVariant img, barImg, baseImg, weightMat, backgroundImage;
img.setValue(paramOutput.imgTemplate);
barImg.setValue(paramOutput.barTemplate);
baseImg.setValue(paramOutput.baseImage);
weightMat.setValue(paramOutput.weightMat);
backgroundImage.setValue(paramOutput.background);
lpAlgorithm->SetOutParamValue("valveTemplate", img);
lpAlgorithm->SetOutParamValue("image", lp::QtCVUtils::cvMatToQImage(mask));
lpAlgorithm->SetOutParamValue("center", pt);
lpAlgorithm->SetOutParamValue("valveDis", paramOutput.fValveDis);
lpAlgorithm->SetOutParamValue("valveWidth", paramOutput.fValveWidth);
lpAlgorithm->SetOutParamValue("valveOffset", paramOutput.nValveOffset);
lpAlgorithm->SetOutParamValue("barTemplate", barImg);
lpAlgorithm->SetOutParamValue("withinOffset", paramOutput.withinOffset);
lpAlgorithm->SetOutParamValue("barNum", paramInput.barNum);
lpAlgorithm->SetOutParamValue("flagCircle", paramInput.flagCircle);
lpAlgorithm->SetOutParamValue("baseImage", baseImg);
lpAlgorithm->SetOutParamValue("weightMat", weightMat);
lpAlgorithm->SetOutParamValue("backgroundThresh", paramInput.backgroundThresh);
lpAlgorithm->SetOutParamValue("background", backgroundImage);
qDebug() << "finish cali valve";
return true;
}
bool algEg::Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
{
LP_ALGORITHM_PARAM param1("center", LP_POINTF, QVariant(), QObject::tr("轮毂中心坐标,绑定圆心定位"));
lpAlgorithm->AddParam(&param1, 1);
LP_ALGORITHM_PARAM param2("ROI", LP_ROI, QVariant(), QObject::tr("气门芯模板"));
lpAlgorithm->AddParam(&param2, 1);
LP_ALGORITHM_PARAM param3("barROI", LP_ROI, QVariant(), QObject::tr("辐条模板"));
lpAlgorithm->AddParam(&param3, 1);
LP_ALGORITHM_PARAM param4("flagCircle", LP_INT, 0, QObject::tr("无气门芯识别"));
lpAlgorithm->AddParam(&param4, 1);
LP_ALGORITHM_PARAM param5("backgroundThresh", LP_INT, 15, QObject::tr("背景剪除阈值"));
lpAlgorithm->AddParam(&param5, 1);
LP_ALGORITHM_PARAM param6("ifClasify", LP_INT, 0, QObject::tr("型号判定0关闭1打开"));
lpAlgorithm->AddParam(&param6, 1);
LP_ALGORITHM_PARAM param61("ibackground", LP_INT, 0, QObject::tr("背景图启用0关闭1打开"));
lpAlgorithm->AddParam(&param61, 1);
LP_ALGORITHM_PARAM param7("barNum", LP_INT, 0, QObject::tr("辐条数量"));
lpAlgorithm->AddParam(&param7, 1);
LP_ALGORITHM_PARAM param8("center", LP_POINTF);
lpAlgorithm->AddOutParam(&param8, 1);
LP_ALGORITHM_PARAM param9("image", LP_IMAGE);
lpAlgorithm->AddOutParam(&param9, 1);
LP_ALGORITHM_PARAM param10("valveDis", LP_DOUBLE);
lpAlgorithm->AddOutParam(&param10, 1);
LP_ALGORITHM_PARAM param11("valveWidth", LP_DOUBLE);
lpAlgorithm->AddOutParam(&param11, 1);
LP_ALGORITHM_PARAM param12("valveOffset", LP_INT);
lpAlgorithm->AddOutParam(&param12, 1);
LP_ALGORITHM_PARAM param13("valveTemplate", LP_MAT);
lpAlgorithm->AddOutParam(&param13, 1);
LP_ALGORITHM_PARAM param14("barTemplate", LP_MAT);
lpAlgorithm->AddOutParam(&param14, 1);
LP_ALGORITHM_PARAM param15("withinOffset", LP_INT);
lpAlgorithm->AddOutParam(&param15, 1);
LP_ALGORITHM_PARAM param16("barNum", LP_INT);
lpAlgorithm->AddOutParam(&param16, 1);
LP_ALGORITHM_PARAM param17("flagCircle", LP_INT);
lpAlgorithm->AddOutParam(&param17, 1);
LP_ALGORITHM_PARAM param18("baseImage", LP_MAT);
lpAlgorithm->AddOutParam(&param18, 1);
LP_ALGORITHM_PARAM param19("weightMat", LP_MAT);
lpAlgorithm->AddOutParam(&param19, 1);
LP_ALGORITHM_PARAM param20("backgroundThresh", LP_INT);
lpAlgorithm->AddOutParam(&param20, 1);
LP_ALGORITHM_PARAM param21("background", LP_MAT);
lpAlgorithm->AddOutParam(&param21, 1);
return true;
}
void LpAlgoNewInstance(IAlgo** lppAlgo)
{
*lppAlgo = (IAlgo*)new algEg();
}
bool LpAlgoDeleteInstance()
{
return true;
}

@ -0,0 +1,23 @@
#ifndef _ALG_EG_H_
#define _ALG_EG_H_
#include ".\lpbengine.h"
#include ".\lpalgorithm.h"
class algEg : IAlgo
{
public:
algEg();
virtual ~algEg();
virtual bool Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm);
virtual bool Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm);
private:
};
#endif // _ALG_EG_H_

@ -0,0 +1,12 @@
#ifndef _ALG_EG_GLOBAL_H_
#define _ALG_EG_GLOBAL_H_
#include <QtCore/qglobal.h>
#ifdef ALG_EG_LIB
# define ALG_EG_EXPORT Q_DECL_EXPORT
#else
# define ALG_EG_EXPORT Q_DECL_IMPORT
#endif
#endif // _ALG_EG_GLOBAL_H_

@ -0,0 +1,502 @@
#include "CaliValve.h"
#define VIEW_INTERNAL_MAT
using namespace luffy_base;
CaliValve::CaliValve()
{
}
CaliValve::~CaliValve()
{
}
double disOfPoint(const Point2f& p1, const Point2f& p2)
{
return norm(p1 - p2);
}
void CaliValve::preProcessImage(Mat& img, const Mat& mask, double dstMean, double dstStddev, int highlightsThreshold)
{
if (img.type() != CV_32FC1)
{
img.convertTo(img, CV_32FC1);
}
Mat gaussImg;
GaussianBlur(img, gaussImg, Size(3, 3), 5.0);
img = gaussImg;
Mat dilatedMask;
dilate(mask, dilatedMask, Mat::ones(Size(3, 3), CV_32FC1));
Mat hightlightsMask = img < highlightsThreshold;
Mat imgMask = hightlightsMask & (mask > 0);
Scalar meanScalar, stddevScalar;
meanStdDev(img, meanScalar, stddevScalar, imgMask);
img = (img - meanScalar.val[0]) * dstStddev / stddevScalar.val[0] + dstMean;
imgMask.convertTo(imgMask, CV_32FC1);
imgMask /= 255.0;
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0),
imgMask, 125);
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat vImgNorm = imgNorm / 255.0;
#endif
img = imgNorm;
}
cv::Mat CaliValve::genMask(const Mat& img, Point2f center, float innerR /*= -1*/, float outterR /*= -1*/, int type /*= CV_32FC1*/)
{
Mat mask(img.size(), CV_8UC1);
mask.setTo(0);
if (innerR == -1)
{
// default is 30
innerR = img.rows*0.178;
}
if (outterR == -1)
{
// default is max radius - 10
outterR = img.rows*0.425;
}
circle(mask, center, outterR, Scalar(255), -1);
circle(mask, center, innerR, Scalar(0), -1);
if (type != CV_8UC1)
{
mask.convertTo(mask, type);
mask /= 255;
}
return mask;
}
cv::Mat CaliValve::cocentricNorm(Mat& img, Point2f center, const Mat& weightMat, float dstMeanVal)
{
assert(weightMat.empty() || weightMat.type() == CV_32FC1);
int w = img.cols;
int h = img.rows;
vector<Point2f> corners;
corners.push_back(Point2f(0, 0));
corners.push_back(Point2f(0, h));
corners.push_back(Point2f(w, h));
corners.push_back(Point2f(w, 0));
vector<double> cornerDisVec;
for_each(corners.begin(), corners.end(), [&](const Point2f& pt)
{
double dis = disOfPoint(center, pt);
cornerDisVec.push_back(dis);
});
auto farthestCornerDis = max_element(cornerDisVec.begin(), cornerDisVec.end());
float maxRadius = *farthestCornerDis;
int radiusNum = floorf(maxRadius);
//radiusNum = 20;
float radiusStep = (maxRadius / radiusNum);
Mat cocentricSumMat = Mat::zeros(1, radiusNum, CV_32FC1);
float* pSumData = (float*)cocentricSumMat.data;
Mat cocentricWeightSumMat = Mat::zeros(1, radiusNum, CV_32FC1);
float* pWeightSumData = (float*)cocentricWeightSumMat.data;
Mat radiusMat(img.rows, img.cols, CV_32FC1);
for (int y = 0; y < h; y++)
{
const Mat& imgRow = img.row(y);
float* pImgRowData = (float*)imgRow.data;
float* pRadiusRowData = (float*)radiusMat.row(y).data;
float* pWeightRowData = NULL;
if (!weightMat.empty())
{
pWeightRowData = (float*)weightMat.row(y).data;
}
for (int x = 0; x < w; x++)
{
//std::cout << x << " " << y << std::endl;
float weight;
if (pWeightRowData)
{
weight = pWeightRowData[x];
}
else
{
weight = 1.0;
}
float val = pImgRowData[x] * weight;
float radius = disOfPoint(Point2f(x, y), center);
pRadiusRowData[x] = radius;
int radiusIdx0 = (int)(radius / radiusStep);
assert(radiusIdx0 >= 0);
int radiusIdx1 = radiusIdx0 + 1;
if (radiusIdx0 >= radiusNum - 1)
{
pSumData[radiusNum - 1] += val;
pWeightSumData[radiusNum - 1] += weight;
}
else
{
float s = (radius - radiusStep*radiusIdx0) / radiusStep;
pSumData[radiusIdx0] += val*s;
pSumData[radiusIdx1] += val*(1 - s);
pWeightSumData[radiusIdx0] += s*weight;
pWeightSumData[radiusIdx1] += (1 - s)*weight;
}
}
// CvPlot::plot<float>("sum", pSumData, radiusNum);
// CvPlot::plot<float>("count", pCountData, radiusNum);
// waitKey();
}
for (int i = 0; i < radiusNum; ++i)
{
//float radius = (i*radiusStep + radiusStep) / 2;
if (pWeightSumData[i] == 0)
{
}
else
{
pSumData[i] /= pWeightSumData[i];
}
}
Mat retMat = Mat::zeros(img.rows, img.cols, img.type());
for (int y = 0; y < h; y++)
{
float* pImgRowData = (float*)img.row(y).data;
float* pRetRowData = (float*)retMat.row(y).data;
float* pRadiusData = (float*)radiusMat.row(y).data;
for (int x = 0; x < w; x++)
{
float val = pImgRowData[x];
float radius = pRadiusData[x];
float mean = interpolate(pSumData, radiusNum, radiusStep, radius);
if (mean == 0)
{
continue;
}
float newVal = (float)val * dstMeanVal / mean;
pRetRowData[x] = newVal;
}
}
return retMat;
}
float CaliValve::interpolate(float* pY, int n, float stepX, float x)
{
int lIdx = (int)(x / stepX);
int rIdx = lIdx + 1;
if (rIdx > n - 1)
{
return pY[n - 1];
}
assert(lIdx >= 0 && lIdx < n && rIdx >= 0 && rIdx < n);
float s = (x - lIdx*stepX) / stepX;
float ly = pY[lIdx];
float ry = pY[rIdx];
return ly + (ry - ly)*s;
}
Mat CaliValve::extractForegroundWheel(const Mat &background, const Mat &src)
{
Mat resizedGroundImage = background.clone();
if (resizedGroundImage.size() != src.size())
{
resize(background, resizedGroundImage, src.size());
}
return (src - resizedGroundImage);
}
Mat CaliValve::findWheelObject(Mat src, Mat backGroundImg, int thresh)
{
if (src.empty() || backGroundImg.empty() || src.cols < 500)
{
return Mat();
}
assert(backGroundImg.type() == CV_8UC1);
const cv::Size size = cv::Size(416, floor(416.0 / src.cols * src.rows));
Mat resizedImage;
resizedImage.setTo(0);
resize(src, resizedImage, size);
Mat foregroundImg = extractForegroundWheel(backGroundImg, resizedImage);
using namespace luffy_base;
Mat imgBinary;
imgBinary.setTo(0);
luffy_threshold::Threshold(foregroundImg, imgBinary, thresh);//0421
//luffy_threshold::Threshold(imgTmp, imgBinary, nThres);
Mat dilatedImgBin;
dilate(imgBinary, dilatedImgBin, Mat::ones(7, 7, CV_32FC1));
erode(dilatedImgBin, imgBinary, Mat::ones(7, 7, CV_32FC1));
//openOper(imgBinary, Mat::ones(1, 13, CV_32FC1));
vector<vector<Point>> conts;
cv::findContours(imgBinary, conts, RETR_EXTERNAL, CHAIN_APPROX_NONE);
imgBinary.setTo(0);
for (int i = 0; i < conts.size(); i++) {
const vector<Point> &pt = conts.at(i);
if (pt.size() < 20) {
continue;
}
Rect rt = boundingRect(pt);
if (rt.width < 5 || rt.height < 5) {
continue;
}
drawContours(imgBinary, conts, i, Scalar::all(255), -1);
}
Mat hit; vector<Point> pts;
luffy_hit::firstHit4Circle(imgBinary, hit, pts, Point(size.width / 2, size.height / 2), 0, size.width / 2, 360, luffy_hit::emHitOut2In);
//luffy_imageProc::RansacParam rs(0.02, 2.5, 70, 100, 220);
luffy_imageProc::RansacParam rs(0.01, 3, 150, 100, 240);//0421
vector<Point> pts2 = luffy_imageProc::fitModelbyRansac(pts, luffy_imageProc::emModelCircle, &rs);
#ifdef _DEBUG
Mat imgColor;
cv::cvtColor(resizedImage, imgColor, CV_GRAY2BGR);
for (int i = 0; i < pts.size(); i++) {
imgColor.at<cv::Vec3b>(pts.at(i))[0] = 255;//B
imgColor.at< cv::Vec3b >(pts.at(i))[1] = 0;//G
imgColor.at< cv::Vec3b >(pts.at(i))[2] = 0;//R
}
for (int i = 0; i < pts2.size(); i++) {
imgColor.at<cv::Vec3b>(pts2.at(i))[0] = 0;//B
imgColor.at< cv::Vec3b >(pts2.at(i))[1] = 0;//G
imgColor.at< cv::Vec3b >(pts2.at(i))[2] = 255;//R
}
#endif
float fRadius;
Point2f ptCenter;
bool bFind = luffy_imageProc::lsCircleFit(pts2, fRadius, ptCenter);
if (!bFind) {
return Mat();
}
Mat dst;
const int nOffset = 1;
fRadius += nOffset;
Rect rt(ptCenter.x - fRadius + nOffset, ptCenter.y - fRadius + nOffset, 2 * fRadius, 2 * fRadius);
rt &= Rect(0, 0, resizedImage.cols, resizedImage.rows);
resizedImage(rt).copyTo(dst);
Mat finalDst(dst.size(), dst.type(), Scalar::all(0));
cv::circle(finalDst, Point(finalDst.cols / 2, finalDst.rows / 2), fRadius, Scalar::all(1), -1);
dst = dst.mul(finalDst);
return dst;
}
bool CaliValve::cutValve(Mat & img2Rect, Mat &imgTemplate, Rect rtCut, int nAngleMax)
{
if (rtCut.x < 0) {
imgTemplate.create(Size(rtCut.width, rtCut.height), img2Rect.type());
Rect rtLeft(nAngleMax + rtCut.x, rtCut.y, -rtCut.x, rtCut.height);
Rect rtRight(0, rtCut.y, rtCut.width - rtLeft.width, rtCut.height);
img2Rect(rtLeft).copyTo(imgTemplate(Rect(0, 0, rtLeft.width, rtLeft.height)));
img2Rect(rtRight).copyTo(imgTemplate(Rect(rtLeft.width, 0, rtRight.width, rtLeft.height)));
return true;
}
else if (rtCut.x + rtCut.width >= nAngleMax) {
imgTemplate.create(Size(rtCut.width, rtCut.height), img2Rect.type());
Rect rtLeft(rtCut.x, rtCut.y, nAngleMax-rtCut.x, rtCut.height);
Rect rtRight(0, rtCut.y, rtCut.width - rtLeft.width, rtCut.height);
img2Rect(rtLeft).copyTo(imgTemplate(Rect(0, 0, rtLeft.width, rtLeft.height)));
img2Rect(rtRight).copyTo(imgTemplate(Rect(rtLeft.width, 0, rtRight.width, rtLeft.height)));
return true;
}
luffy_math::checkRoiRect(Size(img2Rect.cols, img2Rect.rows), rtCut);
img2Rect(rtCut).copyTo(imgTemplate);
return true;
}
bool CaliValve::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst /*= Mat()*/)
{
Record_List records = paramIn.roi.records;
Record_List barRecords = paramIn.barROI.records;
int nCircleCount = records.size();
int barCircleCount = barRecords.size();
if (nCircleCount == 0 && barCircleCount ==0) {
return false;
}
luffy_base::luffyCircle realCircle;
realCircle.ptCenter = Point2f(0, 0);
realCircle.fRadius = 10000000000000.0;
for (int i = 0; i < nCircleCount; i++) {
Item_List item = records.at(i);
Feature_List feature = item.at(0);
if (1 == feature.first) {
int size = feature.second.size();
if (size < 3)
{
continue;
}
Point2f p = Point2f(feature.second.at(0), feature.second.at(1));
float r = abs(feature.second.at(2));
if (r < realCircle.fRadius)
{
realCircle.fRadius = r;
realCircle.ptCenter = p;
}
continue;
}
}
luffy_base::luffyCircle barCircle;
for (int i = 0; i < barCircleCount; i++) {
Item_List circleItem = barRecords.at(i);
Feature_List circleFeature = circleItem.at(0);
if (1 == circleFeature.first) {
int size = circleFeature.second.size();
if (size < 3)
{
continue;
}
barCircle.ptCenter = Point2f(circleFeature.second.at(0), circleFeature.second.at(1));
barCircle.fRadius = abs(circleFeature.second.at(2));
break;
}
}
cv::circle(imgDst, realCircle.ptCenter, realCircle.fRadius, LP_COLOR_RED, 2);
cv::circle(imgDst, realCircle.ptCenter, 2, LP_COLOR_BLUE, 2);
cv::circle(imgDst, barCircle.ptCenter, barCircle.fRadius, LP_COLOR_RED, 2);
cv::circle(imgDst, barCircle.ptCenter, 2, LP_COLOR_BLUE, 2);
cv::circle(imgDst, paramIn.ptCenter, 2, LP_COLOR_RED, 2);
float fRadius = luffy_math::disofPoints(realCircle.ptCenter, paramIn.ptCenter);
int offset = 30;
int nImgHeight = realCircle.fRadius * 2 + 2 * offset;
Mat img2Rect;
luffy_math::polar2rect(imgSrc, img2Rect, paramIn.ptCenter,
fRadius - nImgHeight / 2, fRadius + nImgHeight / 2, paramIn.nAngleMax);
if (paramIn.flagCircle > 0)
{
qWarning() << "outPut param flagCircle :" << paramIn.flagCircle;
paramOut.nValveOffset = luffy_math::caculAngle(paramIn.ptCenter, barCircle.ptCenter) / 360.0 * paramIn.nAngleMax;
Rect rTargetRoi(paramOut.nValveOffset - barCircle.fRadius, offset, 2 * barCircle.fRadius, 2 * realCircle.fRadius);
cutValve(img2Rect, paramOut.barTemplate, rTargetRoi, paramIn.nAngleMax);
paramOut.fValveWidth = realCircle.fRadius;
paramOut.fValveDis = fRadius;
paramOut.withinOffset = 0;
}
else
{
//<! cut valve
qWarning() << "outPut param flagCircle :" << paramIn.flagCircle;
paramOut.nValveOffset = luffy_math::caculAngle(paramIn.ptCenter, realCircle.ptCenter) / 360.0 * paramIn.nAngleMax;
float barCircleOffset = luffy_math::caculAngle(paramIn.ptCenter, barCircle.ptCenter) / 360 * paramIn.nAngleMax;
Rect rbarRoi(barCircleOffset - barCircle.fRadius, offset, 2 * barCircle.fRadius, 2 * realCircle.fRadius);
Rect rtRoi(paramOut.nValveOffset - realCircle.fRadius, offset, 2 * realCircle.fRadius, 2 * realCircle.fRadius);
cutValve(img2Rect, paramOut.imgTemplate, rtRoi, paramIn.nAngleMax);
cutValve(img2Rect, paramOut.barTemplate, rbarRoi, paramIn.nAngleMax);
if (paramIn.barNum <= 0)
{
qWarning() << "barNum cannot be negative or ZERO";
return false;
}
int T = paramIn.nAngleMax / paramIn.barNum;
if ((paramOut.nValveOffset - barCircleOffset > -T && paramOut.nValveOffset - barCircleOffset < 0) ||
(paramOut.nValveOffset - barCircleOffset >(paramIn.barNum - 1) * T)
)
{
barCircleOffset = barCircleOffset - T;
}
int interval = luffy_math::mod(paramOut.nValveOffset - barCircleOffset, paramIn.nAngleMax);
paramOut.withinOffset = interval;
paramOut.fValveWidth = realCircle.fRadius;
paramOut.fValveDis = fRadius;
}
///////for test
//
//Mat circleRoi;
//float startx = realCircle.ptCenter.x - realCircle.fRadius;
//float starty = realCircle.ptCenter.y - realCircle.fRadius;
//imgSrc(Rect(startx, starty, realCircle.fRadius * 2, realCircle.fRadius * 2)).copyTo(circleRoi);
//paramOut.imgTemplate = circleRoi;
if (paramIn.ifClasify)
{
Mat grayImage;
grayImage.setTo(0);
colorConvert(paramOut.background, grayImage);
Mat gray = imgSrc.clone();
Mat foreGround = findWheelObject(gray, grayImage, paramIn.backgroundThresh);
if (foreGround.empty())
{
return false;
}
int repeatNum = paramIn.barNum;
Mat weightMat(foreGround.size(), foreGround.type());
selfRotateMin(foreGround, weightMat, repeatNum);
Mat mask = genMask(foreGround, Point(foreGround.cols / 2, foreGround.rows / 2), -1, -1, CV_32FC1);
weightMat.convertTo(weightMat, CV_32FC1);
weightMat = weightMat.mul(mask);
weightMat.setTo(0, weightMat < 20);
preProcessImage(foreGround, mask, 127.0, 20.0, 256);
#ifdef VIEW_INTERNAL_MAT
Mat m_weightMat = weightMat / 255.0;
Mat baseImage = foreGround / 255.0;
#endif
paramOut.baseImage = foreGround;
paramOut.weightMat = weightMat;
paramOut.background = grayImage;
}
else
{
paramOut.baseImage = Mat();
paramOut.weightMat = Mat();
}
return true;
}
void CaliValve::selfRotateMin(const Mat& src, Mat &dst, int repeatNum)
{
Point2f center(src.cols / 2.0, src.rows / 2.0);
float angleStep = 360.0 / repeatNum;
Mat dstMat = Mat::ones(src.size(), src.type())*255;
for (int i = 0; i < repeatNum; ++i)
{
Mat rotateParamMat = getRotationMatrix2D(center, angleStep*i, 1.0);
Mat rImg;
warpAffine(src, rImg, rotateParamMat, src.size(), INTER_CUBIC, BORDER_CONSTANT);
Mat dialitedMat;
dilate(rImg, dialitedMat, Mat::ones(3, 3, CV_32FC1));
dstMat = min(dstMat, dialitedMat);
}
dst = dstMat;
}
void CaliValve::colorConvert(const Mat& src, Mat & dst)
{
if (src.channels() == 1)
{
dst = src.clone();
}
else if (src.channels() == 3)
{
cvtColor(src, dst, CV_RGB2GRAY);
}
else if (src.channels() == 4)
{
cvtColor(src, dst, CV_RGBA2GRAY);
}
}

@ -0,0 +1,58 @@
#ifndef LP_VALVE_DETECTOR_H
#define LP_VALVE_DETECTOR_H
#include "Luffy.h"
#include "lpbengine.h"
using namespace luffy_base;
struct InputParam
{
LP_DETECTOR_ROI_DATA roi;
LP_DETECTOR_ROI_DATA barROI;
int flagCircle;
Point2f ptCenter;
int barNum;
const int nAngleMax = 3600;
int backgroundThresh;
int ifClasify;
int ibackground;
};
struct OutputParam
{
float fValveDis;
float fValveWidth;
Mat imgTemplate;
int nValveOffset;
Mat barTemplate;
int withinOffset;
int barNum;
int flagCircle;
Mat baseImage;
Mat background;
Mat weightMat;
};
class CaliValve
{
public:
CaliValve();
~CaliValve();
bool detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst = Mat());
bool cutValve(Mat & img2Rect, Mat &imgTemplate, Rect rtCut, int nAngleMax);
void preProcessImage(Mat& img, const Mat& mask, double dstMean, double dstStddev, int highlightsThreshold);
Mat genMask(const Mat& img, Point2f center, float innerR = -1,
float outterR = -1,
int type = CV_32FC1);
cv::Mat cocentricNorm(Mat& img, Point2f center, const Mat& weightMat, float dstMeanVal);
float interpolate(float* pY, int n, float stepX, float x);
Mat extractForegroundWheel(const Mat& background, const Mat& src);
Mat findWheelObject(Mat src, Mat backGroundImg, int thresh);
void selfRotateMin(const Mat& src, Mat &dst, int repeatNum);
Mat rotateImage(const Mat& img, Point2f center, float degree);
void colorConvert(const Mat& src, Mat & dst);
};
#endif //LP_VALVE_DETECTOR_H

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="algEg.cpp" />
<ClCompile Include="caliValve.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="algEg.h" />
<ClInclude Include="algEg_global.h" />
<ClInclude Include="caliValve.h" />
</ItemGroup>
<ItemGroup>
<None Include="calivalve_en.ts" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{E2DA7636-5531-47F1-ADE1-E5DD6E19154A}</ProjectGuid>
<Keyword>Qt4VSv1.0</Keyword>
<ProjectName>caliValve</ProjectName>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>12.0.30501.0</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<TargetName>$(ProjectName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PreprocessorDefinitions>_UNICODE;ALGO_LIB;QT_CORE_LIB;QT_GUI_LIB;UNICODE;WIN32;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtGui;.\..\..\3part\tadpole\include\tpBase;.\..\..\3part\opencv3.4.1\include;.\..\..\3part\opencv3.4.1\include\opencv;.\..\..\3part\opencv3.4.1\include\opencv2;.\..\..\..\Cyclops\include;.\..\..\3part\Cyclops\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<OutputFile>$(SolutionDir)..\runner17\algorithmLib\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(OutDir);..\..\3part\opencv3.4.1\x64\vc15\lib;..\..\3part\Cyclops\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Widgetsd.lib;Qt5Guid.lib;luffyd.lib;cyclopsd.lib;opencv_world341d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalOptions> /SUBSYSTEM:WINDOWS</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>_UNICODE;ALGO2_LIB;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_NO_DEBUG;UNICODE;WIN32;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtGui;.\..\..\3part\tadpole\include\tpBase;.\..\..\3part\opencv3.4.1\include;.\..\..\3part\opencv3.4.1\include\opencv;.\..\..\3part\opencv3.4.1\include\opencv2;.\..\..\..\Cyclops\include;.\..\..\3part\Cyclops\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat>
</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<OutputFile>$(SolutionDir)..\runner17\algorithmLib\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(OutDir);..\..\3part\opencv3.4.1\x64\vc15\lib;..\..\3part\Cyclops\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>false</GenerateDebugInformation>
<AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Widgets.lib;Qt5Gui.lib;luffy.lib;cyclops.lib;opencv_world341.lib;%(AdditionalDependencies)</AdditionalDependencies>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalOptions> /SUBSYSTEM:WINDOWS</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties MocDir=".\GeneratedFiles\$(ConfigurationName)" UicDir=".\GeneratedFiles" RccDir=".\GeneratedFiles" lupdateOptions="" lupdateOnBuild="0" lreleaseOptions="" Qt5Version_x0020_Win32="qt5.4.2-msvc" Qt5Version_x0020_x64="qt5.9.4-msvc2017-x64" MocOptions="" />
</VisualStudio>
</ProjectExtensions>
</Project>

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;cxx;c;def</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h</Extensions>
</Filter>
<Filter Include="Form Files">
<UniqueIdentifier>{99349809-55BA-4b9d-BF79-8FDBB0286EB3}</UniqueIdentifier>
<Extensions>ui</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}</UniqueIdentifier>
<Extensions>qrc;*</Extensions>
<ParseFiles>false</ParseFiles>
</Filter>
<Filter Include="Generated Files">
<UniqueIdentifier>{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}</UniqueIdentifier>
<Extensions>moc;h;cpp</Extensions>
<SourceControlFiles>False</SourceControlFiles>
</Filter>
<Filter Include="Translation Files">
<UniqueIdentifier>{639EADAA-A684-42e4-A9AD-28FC9BCB8F7C}</UniqueIdentifier>
<Extensions>ts</Extensions>
<ParseFiles>false</ParseFiles>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="algEg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="caliValve.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="algEg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="algEg_global.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="caliValve.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="calivalve_en.ts">
<Filter>Translation Files</Filter>
</None>
</ItemGroup>
</Project>

@ -62,6 +62,7 @@ lpMainWin::lpMainWin(QWidget *parent)
connect(ui.action_connect_mode, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.action_checkdata, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.action_modelmgr, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.action_designer, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actionSystemSeting, SIGNAL(triggered()), this, SLOT(onActionClicked()));
connect(ui.actioncamSetting, SIGNAL(triggered()), this, SLOT(onActionClicked()));
@ -168,49 +169,49 @@ lpMainWin::lpMainWin(QWidget *parent)
m_screen.ShowMsg(tr("系统初始化完成..."));
}
{
onSetModel();
/*网络通信加载*/
m_pNet = ((WheelCtrl*)m_pCtrl)->getNet();
connect(m_pNet, SIGNAL(sgShow2UI(QString, bool)), this, SLOT(onTcpConnet(QString, bool)));//net
connect(m_pNet, SIGNAL(sgClientConnect(QString, bool)), this, SLOT(onClientConnect(QString, bool)));//net
//connect(m_pNet, SIGNAL(sgRecv(const QString &)), this, SLOT(onTcpRecv(const QString &)));// net显示
connect(m_pNet, SIGNAL(sgThickness(double)), this, SLOT(onThickness(double)));//xy height
connect(m_pNet, SIGNAL(sgRecvDetectState(int, int)), this, SLOT(onDetectStateRecv(int, int)));//xy check
connect(m_pNet, SIGNAL(sgClearRev(bool)), this, SLOT(onClearLibRev(bool)));//xy clearlib
connect(m_pNet, SIGNAL(sgPulseRev()), this, SLOT(onPulseRev()));
// connect(m_pNet, SIGNAL(sgResultRev()), this, SLOT(onResultRev()));
connect(m_pNet, SIGNAL(sgRecvTrigPara()), this, SLOT(onRecvTrigPara()));
connect(m_pNet, SIGNAL(sgReadDetectState(int, QString)), this, SLOT(onReadDetectState(int, QString)));
connect(m_pNet, SIGNAL(sgReadDetectStateASK()), this, SLOT(onReadDetectStateASK()));
connect(m_pNet, SIGNAL(sgCameraTrig(int)), this, SLOT(onTrigRecv(int)));
connect(m_pNet, SIGNAL(sgServerState(QString, int, bool)), this, SLOT(onServerState(QString, int, bool)));
connect(m_pNet, SIGNAL(sgShutDownComputer()), this, SLOT(onShutDownComputer()));
connect(m_pNet, SIGNAL(sgLibRev(bool)), SendModelLibTask, SLOT(WaitSingleIn(bool)));//xy lib
// connect(m_pNet, SIGNAL(sgChangeOnlineState(int)), m_pUi, SLOT(onSwitchOnlineModel(int)));//强制在线 离线
QTimer::singleShot(500, m_pNet, SLOT(onOpenServer()));//延迟2s打开网络TCP服务
}
{
connect(&m_PulseTimer, SIGNAL(timeout()), this, SLOT(onPulseTimer()));//心跳包
connect(&m_wfPulseTimer, SIGNAL(timeout()), this, SLOT(onwfPulseTimer()));//心跳包
connect(&m_ThicknessTimer, SIGNAL(timeout()), this, SLOT(onThicknessTimer()));// 厚度查询
connect(&m_ReadLibTimer, SIGNAL(timeout()), this, SLOT(onSendReadOnlineLib()));
connect(this, SIGNAL(sgTickTsk()), this, SLOT(onPulseTimer()));
connect(this, SIGNAL(sgShowMsg(QString, bool)), this, SLOT(onTcpConnet(QString, bool)));
connect(this, SIGNAL(sgTaskSendModels(int, QString, double, double)), this, SLOT(onTaskSendModels(int, QString, double, double)));//用于发送莫板库
connect(this, SIGNAL(sgTskSendDetectState(int, QString, int)), this, SLOT(onTaskSendDetectState(int, QString, int)));//离线检测发送 用于发送检测状态
connect(this, SIGNAL(sgTskSendCheck(int, int, QString)), this, SLOT(onTaskCheck(int, int, QString)));//在线检测状态查询 用于查询线程
// connect(this, SIGNAL(sgCheckEnd()), this, SLOT(onCheckEnd()));
connect(this, SIGNAL(sgShowImgState(QString)), this, SLOT(onShowImgState(QString)));
connect(this, SIGNAL(sgGetImg()), this, SLOT(onGetImg()));
connect(this, SIGNAL(sgShowMsgdlg(QString)), this, SLOT(onShowMsg(QString)));
connect(this, SIGNAL(sgSendDisLib(int, QString)), this, SLOT(onSendDisLib(int, QString)));
connect(this, SIGNAL(sgSendDisLibDone()), this, SLOT(onSendDisLibDone()));
connect(this, SIGNAL(sgShowChannelRes(QString)), this, SLOT(onShowChannel(QString)));
}
// {
// onSetModel();
// /*网络通信加载*/
// m_pNet = ((WheelCtrl*)m_pCtrl)->getNet();
// connect(m_pNet, SIGNAL(sgShow2UI(QString, bool)), this, SLOT(onTcpConnet(QString, bool)));//net
// connect(m_pNet, SIGNAL(sgClientConnect(QString, bool)), this, SLOT(onClientConnect(QString, bool)));//net
// //connect(m_pNet, SIGNAL(sgRecv(const QString &)), this, SLOT(onTcpRecv(const QString &)));// net显示
// connect(m_pNet, SIGNAL(sgThickness(double)), this, SLOT(onThickness(double)));//xy height
// connect(m_pNet, SIGNAL(sgRecvDetectState(int, int)), this, SLOT(onDetectStateRecv(int, int)));//xy check
// connect(m_pNet, SIGNAL(sgClearRev(bool)), this, SLOT(onClearLibRev(bool)));//xy clearlib
// connect(m_pNet, SIGNAL(sgPulseRev()), this, SLOT(onPulseRev()));
// // connect(m_pNet, SIGNAL(sgResultRev()), this, SLOT(onResultRev()));
// connect(m_pNet, SIGNAL(sgRecvTrigPara()), this, SLOT(onRecvTrigPara()));
// connect(m_pNet, SIGNAL(sgReadDetectState(int, QString)), this, SLOT(onReadDetectState(int, QString)));
// connect(m_pNet, SIGNAL(sgReadDetectStateASK()), this, SLOT(onReadDetectStateASK()));
// connect(m_pNet, SIGNAL(sgCameraTrig(int)), this, SLOT(onTrigRecv(int)));
// connect(m_pNet, SIGNAL(sgServerState(QString, int, bool)), this, SLOT(onServerState(QString, int, bool)));
// connect(m_pNet, SIGNAL(sgShutDownComputer()), this, SLOT(onShutDownComputer()));
// connect(m_pNet, SIGNAL(sgLibRev(bool)), SendModelLibTask, SLOT(WaitSingleIn(bool)));//xy lib
//
// // connect(m_pNet, SIGNAL(sgChangeOnlineState(int)), m_pUi, SLOT(onSwitchOnlineModel(int)));//强制在线 离线
//
// QTimer::singleShot(500, m_pNet, SLOT(onOpenServer()));//延迟2s打开网络TCP服务
// }
// {
// connect(&m_PulseTimer, SIGNAL(timeout()), this, SLOT(onPulseTimer()));//心跳包
// connect(&m_wfPulseTimer, SIGNAL(timeout()), this, SLOT(onwfPulseTimer()));//心跳包
// connect(&m_ThicknessTimer, SIGNAL(timeout()), this, SLOT(onThicknessTimer()));// 厚度查询
// connect(&m_ReadLibTimer, SIGNAL(timeout()), this, SLOT(onSendReadOnlineLib()));
//
// connect(this, SIGNAL(sgTickTsk()), this, SLOT(onPulseTimer()));
// connect(this, SIGNAL(sgShowMsg(QString, bool)), this, SLOT(onTcpConnet(QString, bool)));
// connect(this, SIGNAL(sgTaskSendModels(int, QString, double, double)), this, SLOT(onTaskSendModels(int, QString, double, double)));//用于发送莫板库
// connect(this, SIGNAL(sgTskSendDetectState(int, QString, int)), this, SLOT(onTaskSendDetectState(int, QString, int)));//离线检测发送 用于发送检测状态
// connect(this, SIGNAL(sgTskSendCheck(int, int, QString)), this, SLOT(onTaskCheck(int, int, QString)));//在线检测状态查询 用于查询线程
// // connect(this, SIGNAL(sgCheckEnd()), this, SLOT(onCheckEnd()));
// connect(this, SIGNAL(sgShowImgState(QString)), this, SLOT(onShowImgState(QString)));
// connect(this, SIGNAL(sgGetImg()), this, SLOT(onGetImg()));
// connect(this, SIGNAL(sgShowMsgdlg(QString)), this, SLOT(onShowMsg(QString)));
// connect(this, SIGNAL(sgSendDisLib(int, QString)), this, SLOT(onSendDisLib(int, QString)));
// connect(this, SIGNAL(sgSendDisLibDone()), this, SLOT(onSendDisLibDone()));
// connect(this, SIGNAL(sgShowChannelRes(QString)), this, SLOT(onShowChannel(QString)));
// }
{
/*启动之后就一直发送心跳包和厚度查询*/
if (DetectState::instance()->m_AutoSendTick2Net)
@ -422,7 +423,6 @@ bool lpMainWin::onInitEngineCtrl()
m_pEngineCtrl = m_pDllEngineCtrl->m_pDE;
}
}
if (m_pDllDesigner == nullptr)
@ -905,6 +905,11 @@ Q_SLOT void lpMainWin::onActionClicked()
m_CamSettingDlg->show();
}
}
else if ("action_designer" == strObj) {
if (m_pDesigner) {
m_pDesigner->ShowMainFrame();
}
}
}
Q_SLOT void lpMainWin::onButtonClicked()

@ -860,7 +860,7 @@ background-color: rgb(170, 170, 127);</string>
<addaction name="action_modelmgr"/>
<addaction name="action_connect_mode"/>
<addaction name="action_checkdata"/>
<addaction name="action"/>
<addaction name="action_designer"/>
<addaction name="separator"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
@ -1032,7 +1032,11 @@ background-color: rgb(170, 170, 127);</string>
</font>
</property>
</action>
<action name="action">
<action name="action_designer">
<property name="icon">
<iconset resource="../../src/tpMain/hubDetect.qrc">
<normaloff>:/ToolBarPic/ToolBarpic/app8.png</normaloff>:/ToolBarPic/ToolBarpic/app8.png</iconset>
</property>
<property name="text">
<string>设计</string>
</property>

@ -0,0 +1,104 @@
#include "BatchTest4Alg.h"
#include "cv.h"
#include "highgui.h"
#include "Luffy.h"
#include "qstringlist.h"
#include "qfile.h"
#include "qdatetime.h"
using namespace cv;
struct Region {
cv::Scalar color;
int id;
std::vector<cv::Point2i> points;
void write(cv::FileStorage& fs) const {
fs << "{" << "id" << id << "points" << points << "}";
}
void read(const cv::FileNode& node) {
//node["color"] >> color;
node["id"] >> id;
node["points"] >> points;
}
};
inline std::vector<std::vector<cv::Point>> read_points_info(std::string path) {
cv::FileStorage fs;
fs.open(path, cv::FileStorage::READ);
int count{ -1 };
int id{ -1 };
std::vector<std::vector<std::vector<cv::Point>>> regions{};
std::vector<std::vector<cv::Point>> defect_regions{ std::vector < cv::Point > {} };
cv::FileNode node = fs.getFirstTopLevelNode();
std::vector<std::vector<cv::Point2i>> dst;
while (1) {
Region re_load;
re_load.read(fs["region" + std::to_string(++count)]);
//fs["region" + std::to_string(++count)] >> re_load;
auto region = re_load.points;
if (region.empty()) {
if (!defect_regions.empty())regions.push_back(defect_regions);
fs.release();
break;
}
if (id != re_load.id) {
if (id != -1)regions.push_back(defect_regions);
while (re_load.id > int(regions.size())) {
regions.push_back(std::vector < std::vector<cv::Point> > {std::vector < cv::Point > {}});
}
id = re_load.id;
defect_regions.clear();
}
dst.push_back(re_load.points);
//defect_regions.push_back(region);
}
return dst;
}
BatchTest4Alg::BatchTest4Alg()
{
}
BatchTest4Alg::~BatchTest4Alg()
{
}
bool BatchTest4Alg::batchTest(QString strModel, Point pt, int nError, QString strBase, QString strFile)
{
QString m = strModel.split("##").last();
QString str = strFile.replace(m, m + "-out");
str = str.left(str.length() - 3) + "xml";
Point ptCali = getCaliPosition(str);
double dis = luffy_base::luffy_math::disofPoints(ptCali, pt);
dis = sqrt(dis);
return dis < 10;
}
cv::Point BatchTest4Alg::getCaliPosition(QString strFile)
{
std::string str = strFile.toLocal8Bit().data();
FileStorage fs(strFile.toLocal8Bit().data(), FileStorage::READ);
if (!fs.isOpened()) {
return Point();
}
vector<vector<Point>> pts = read_points_info(strFile.toLocal8Bit().data());
if (pts.size() == 0) {
return Point();
}
Rect rt = cv::boundingRect(pts[0]);
return Point(rt.x + rt.width / 2, rt.y + rt.height / 2);
}
bool BatchTest4Alg::saveResult(QString strModel, int nError, QString modelFile, QString saveFile)
{
QFile qFile(saveFile);
qFile.open(QIODevice::Append | QIODevice::WriteOnly);
QString str = "time:%1, model:%2, result:%3, file:%4\r\n";
str = str.arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh-mm-ss zzz")).arg(strModel).arg(nError).arg(modelFile);
qFile.write(str.toLocal8Bit().data());
qFile.close();
return true;
}

@ -0,0 +1,14 @@
#pragma once
#include "qstring.h"
#include "core\core.hpp"
class BatchTest4Alg
{
public:
BatchTest4Alg();
~BatchTest4Alg();
static bool batchTest(QString strModel, cv::Point pt, int nError, QString strBase, QString strFile);
static cv::Point getCaliPosition(QString strFile);
static bool saveResult(QString strModel, int nError, QString modelFile, QString saveFile);
};

@ -0,0 +1,307 @@
#include "algEg.h"
#include "ValveDetector.h"
#include "qmap.h"
#include "qtcvutils.h"
#include "BatchTest4Alg.h"
#include "modelVerfication.h"
#pragma execution_character_set("utf-8")
using namespace luffy_base;
static QMap <QString, InputParam*> listModes;
algEg::algEg()
{
luffy_triangle::createNewTrigValue(360);
luffy_triangle::createNewTrigValue(3600);
}
algEg::~algEg()
{
}
const int nAngleMax = 3600;
bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
{
//<! detect
int64 nStart = cv::getTickCount();qDebug() << "start alg valve detect";
ValveDetector m_objDetect;
InputParam paramInput = { 0 };
OutputParam paramOutput;
paramInput.dScoreThres = lpAlgorithm->GetParamValue("scoreTh", LP_DOUBLE).toDouble();
paramInput.nBarScore = lpAlgorithm->GetParamValue("barScore", LP_INT).toDouble();
paramInput.nBarScore = paramInput.nBarScore > 50 ? paramInput.nBarScore : 50;
paramInput.withinOffset = lpAlgorithm->GetParamValue("withinOffset", LP_INT).toInt();
paramInput.barNum = lpAlgorithm->GetParamValue("barNum", LP_INT).toInt();
paramOutput.bIsFind = false;
paramOutput.dScore = 0;
paramOutput.showMatchScore = -1;
paramInput.nMaxAngle = nAngleMax;
paramOutput.dAngle = 361;
paramOutput.nErrorType = 0;
paramInput.flagCircle = lpAlgorithm->GetParamValue("flagCircle", LP_INT).toInt();
paramInput.roi = lpAlgorithm->GetParamValue("cirlceArea", LP_ROI).value<LP_DETECTOR_ROI_DATA>();
paramInput.cMatchScore = lpAlgorithm->GetParamValue("cMatchScore", LP_DOUBLE).toDouble();
paramInput.wheelType = lpAlgorithm->GetParamValue("wheelType", LP_INT).toInt();
paramInput.backgroundThresh = lpAlgorithm->GetParamValue("backgroundThresh", LP_INT).toInt();
Mat mask; Mat gray;
if (!lpTask->GetTaskInfo()->detectImg.empty()) {
luffy_imageProc::createImage(lpTask->GetTaskInfo()->detectImg, gray, luffy_imageProc::emCreateGray);
qDebug() << "luffy_imageProc::createImage";
}
if (gray.empty()) {
paramOutput.nErrorType += 1;
qWarning() << "valve detect, gray is empty";
return false;
}
// if (gray.size() != paramInput.roi.img.size())
// {
// qWarning() << "img size not compare";
// return false;
// }
luffy_imageProc::createImage(gray, mask, luffy_imageProc::emCreateColor);
QString strObj = paramInput.strObj = lpTask->GetTaskInfo()->strName;
bool bExist = true;
if (strObj.isEmpty()) {
bExist = false;
paramOutput.nErrorType += 2;
}
Mat centerRoi = lpAlgorithm->GetParamValue("centerRoi", LP_MAT).value<cv::Mat>();
if (!centerRoi.empty()) {
qDebug() << "valve detection: creating CenterRoi";
luffy_imageProc::createImage(centerRoi, paramInput.centerRoi, luffy_imageProc::emCreateGray);
}
else {
qWarning() << "valve detection: fail to get CenterRoi";
bExist = false;
}
//保护 防止越界
QPointF pt = lpAlgorithm->GetParamValue("center", LP_POINTF).toPointF();
if (pt.x() > gray.size().width||pt.y()>gray.size().height)
{
qWarning() << "center point big ";
return false;
}
// add original center
paramInput.originalPoint = Point2f(pt.x(), pt.y());
paramInput.nCenterAlg = lpAlgorithm->GetParamValue("centerAlg", LP_INT).toInt();
// add background
paramInput.backGround = lpAlgorithm->GetParamValue("background", LP_MAT).value<cv::Mat>();
luffy_imageProc::createImage(paramInput.backGround, paramInput.backGround, luffy_imageProc::emCreateGray);
Mat rstMat;
if (bExist)
{
qDebug() << "valve detection: found CenterRoi, trying to get the center points";
paramInput.ptCenter = m_objDetect.getCenterPoints(gray, centerRoi, paramInput, Point(pt.x(), pt.y()), rstMat);
}
if (paramInput.ptCenter.x == 0) {
bExist = false;
qWarning() << "valve detection: center point is null, background is empty";
}
else
{
float dis = luffy_math::disofPoints(paramInput.originalPoint, paramInput.ptCenter);
if (dis > 25)
{
bExist = false;
paramOutput.nErrorType += 8;
paramOutput.flag = 1;
}
}
paramInput.nValveOffset = lpAlgorithm->GetParamValue("valveOffset", LP_INT).toInt();
paramInput.fValveWidth = lpAlgorithm->GetParamValue("valveWidth", LP_DOUBLE).toDouble();
paramInput.fValveDis = lpAlgorithm->GetParamValue("valveDis", LP_DOUBLE).toDouble();
Mat tmp = lpAlgorithm->GetParamValue("valveTemplate", LP_MAT).value<cv::Mat>();
Mat barTemp = lpAlgorithm->GetParamValue("barTemplate", LP_MAT).value<cv::Mat>();
///////
Mat weightMat = lpAlgorithm->GetParamValue("weightMat", LP_MAT).value<cv::Mat>();
Mat baseImage = lpAlgorithm->GetParamValue("baseImage", LP_MAT).value<cv::Mat>();
int num = lpTask->GetSystemInfoValue("station").toInt();
if (num == 2)
{
if (!baseImage.empty() && !weightMat.empty())
{
if (baseImage.size() != weightMat.size())
{
paramOutput.showMatchScore = 366;
paramOutput.nErrorType += 16;
bExist = false;
}
else
{
modelVerfication verObj(20, 127);
verObj.setWeightMat(weightMat);
bool ok = verObj.objectVerification(rstMat, baseImage, paramInput.cMatchScore, 360, paramOutput.showMatchScore);
if (!ok)
{
paramOutput.nErrorType += 16;
bExist = false;
}
}
}
}
if (!tmp.empty() && !barTemp.empty()) {
luffy_imageProc::createImage(tmp, paramInput.imgTemplate, luffy_imageProc::emCreateGray);
luffy_imageProc::createImage(barTemp, paramInput.barTemplate, luffy_imageProc::emCreateGray);
}
else {
if (!barTemp.empty() && paramInput.flagCircle == 1)
{
luffy_imageProc::createImage(barTemp, paramInput.barTemplate, luffy_imageProc::emCreateGray);
}
else
{
qWarning() << "valve detection: can not get template for detecting";
bExist = false;
}
}
if (bExist) {
qDebug() << "valve detection: try finding";
m_objDetect.detect(gray, paramInput, paramOutput, mask);
}
else {
qWarning() << "valve detection: some param is missing";
}
if (lpTask->GetSystemInfoValue("wf_batch_test").toBool()) {
int nAngle = paramOutput.dAngle;
nAngle = nAngle >= paramInput.nMaxAngle ? 0 : nAngle;
int tmpX = paramInput.ptCenter.x + paramInput.fValveDis * luffy_base::luffy_triangle::getCos(paramInput.nMaxAngle, nAngle);
int tmpY = paramInput.ptCenter.y - paramInput.fValveDis * luffy_base::luffy_triangle::getSin(paramInput.nMaxAngle, nAngle);
Point ptValve(tmpX, tmpY);
QString strBase = lpTask->GetSystemInfoValue("folderBase").toString();
QString strFile = lpTask->GetSystemInfoValue("fileName").toString();
bool b = BatchTest4Alg::batchTest(strObj, ptValve, paramOutput.nErrorType, strBase, lpTask->GetTaskInfo()->strImageName);
BatchTest4Alg::saveResult(strObj, b, lpTask->GetTaskInfo()->strImageName, strBase + "\\" + strFile);
}
QVariantMap vMap = lpTask->GetTaskInfo()->property.toMap();
vMap.insert("model_cali", true);
lpTask->GetTaskInfo()->property = vMap;
paramOutput.dAngleRes = (paramOutput.dAngle - paramInput.nValveOffset) / paramInput.nMaxAngle * 360.0;
paramOutput.dAngleRes = m_objDetect.ruleData(paramOutput.dAngleRes, paramOutput.nErrorType);
paramOutput.strResultTip = m_objDetect.genResultTip(paramOutput.strResultTip, paramOutput.nErrorType);
paramOutput.dTime = (double)(cv::getTickCount() - nStart) / cv::getTickFrequency() * 1000.0;
m_objDetect.drawResult(mask, paramInput, paramOutput);
m_objDetect.saveResult(gray, paramInput, paramOutput, strObj);
lpAlgorithm->SetOutParamValue("image", EngineBase::convMat2QImage(mask));
lpAlgorithm->SetOutParamValue("score", paramOutput.dScore);
lpAlgorithm->SetOutParamValue("angle", paramOutput.dAngleRes);
lpAlgorithm->SetOutParamValue("error", paramOutput.nErrorType);
QString cLetter = paramOutput.strResultTip + "/" + QString::number(paramInput.dScoreThres);
lpAlgorithm->SetOutParamValue("resultTip", cLetter);
//lpAlgorithm->SetOutParamValue("resultTip", paramOutput.strResultTip);
QString strImgName = lpTask->GetTaskInfo()->strImageName;
lpAlgorithm->SetOutParamValue("imageName", lpTask->GetTaskInfo()->strImageName);
qDebug() << "finish alg valve detect";
return true;
}
bool algEg::Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
{
LP_ALGORITHM_PARAM param1_1("backgroundThresh", LP_INT, 15, QObject::tr("背景差异性阈值"));
lpAlgorithm->AddParam(&param1_1, 1);
LP_ALGORITHM_PARAM param1("scoreTh", LP_DOUBLE, 90, QObject::tr("相似度评价阈值在0~100之间"));
lpAlgorithm->AddParam(&param1, 1);
LP_ALGORITHM_PARAM param2_1("wheelType", LP_INT, 0, QObject::tr("轮毂类型0摩伦1汽轮"));
lpAlgorithm->AddParam(&param2_1, 1);
LP_ALGORITHM_PARAM param3("flagCircle", LP_INT, 0, QObject::tr("0无气门芯标识绑定气门芯标定"));
lpAlgorithm->AddParam(&param3, 1);
LP_ALGORITHM_PARAM param3_1("centerAlg", LP_INT, 0, QObject::tr("是否开启中心定位0关闭1开启"));
lpAlgorithm->AddParam(&param3_1, 1);
LP_ALGORITHM_PARAM param3_2("center", LP_POINTF, QVariant(), QObject::tr("轮毂中心坐标,绑定气门芯标定"));
lpAlgorithm->AddParam(&param3_2, 1);
LP_ALGORITHM_PARAM param3_3("centerRoi", LP_MAT, QVariant(), QObject::tr("轮毂中心模板, 绑定圆定位"));
lpAlgorithm->AddParam(&param3_3, 1);
LP_ALGORITHM_PARAM param3_6("cirlceArea", LP_ROI, QVariant(), QObject::tr("轮毂区域框选"));
lpAlgorithm->AddParam(&param3_6, 1);
LP_ALGORITHM_PARAM param3_7("cMatchScore", LP_DOUBLE, 0.2000, QObject::tr("轮毂型号匹配分值"));
lpAlgorithm->AddParam(&param3_7, 1);
LP_ALGORITHM_PARAM param3_9("barScore", LP_INT, 0, QObject::tr("辐条得分值"));
lpAlgorithm->AddParam(&param3_9, 1);
LP_ALGORITHM_PARAM param13_1("withinOffset", LP_INT, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param13_1, 1);
LP_ALGORITHM_PARAM param13_2("barNum", LP_INT, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param13_2, 1);
LP_ALGORITHM_PARAM param13("valveOffset", LP_INT, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param13, 1);
LP_ALGORITHM_PARAM param23("valveWidth", LP_DOUBLE, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param23, 1);
LP_ALGORITHM_PARAM param33("valveDis", LP_DOUBLE, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param33, 1);
LP_ALGORITHM_PARAM param43("valveTemplate", LP_MAT, QVariant(), QObject::tr(" "));
lpAlgorithm->AddParam(&param43, 1);
LP_ALGORITHM_PARAM param44("barTemplate", LP_MAT, QVariant(), QObject::tr(" "));
lpAlgorithm->AddParam(&param44, 1);
LP_ALGORITHM_PARAM param45("weightMat", LP_MAT, QVariant(), QObject::tr(" "));
lpAlgorithm->AddParam(&param45, 1);
LP_ALGORITHM_PARAM param46("baseImage", LP_MAT, QVariant(), QObject::tr(" "));
lpAlgorithm->AddParam(&param46, 1);
LP_ALGORITHM_PARAM param4_1("background", LP_MAT, QVariant(), QObject::tr(" "));
lpAlgorithm->AddParam(&param4_1, 1);
LP_ALGORITHM_PARAM param6("image", LP_IMAGE);
lpAlgorithm->AddOutParam(&param6, 1);
LP_ALGORITHM_PARAM param7("score", LP_DOUBLE, 0, QObject::tr("相似度得分"));
lpAlgorithm->AddOutParam(&param7, 1);
LP_ALGORITHM_PARAM param8("angle", LP_DOUBLE, 0, QObject::tr("结果角度"));
lpAlgorithm->AddOutParam(&param8, 1);
LP_ALGORITHM_PARAM param9("error", LP_INT, 0, QObject::tr("错误类型"));
lpAlgorithm->AddOutParam(&param9, 1);
LP_ALGORITHM_PARAM param10("resultTip", LP_STRING, 0, QObject::tr("结果提示"));
lpAlgorithm->AddOutParam(&param10, 1);
QString AlgoName = QObject::tr("检测");
QString AlgoName2 = QObject::tr("圆心定位");
QString AlgoName3 = QObject::tr("气门芯标定");
return true;
}
void LpAlgoNewInstance(IAlgo** lppAlgo)
{
*lppAlgo = (IAlgo*)new algEg();
}
bool LpAlgoDeleteInstance()
{
return true;
}

@ -0,0 +1,23 @@
#ifndef _ALG_EG_H_
#define _ALG_EG_H_
#include ".\lpbengine.h"
#include ".\lpalgorithm.h"
class algEg : IAlgo
{
public:
algEg();
~algEg();
virtual bool Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm);
virtual bool Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm);
cv::Mat background;
private:
};
#endif // _ALG_EG_H_

@ -0,0 +1,12 @@
#ifndef _ALG_EG_GLOBAL_H_
#define _ALG_EG_GLOBAL_H_
#include <QtCore/qglobal.h>
#ifdef ALG_EG_LIB
# define ALG_EG_EXPORT Q_DECL_EXPORT
#else
# define ALG_EG_EXPORT Q_DECL_IMPORT
#endif
#endif // _ALG_EG_GLOBAL_H_

@ -0,0 +1,407 @@
#include "modelVerfication.h"
//#define VIEW_DEBUG_IMG
modelVerfication::modelVerfication(double tarStddevVal, double tarMeanVal) :
tarStddev(tarStddevVal)
, tarMean(tarMeanVal)
{
}
modelVerfication::~modelVerfication()
{
}
double disOfPoint(const Point2f& p1, const Point2f& p2)
{
return norm(p1 - p2);
}
float modelVerfication::interpolate(float* pY, int n, float stepX, float x)
{
int lIdx = (int)(x / stepX);
int rIdx = lIdx + 1;
if (rIdx > n - 1)
{
return pY[n - 1];
}
assert(lIdx >= 0 && lIdx < n && rIdx >= 0 && rIdx < n);
float s = (x - lIdx*stepX) / stepX;
float ly = pY[lIdx];
float ry = pY[rIdx];
return ly + (ry - ly)*s;
}
bool modelVerfication::objectVerification(const Mat &img, Mat& baseImage, double modelValidThresh, int endAngle, double & s)
{
int diff = abs(img.cols - baseImage.cols);
if (diff >=5)
{
qDebug() << "model verification : model possibly is not match";
s = 365;
return false;
}
if (baseImage.type()!=CV_32FC1)
{
baseImage.convertTo(baseImage, CV_32FC1);
}
Mat resizedImage(baseImage.size(), baseImage.type(), Scalar::all(0));
if (img.size()!= baseImage.size())
{
resize(img, resizedImage, baseImage.size());
}
else
{
resizedImage = img;
}
Mat mask = genMask(resizedImage, Point(resizedImage.cols / 2, resizedImage.rows / 2), -1, -1, CV_8UC1);
m32fMaskImg = genMask(resizedImage, Point2f(resizedImage.cols / 2, resizedImage.rows / 2));
preProcessImage(resizedImage, mask, tarMean, tarStddev, 256);
RData* pData = new RData();
rotateMatchData(resizedImage, baseImage, pData, 1, 0, endAngle);
double result = 0;
Mat rstImg, showImage, Ibase;
if (pData->mDisValVec.empty())
{
delete pData;
qDebug() << "model verification : the distance of model is empty";
result = FLT_MAX;
}
else
{
size_t bestIndex = min_element(pData->mDisValVec.begin(), pData->mDisValVec.end()) - pData->mDisValVec.begin();
result = pData->mDisValVec[bestIndex];
rstImg = pData->mRImgVec[bestIndex];
#ifdef VIEW_DEBUG_IMG
showImage = rstImg / 255;
Ibase = baseImage / 255;
#endif // VIEW_DEBUG_IMG
qDebug() << "model verification : found the minimal value model:" << result;
delete pData;
}
if (result < modelValidThresh)
{
qDebug() << "model verification : image is valid";
s = result;
return true;
}
else
{
qDebug() << "model verification : image is not valid";
s = result;
return false;
}
//Mat image = croppedImage / 255.0;
}
Mat modelVerfication::extractForegroundWheel(const Mat &background, const Mat &src)
{
Mat resizedGroundImage = background.clone();
if (resizedGroundImage.size() != src.size())
{
resize(background, resizedGroundImage, src.size());
}
return (src - resizedGroundImage);
}
Mat modelVerfication::findWheelObject(Mat src, Mat backGroundImg, int thresh)
{
if (src.empty() || backGroundImg.empty() || src.cols < 500)
{
return Mat();
}
assert(backGroundImg.type() == CV_8UC1);
const cv::Size size = cv::Size(416, floor(416.0 / src.cols * src.rows));
Mat resizedImage;
resizedImage.setTo(0);
resize(src, resizedImage, size);
Mat foregroundImg = extractForegroundWheel(backGroundImg, resizedImage);
using namespace luffy_base;
Mat imgBinary;
imgBinary.setTo(0);
luffy_threshold::Threshold(foregroundImg, imgBinary, thresh);//0421
//luffy_threshold::Threshold(imgTmp, imgBinary, nThres);
Mat dilatedImgBin;
dilate(imgBinary, dilatedImgBin, Mat::ones(7, 7, CV_32FC1));
erode(dilatedImgBin, imgBinary, Mat::ones(7, 7, CV_32FC1));
//openOper(imgBinary, Mat::ones(1, 13, CV_32FC1));
vector<vector<Point>> conts;
cv::findContours(imgBinary, conts, RETR_EXTERNAL, CHAIN_APPROX_NONE);
imgBinary.setTo(0);
for (int i = 0; i < conts.size(); i++) {
const vector<Point> &pt = conts.at(i);
if (pt.size() < 20) {
continue;
}
Rect rt = boundingRect(pt);
if (rt.width < 5 || rt.height < 5) {
continue;
}
drawContours(imgBinary, conts, i, Scalar::all(255), -1);
}
Mat hit; vector<Point> pts;
luffy_hit::firstHit4Circle(imgBinary, hit, pts, Point(size.width / 2, size.height / 2), 0, size.width / 2, 360, luffy_hit::emHitOut2In);
//luffy_imageProc::RansacParam rs(0.02, 2.5, 70, 100, 220);
luffy_imageProc::RansacParam rs(0.01, 3, 150, 100, 240);//0421
vector<Point> pts2 = luffy_imageProc::fitModelbyRansac(pts, luffy_imageProc::emModelCircle, &rs);
#ifdef _DEBUG
Mat imgColor;
cv::cvtColor(resizedImage, imgColor, CV_GRAY2BGR);
for (int i = 0; i < pts.size(); i++) {
imgColor.at<cv::Vec3b>(pts.at(i))[0] = 255;//B
imgColor.at< cv::Vec3b >(pts.at(i))[1] = 0;//G
imgColor.at< cv::Vec3b >(pts.at(i))[2] = 0;//R
}
for (int i = 0; i < pts2.size(); i++) {
imgColor.at<cv::Vec3b>(pts2.at(i))[0] = 0;//B
imgColor.at< cv::Vec3b >(pts2.at(i))[1] = 0;//G
imgColor.at< cv::Vec3b >(pts2.at(i))[2] = 255;//R
}
#endif
float fRadius;
Point2f ptCenter;
bool bFind = luffy_imageProc::lsCircleFit(pts2, fRadius, ptCenter);
if (!bFind) {
return Mat();
}
Mat dst;
const int nOffset = 1;
fRadius += nOffset;
Rect rt(ptCenter.x - fRadius + nOffset, ptCenter.y - fRadius + nOffset, 2 * fRadius, 2 * fRadius);
rt &= Rect(0, 0, resizedImage.cols, resizedImage.rows);
resizedImage(rt).copyTo(dst);
Mat finalDst(dst.size(), dst.type(), Scalar::all(0));
cv::circle(finalDst, Point(finalDst.cols / 2, finalDst.rows / 2), fRadius, Scalar::all(1), -1);
dst = dst.mul(finalDst);
return dst;
}
void ImageCompareModel2::operator()(const cv::Range& range) const
{
int i0 = range.start;
int i1 = range.end;
assert(abs(i1 - i0) == 1);
model->parallelDetect(i0, m_pData, templ);
}
void modelVerfication::parallelDetect(int index, void *p, Mat templ)
{
RData *pData = (RData *)p;
Mat t = getRotationMatrix2D(pData->mCenter, pData->angle(index), 1.0);
Mat rImg;
warpAffine(pData->mImgSrc, rImg, t, pData->mImgSrc.size());
if (rImg.size() != templ.size())
{
resize(rImg, rImg, templ.size());
}
Mat imgRes = abs(templ - rImg);
imgRes = imgRes.mul(m32fMaskImg).mul(weightMat);
float s = sum(weightMat).val[0];
double val = norm(imgRes) / s;
pData->mDisValVec[index] = val;
pData->mRImgVec[index] = rImg;
}
void modelVerfication::rotateMatchData(const Mat& _img, const Mat &baseImage, RData* pData, float angleStep, float startAngle, float endAngle)
{
Mat img = _img.clone();
Point2f center(img.cols / 2.0, img.rows / 2.0);
int nNum = (endAngle - startAngle) / angleStep;
RData& data = *pData;
data.init(_img, center, angleStep, nNum);
data.mStartAngle = startAngle;
data.mEndAngle = endAngle;
qDebug() << "start parallel test";
parallel_for_(Range(0, nNum), ImageCompareModel2(this, pData, baseImage));
}
void modelVerfication::preProcessImage(Mat& img, const Mat& mask, double dstMean, double dstStddev, int highlightsThreshold)
{
if (img.type() != CV_32FC1)
{
img.convertTo(img, CV_32FC1);
}
Mat gaussImg;
GaussianBlur(img, gaussImg, Size(3, 3), 5.0);
img = gaussImg;
Mat dilatedMask;
dilate(mask, dilatedMask, Mat::ones(Size(3, 3), CV_32FC1));
Mat hightlightsMask = img < highlightsThreshold;
Mat imgMask = hightlightsMask & dilatedMask;
//imgMask.convertTo(imgMask, CV_32FC1);
Scalar meanScalar, stddevScalar;
meanStdDev(img, meanScalar, stddevScalar, imgMask);
img = (img - meanScalar.val[0]) * dstStddev / stddevScalar.val[0] + dstMean;
imgMask.convertTo(imgMask, CV_32FC1);
imgMask /= 255.0;
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0),
imgMask, 125);
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat vImgNorm = imgNorm / 255.0;
#endif
img = imgNorm;
}
cv::Mat modelVerfication::genMask(const Mat& img, Point2f center, float innerR /*= -1*/, float outterR /*= -1*/, int type /*= CV_32FC1*/)
{
Mat mask(img.size(), CV_8UC1);
mask.setTo(0);
if (innerR == -1)
{
// default is 30
innerR = img.rows*0.178;
}
if (outterR == -1)
{
// default is max radius - 10
outterR = img.rows * 0.425;
}
circle(mask, center, outterR, Scalar(255), -1);
circle(mask, center, innerR, Scalar(0), -1);
if (type != CV_8UC1)
{
mask.convertTo(mask, type);
mask /= 255;
}
return mask;
}
cv::Mat modelVerfication::cocentricNorm(Mat& img, Point2f center, const Mat& weightMat, float dstMeanVal)
{
assert(weightMat.empty() || weightMat.type() == CV_32FC1);
int w = img.cols;
int h = img.rows;
vector<Point2f> corners;
corners.push_back(Point2f(0, 0));
corners.push_back(Point2f(0, h));
corners.push_back(Point2f(w, h));
corners.push_back(Point2f(w, 0));
vector<double> cornerDisVec;
for_each(corners.begin(), corners.end(), [&](const Point2f& pt)
{
double dis = disOfPoint(center, pt);
cornerDisVec.push_back(dis);
});
auto farthestCornerDis = max_element(cornerDisVec.begin(), cornerDisVec.end());
float maxRadius = *farthestCornerDis;
int radiusNum = floorf(maxRadius);
//radiusNum = 20;
float radiusStep = (maxRadius / radiusNum);
Mat cocentricSumMat = Mat::zeros(1, radiusNum, CV_32FC1);
float* pSumData = (float*)cocentricSumMat.data;
Mat cocentricWeightSumMat = Mat::zeros(1, radiusNum, CV_32FC1);
float* pWeightSumData = (float*)cocentricWeightSumMat.data;
Mat radiusMat(img.rows, img.cols, CV_32FC1);
for (int y = 0; y < h; y++)
{
const Mat& imgRow = img.row(y);
float* pImgRowData = (float*)imgRow.data;
float* pRadiusRowData = (float*)radiusMat.row(y).data;
float* pWeightRowData = NULL;
if (!weightMat.empty())
{
pWeightRowData = (float*)weightMat.row(y).data;
}
for (int x = 0; x < w; x++)
{
//std::cout << x << " " << y << std::endl;
float weight;
if (pWeightRowData)
{
weight = pWeightRowData[x];
}
else
{
weight = 1.0;
}
float val = pImgRowData[x] * weight;
float radius = disOfPoint(Point2f(x, y), center);
pRadiusRowData[x] = radius;
int radiusIdx0 = (int)(radius / radiusStep);
assert(radiusIdx0 >= 0);
int radiusIdx1 = radiusIdx0 + 1;
if (radiusIdx0 >= radiusNum - 1)
{
pSumData[radiusNum - 1] += val;
pWeightSumData[radiusNum - 1] += weight;
}
else
{
float s = (radius - radiusStep*radiusIdx0) / radiusStep;
pSumData[radiusIdx0] += val*s;
pSumData[radiusIdx1] += val*(1 - s);
pWeightSumData[radiusIdx0] += s*weight;
pWeightSumData[radiusIdx1] += (1 - s)*weight;
}
}
// CvPlot::plot<float>("sum", pSumData, radiusNum);
// CvPlot::plot<float>("count", pCountData, radiusNum);
// waitKey();
}
for (int i = 0; i < radiusNum; ++i)
{
//float radius = (i*radiusStep + radiusStep) / 2;
if (pWeightSumData[i] == 0)
{
}
else
{
pSumData[i] /= pWeightSumData[i];
}
}
Mat retMat = Mat::zeros(img.rows, img.cols, img.type());
for (int y = 0; y < h; y++)
{
float* pImgRowData = (float*)img.row(y).data;
float* pRetRowData = (float*)retMat.row(y).data;
float* pRadiusData = (float*)radiusMat.row(y).data;
for (int x = 0; x < w; x++)
{
float val = pImgRowData[x];
float radius = pRadiusData[x];
float mean = interpolate(pSumData, radiusNum, radiusStep, radius);
if (mean == 0)
{
continue;
}
float newVal = (float)val * dstMeanVal / mean;
pRetRowData[x] = newVal;
}
}
#ifdef DEBUG_VIEW_INTERNAL_MAT
Mat viewRetMat = retMat / 255.0;
#endif
return retMat;
}

@ -0,0 +1,108 @@
#pragma once
#include "Luffy.h"
#include "lpbengine.h"
using namespace cv;
class RData
{
public:
RData() {};
RData(const Mat &img, Point pt, double dAngleStep, int size)
: mImgSrc(img)
, mStartAngle(0)
, mEndAngle(360)
{
init(img, pt, dAngleStep, size);
};
void init(const Mat& img, Point pt, double dAngleStep, int size)
{
mImgSrc = img;
mStartAngle = 0;
mEndAngle = 360.0;
mRImgVec.clear();
mRImgVec.resize(size);
mDisValVec.clear();
mDisValVec.resize(size, FLT_MAX);
mCenter = pt;
mAngleStep = dAngleStep;
}
double angle(int index)
{
return index*mAngleStep + mStartAngle;
}
double bestAngle()
{
if (mDisValVec.empty())
{
return -DBL_MAX;
}
size_t bestIndex = min_element(mDisValVec.begin(),
mDisValVec.end()) - mDisValVec.begin();
double bestAngle = angle(bestIndex);
return bestAngle;
}
Mat bestRImg()
{
if (mRImgVec.empty())
{
return Mat();
}
size_t bestIndex = min_element(mDisValVec.begin(),
mDisValVec.end()) - mDisValVec.begin();
return mRImgVec[bestIndex];
}
double mAngleStep;
Mat mImgSrc;
Point mCenter;
vector<Mat> mRImgVec;
vector<float> mDisValVec;
float mStartAngle, mEndAngle;
};
class modelVerfication
{
public:
modelVerfication(double tarStddevVal, double tarMeanVal);
~modelVerfication();
Mat extractForegroundWheel(const Mat& background, const Mat& src);
Mat findWheelObject(Mat src, Mat backGroundImg, int thresh);
void rotateMatchData(const Mat& _img, const Mat &baseImage, RData* pData, float angleStep, float startAngle, float endAngle);
void parallelDetect(int index, void *p, Mat templ);
void preProcessImage(Mat& img, const Mat& mask, double dstMean, double dstStddev, int highlightsThreshold);
Mat genMask(const Mat& img, Point2f center, float innerR = -1,
float outterR = -1,
int type = CV_32FC1);
cv::Mat cocentricNorm(Mat& img, Point2f center, const Mat& weightMat, float dstMeanVal);
float interpolate(float* pY, int n, float stepX, float x);
bool objectVerification(const Mat &img, Mat& baseImage, double modelValidThresh, int endAngle, double & s);
void setWeightMat(const Mat& img)
{
weightMat = img;
weightMat.convertTo(weightMat, CV_32FC1);
}
static int h;
private:
Mat weightMat;
Mat m32fMaskImg;
double tarStddev;
double tarMean;
};
class ImageCompareModel2 : public cv::ParallelLoopBody
{
public:
ImageCompareModel2(modelVerfication *m, void* pData, Mat T)
: m_pData(pData), model(m), templ(T)
{}
private:
void *m_pData;
modelVerfication* model;
Mat templ;
virtual void operator() (const cv::Range& range) const;
};

File diff suppressed because it is too large Load Diff

@ -0,0 +1,146 @@
#ifndef LP_VALVE_DETECTOR_H
#define LP_VALVE_DETECTOR_H
#include "Luffy.h"
#include "lpbengine.h"
#define ALG_RESIZE_IMAGE_WIDTH 416.0
//#define VEIW_HISTGRAM
using namespace luffy_base;
struct InputParam
{
QString strObj;
Mat imgTemplate; //气门芯模板
int nValveOffset;
float fValveWidth;
float fValveDis;
Point2f ptCenter;
double dScoreThres;
int nMaxAngle;
int nCenterAlg; // 中心校准算法
int nBarScore;
Mat barTemplate; //辐条参数
//int bgThresh;
int withinOffset;
int barNum; //辐条数量
Mat centerRoi;
int flagCircle;
Mat baseImage; //气门芯型号确认模板图
int backgroundThresh; // 抠图阈值
int modelMatchScore; //模型匹配值
LP_DETECTOR_ROI_DATA roi;
cv::Mat backGround;
Point2f originalPoint;
Mat weightMat;
double cMatchScore;
int wheelType;
};
struct OutputParam
{
double dTime;
double dAngle;
double dAngleRes;
double dScore;
int nErrorType;
bool bIsFind;
QString strResultTip;
Point2f rstPoint;
int flag;
double showMatchScore;
};
class ValveDetector
{
public:
ValveDetector();
~ValveDetector();
bool detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst = Mat());
void drawResult(Mat &img, InputParam &paramIn, OutputParam &paramOut);
Point2f getCenter(Mat & imgSrc, Point2f pt, InputParam &paramIn);
double ruleData(double, int);
QString genResultTip(QString str, int nType);
Point2f getCenterPoints(Mat &_img, const Mat &centerTempl, InputParam paramIn, Point2f pt, Mat& rstMat);
bool saveResult(Mat &img, InputParam &paramIn, OutputParam &paramOut, QString modelStr);
bool isValid(Mat target, Mat templ, Point2f pt, int validThresh);
void drawToImage(Mat &img, InputParam &paramIn, OutputParam &paramOut);
cv::Mat findCircleObject(const Mat &src, const Mat& backgroundImg, int nThres = 20, luffy_base::luffyCircle *pCircle = NULL);
cv::Mat getForeImage(const Mat & src, const Mat &backgroundImg);
};
/*class RotateData
{
public:
RotateData() {};
RotateData(const Mat &img, Point pt, double dAngleStep, int size)
: mImgSrc(img)
, mStartAngle(0)
, mEndAngle(360)
{
init(img, pt, dAngleStep, size);
};
void init(const Mat& img, Point pt, double dAngleStep, int size)
{
mImgSrc = img;
mStartAngle = 0;
mEndAngle = 360.0;
mRImgVec.clear();
mRImgVec.resize(size);
mDisValVec.clear();
mDisValVec.resize(size, FLT_MAX);
mCenter = pt;
mAngleStep = dAngleStep;
}
double angle(int index)
{
return index*mAngleStep + mStartAngle;
}
double bestAngle()
{
if (mDisValVec.empty())
{
return -DBL_MAX;
}
size_t bestIndex = min_element(mDisValVec.begin(),
mDisValVec.end()) - mDisValVec.begin();
double bestAngle = angle(bestIndex);
return bestAngle;
}
Mat bestRImg()
{
if (mRImgVec.empty())
{
return Mat();
}
size_t bestIndex = min_element(mDisValVec.begin(),
mDisValVec.end()) - mDisValVec.begin();
return mRImgVec[bestIndex];
}
double mAngleStep;
Mat mImgSrc;
Point mCenter;
vector<Mat> mRImgVec;
vector<float> mDisValVec;
float mStartAngle, mEndAngle;
};
class ImageCompareModelInvoker : public cv::ParallelLoopBody
{
public:
ImageCompareModelInvoker(Mat &templ, void* pData)
: m_pData(pData), temp(templ)
{}
private:
void *m_pData;
Mat temp;
virtual void operator() (const cv::Range& range) const;
};*/
#endif //LP_VALVE_DETECTOR_H

@ -0,0 +1,174 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="algEg.cpp" />
<ClCompile Include="BatchTest4Alg.cpp" />
<ClCompile Include="modelVerfication.cpp" />
<ClCompile Include="valveDetector.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="algEg.h" />
<ClInclude Include="algEg_global.h" />
<ClInclude Include="BatchTest4Alg.h" />
<ClInclude Include="modelVerfication.h" />
<ClInclude Include="valveDetector.h" />
</ItemGroup>
<ItemGroup>
<None Include="valvedetector_en.ts" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}</ProjectGuid>
<Keyword>Qt4VSv1.0</Keyword>
<ProjectName>valveDetector</ProjectName>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>12.0.30501.0</_ProjectFileVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<TargetName>$(ProjectName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<TargetName>$(ProjectName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PreprocessorDefinitions>UNICODE;WIN32;WIN64;QT_CORE_LIB;ALGO_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtWidgets;.\..\..\..\tadpole\include;.\..\..\3part\opencv2.4.9\include;.\..\..\3part\opencv2.4.9\include\opencv;.\..\..\3part\opencv2.4.9\include\opencv2;.\..\..\..\Cyclops\include;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<OutputFile>$(SolutionDir)..\runner13\algorithmLib\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(OutDir);..\..\..\Cyclops\3rd\nlopt\x86;.\..\..\3part\opencv2.4.9\x86\vc12\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Widgetsd.lib;opencv_core249d.lib;opencv_imgproc249d.lib;opencv_highgui249d.lib;luffyd.lib;Qt5Guid.lib;Cyclopsd.lib;libnlopt-0.lib;opencv_nonfree249d.lib;opencv_objdetect249d.lib;opencv_video249d.lib;opencv_ml249d.lib;opencv_features2d249d.lib;opencv_flann249d.lib;opencv_calib3d249d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PreprocessorDefinitions>_UNICODE;ALGO_LIB;QT_CORE_LIB;QT_GUI_LIB;UNICODE;WIN32;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtGui;.\..\..\3part\tadpole\include\tpBase;.\..\..\3part\opencv3.4.1\include;.\..\..\3part\opencv3.4.1\include\opencv;.\..\..\3part\opencv3.4.1\include\opencv2;.\..\..\..\Cyclops\include;.\..\..\3part\Cyclops\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<OutputFile>$(SolutionDir)..\runner17\algorithmLib\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(OutDir);..\..\3part\opencv3.4.1\x64\vc15\lib;..\..\3part\Cyclops\lib;..\..\3part\Cyclops\3rd\nlopt;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmaind.lib;Qt5Cored.lib;Qt5Widgetsd.lib;Qt5Guid.lib;Cyclopsd.lib;luffyd.lib;opencv_world341d.lib;libnlopt-0.lib;%(AdditionalDependencies)</AdditionalDependencies>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalOptions> /SUBSYSTEM:WINDOWS</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;ALGO2_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtWidgets;.\..\..\..\tadpole\include;.\..\..\3part\opencv2.4.9\include;.\..\..\3part\opencv2.4.9\include\opencv;.\..\..\3part\opencv2.4.9\include\opencv2;.\..\..\..\Cyclops\include;$(QTDIR)\include\QtGui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat />
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<OutputFile>$(SolutionDir)..\runner13\algorithmLib\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(OutDir);..\..\..\Cyclops\3rd\nlopt\x86;.\..\..\3part\opencv2.4.9\x86\vc12\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Widgets.lib;opencv_core249.lib;opencv_imgproc249.lib;opencv_highgui249.lib;luffy.lib;Qt5Gui.lib;cyclops.lib;libnlopt-0.lib;opencv_nonfree249.lib;opencv_objdetect249.lib;opencv_video249.lib;opencv_ml249.lib;opencv_features2d249.lib;opencv_flann249.lib;opencv_calib3d249.lib;%(AdditionalDependencies)</AdditionalDependencies>
<GenerateMapFile>true</GenerateMapFile>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>_UNICODE;ALGO2_LIB;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_NO_DEBUG;UNICODE;WIN32;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtGui;.\..\..\3part\tadpole\include\tpBase;.\..\..\3part\opencv3.4.1\include;.\..\..\3part\opencv3.4.1\include\opencv;.\..\..\3part\opencv3.4.1\include\opencv2;.\..\..\..\Cyclops\include;.\..\..\3part\Cyclops\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat>
</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<OutputFile>$(SolutionDir)..\runner17\algorithmLib\$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>$(QTDIR)\lib;$(OutDir);..\..\3part\opencv3.4.1\x64\vc15\lib;..\..\3part\Cyclops\lib;..\..\3part\Cyclops\3rd\nlopt;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>qtmain.lib;Qt5Core.lib;Qt5Widgets.lib;Qt5Gui.lib;Cyclops.lib;luffy.lib;opencv_world341.lib;libnlopt-0.lib;%(AdditionalDependencies)</AdditionalDependencies>
<GenerateMapFile>true</GenerateMapFile>
<TargetMachine>MachineX64</TargetMachine>
<AdditionalOptions> /SUBSYSTEM:WINDOWS</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties MocDir=".\GeneratedFiles\$(ConfigurationName)" UicDir=".\GeneratedFiles" RccDir=".\GeneratedFiles" lupdateOptions="" lupdateOnBuild="0" lreleaseOptions="" Qt5Version_x0020_Win32="qt5.4.2-msvc" Qt5Version_x0020_x64="qt5.9.4-msvc2017-x64" MocOptions="" />
</VisualStudio>
</ProjectExtensions>
</Project>

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;cxx;c;def</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h</Extensions>
</Filter>
<Filter Include="Form Files">
<UniqueIdentifier>{99349809-55BA-4b9d-BF79-8FDBB0286EB3}</UniqueIdentifier>
<Extensions>ui</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}</UniqueIdentifier>
<Extensions>qrc;*</Extensions>
<ParseFiles>false</ParseFiles>
</Filter>
<Filter Include="Generated Files">
<UniqueIdentifier>{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}</UniqueIdentifier>
<Extensions>moc;h;cpp</Extensions>
<SourceControlFiles>False</SourceControlFiles>
</Filter>
<Filter Include="Translation Files">
<UniqueIdentifier>{639EADAA-A684-42e4-A9AD-28FC9BCB8F7C}</UniqueIdentifier>
<Extensions>ts</Extensions>
<ParseFiles>false</ParseFiles>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="algEg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="valveDetector.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="BatchTest4Alg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="modelVerfication.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="algEg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="algEg_global.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="valveDetector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="BatchTest4Alg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="modelVerfication.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="valvedetector_en.ts">
<Filter>Translation Files</Filter>
</None>
</ItemGroup>
</Project>

@ -23,6 +23,12 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lpbengine", "lpbengine\lpbe
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lpdesigner", "lpdesigner\lpdesigner.vcxproj", "{616EB73F-66E3-46FF-B423-1A5B7E6AAB8B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "caliCenter", "caliCenter\caliCenter.vcxproj", "{C87504ED-3FD2-4539-AD1F-CF56BDE735FE}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "caliValve", "caliValve\caliValve.vcxproj", "{E2DA7636-5531-47F1-ADE1-E5DD6E19154A}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "valveDetector", "valveDetector\valveDetector.vcxproj", "{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@ -95,12 +101,32 @@ Global
{616EB73F-66E3-46FF-B423-1A5B7E6AAB8B}.Release|x64.ActiveCfg = Release|x64
{616EB73F-66E3-46FF-B423-1A5B7E6AAB8B}.Release|x64.Build.0 = Release|x64
{616EB73F-66E3-46FF-B423-1A5B7E6AAB8B}.Release|x86.ActiveCfg = Release|x64
{C87504ED-3FD2-4539-AD1F-CF56BDE735FE}.Debug|x64.ActiveCfg = Debug|x64
{C87504ED-3FD2-4539-AD1F-CF56BDE735FE}.Debug|x64.Build.0 = Debug|x64
{C87504ED-3FD2-4539-AD1F-CF56BDE735FE}.Debug|x86.ActiveCfg = Debug|x64
{C87504ED-3FD2-4539-AD1F-CF56BDE735FE}.Release|x64.ActiveCfg = Release|x64
{C87504ED-3FD2-4539-AD1F-CF56BDE735FE}.Release|x64.Build.0 = Release|x64
{C87504ED-3FD2-4539-AD1F-CF56BDE735FE}.Release|x86.ActiveCfg = Release|x64
{E2DA7636-5531-47F1-ADE1-E5DD6E19154A}.Debug|x64.ActiveCfg = Debug|x64
{E2DA7636-5531-47F1-ADE1-E5DD6E19154A}.Debug|x64.Build.0 = Debug|x64
{E2DA7636-5531-47F1-ADE1-E5DD6E19154A}.Debug|x86.ActiveCfg = Debug|x64
{E2DA7636-5531-47F1-ADE1-E5DD6E19154A}.Release|x64.ActiveCfg = Release|x64
{E2DA7636-5531-47F1-ADE1-E5DD6E19154A}.Release|x64.Build.0 = Release|x64
{E2DA7636-5531-47F1-ADE1-E5DD6E19154A}.Release|x86.ActiveCfg = Release|x64
{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}.Debug|x64.ActiveCfg = Debug|x64
{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}.Debug|x64.Build.0 = Debug|x64
{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}.Debug|x86.ActiveCfg = Debug|Win32
{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}.Debug|x86.Build.0 = Debug|Win32
{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}.Release|x64.ActiveCfg = Release|x64
{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}.Release|x64.Build.0 = Release|x64
{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}.Release|x86.ActiveCfg = Release|Win32
{2EDE9385-9EB0-4A22-9E27-B68D89C8E0BE}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
Qt5Version = qt5.9.4-msvc2017-x64
SolutionGuid = {CD365F32-5EAC-4A16-AD47-BFB1D8E5511A}
Qt5Version = qt5.9.4-msvc2017-x64
EndGlobalSection
EndGlobal

Loading…
Cancel
Save