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

399 lines
9.2 KiB
C++

5 years ago
#include "ModelManager.h"
#include "TempImage.h"
#include "HubBase.h"
#include "QZkJsonParser.h"
#include "WheelModel.h"
#include "modelmgrdb.h"
#define WHEEL_MODEL_FILE "\\user\\model.json"
#define WHEEL_DB_FILE "\\pattern\\modelTemplate.db"
#pragma execution_character_set("utf-8")
ModelManager::ModelManager(QString strRoot)
: m_strRoot(strRoot)
{
m_pModelDB = new ModelMgrDB(strRoot + WHEEL_DB_FILE);
hubBase::mkdir(m_strRoot + "\\pattern\\");
hubBase::mkdir(m_strRoot + "\\pattern\\template\\");
hubBase::mkdir(m_strRoot + "\\pattern\\Models\\");
}
ModelManager::~ModelManager()
{
m_pModelDB->closeDB();
delete m_pModelDB;
m_pModelDB = NULL;
foreach(IWheelModel* p, m_mpModels){
if (p){
delete p;
p = NULL;
}
}
m_mpModels.clear();
}
IWheelModel * ModelManager::getModel(QString str)
{
return m_mpModels.value(str);
}
QMap<QString, IWheelModel*> ModelManager::getDetectModelMap()
{
QMap<QString, IWheelModel*> mps;
for each (IWheelModel* var in m_mpModels) {
if (var->getDetectState()) {
mps.insert(var->getModelID(), var);
}
}
return mps;
}
QStringList ModelManager::getDetectModelName()
{
QStringList lst;
for each (IWheelModel* var in m_mpModels) {
if (var->getDetectState()){
lst.append(var->getModelID());
}
}
return lst;
}
bool ModelManager::ClearAllCount()
{
for each (IWheelModel* var in m_mpModels) {
var->clearCount();
}
return true;
}
bool ModelManager::addModel(QString str)
{
if (m_mpModels.contains(str)) {
return false;
}
IWheelModel *pModel = new WheelModel;
m_mpModels.insert(str, pModel);
QVariantMap map = genDbMap(pModel);
m_pModelDB->addData(map);
//通知界面(统计)
//listview
//UpdateListView
return true;
}
bool ModelManager::addModel(IWheelModel *pModel)
{
if (pModel == NULL)
return false;
if (m_mpModels.contains(pModel->getModelID()))
return false;
m_mpModels.insert(pModel->getModelID(), pModel);
QVariantMap map = genDbMap(pModel);
m_pModelDB->addData(map);
return true;
}
bool ModelManager::init()
{
if (!m_pModelDB) {
return false;
}
if (!m_pModelDB->InitDatabase()) {
return false;
}
bool bFlag = m_pModelDB->ReadOutData(m_mpModels);
if (!m_mpModels.contains("NG"))
{
IWheelModel* pModel = new WheelModel();
pModel->setModelID("NG");
pModel->setDiameter(0);
pModel->setDetectState(true);
pModel->setThickness(0);
m_mpModels.insert("NG", pModel);
//addModel()
}
QJsonObject obj = QZkJsonParser::ReadJsonAuto(m_strRoot + WHEEL_MODEL_FILE);
for each (IWheelModel* var in m_mpModels) {
WheelModel *pModel = (WheelModel*)var;
pModel->initTmpImage(m_strRoot + "\\pattern\\");
pModel->initComModel(m_strRoot + "\\pattern\\");
pModel->readJson(&obj);
}
return true;
}
bool ModelManager::modModel(QString str)
{
IWheelModel *pModel = m_mpModels.value(str);
if (!pModel) {
return false;
}
QVariantMap map = genDbMap(pModel);;
return m_pModelDB->UpdateModelData(pModel->getModelID(), map);
}
QVariantMap ModelManager::genDbMap(IWheelModel *pModel)
{
QVariantMap vMap;
vMap.insert(_MD_MODEL, pModel->getModelID());//model 模型名称
vMap.insert(_MD_DIAMETER, pModel->getDiameter());//直径
vMap.insert(_MD_HIGHT, pModel->getThickness());//高度
vMap.insert(_MD_PICPATH, pModel->getPicPath());
vMap.insert(_MD_ROTATE, pModel->getRepeatNum());
return vMap;
}
bool ModelManager::delModel(QString str)
{
bool bFlag = m_pModelDB->DeleteModelData(str);
IWheelModel *pModel = m_mpModels.take(str);
if (pModel) {
delete pModel;
pModel = NULL;
}
QString strSave = m_strRoot + "\\pattern\\template\\" + str + "\\";
hubBase::deleteDirectory(strSave);
QString strfilw = m_strRoot + "\\pattern\\Models\\" + str + ".jpg";
hubBase::removeFile(strfilw);
return true;
}
QStringList ModelManager::getAllModelName()
{
return m_mpModels.keys();
}
//得到所有加入训练的模板名
QStringList ModelManager::getAllTrainModelName()
{
QStringList allTrainModelNameList;
for each (IWheelModel* var in m_mpModels)
{
if (var->getAddTrainFlag()) {
allTrainModelNameList.append(var->getModelID());
}
}
return allTrainModelNameList;
}
TempImage * ModelManager::getTmpImage(QString str)
{
if (!m_mpModels.contains(str)) {
return NULL;
}
return m_mpModels.value(str)->getTempImage();
}
TempImage * ModelManager::getTrainImage(QString str)
{
if (!m_mpModels.contains(str)) {
return NULL;
}
IWheelModel *pMode = m_mpModels.value(str);
if (pMode->getAddTrainFlag() == false)
{
return NULL;
}
return m_mpModels.value(str)->getTempImage();
}
QMap<QString, std::vector<cv::Mat>> ModelManager::getAllModelImage()
{
QMap<QString, std::vector<cv::Mat>> mpAllImage;
QStringList lst = getAllModelName();
for (int i = 0; i < lst.size(); i++) {
TempImage *pImg = getTrainImage(lst.at(i));
if (pImg) {
mpAllImage.insert(lst.at(i), pImg->getImgVector());
}
}
return mpAllImage;
}
QMap<QString, IWheelModel*> * ModelManager::getAllModelMapPtr()
{
return &m_mpModels;
}
std::vector<cv::Mat> ModelManager::getAllModelImageExcSelf(QString strName)
{
std::vector<cv::Mat> mpAllImage;
QStringList lst = getAllModelName();
for (int i = 0; i < lst.size(); i++) {
if (lst.at(i) == strName) {
continue;
}
TempImage *pImg = getTrainImage(lst.at(i));
if (pImg) {
const std::vector<cv::Mat> &imgVec = pImg->getImgVector();
mpAllImage.insert(mpAllImage.end(), imgVec.begin(), imgVec.end());
}
}
return mpAllImage;
}
std::vector<modelInfo> ModelManager::getAllTarImgs(std::vector<QString> strName)
{
std::vector<modelInfo> stack;
for (int i = 0; i < strName.size(); i++)
{
modelInfo m_model;
TempImage *pImg = getTrainImage(strName[i]);
if (pImg)
{
const std::vector<cv::Mat> &imgVec = pImg->getImgVector();
m_model.mpAllImage.insert(m_model.mpAllImage.end(), imgVec.begin(), imgVec.end());
}
IWheelModel *pModel = getModel(strName[i]);
if (pModel)
{
m_model.md_diameter = pModel->getDiameter();
m_model.md_height = pModel->getThickness();
}
stack.push_back(m_model);
}
return stack;
}
bool ModelManager::saveModel(QString str)
{
IWheelModel *pModel = getModel(str);
if (!pModel) {
return false;
}
//read json
QJsonObject obj = QZkJsonParser::ReadJsonAuto(m_strRoot + WHEEL_MODEL_FILE);
((WheelModel*)pModel)->saveJson(&obj);
//save json
QZkJsonParser::WriteJsonObject(m_strRoot + WHEEL_MODEL_FILE, obj);
return true;
}
bool ModelManager::saveAllModel()
{
QJsonObject obj = QZkJsonParser::ReadJsonAuto(m_strRoot + WHEEL_MODEL_FILE);
for each (IWheelModel* var in m_mpModels) {
WheelModel *pModel = (WheelModel*)var;
pModel->saveJson(&obj);
}
QZkJsonParser::WriteJsonObject(m_strRoot + WHEEL_MODEL_FILE, obj);
return true;
}
IWheelModel * ModelManager::createModel()
{
return new WheelModel;
}
QStringList ModelManager::getNoDetectModelName()
{
QStringList lst;
for each (IWheelModel* var in m_mpModels) {
if (!var->getDetectState()){
lst.append(var->getModelID());
}
}
return lst;
}
bool ModelManager::setAllModelsState(bool state)
{
for each (IWheelModel* var in m_mpModels) {
if (var){
var->setDetectState(state);
}
}
return true;
}
bool ModelManager::setRestDetect()
{
for each (IWheelModel* var in m_mpModels) {
if (var){
bool bState = var->getDetectState();
var->setDetectState(!bState);
}
}
return true;
}
QString ModelManager::getModelPicPath(QString str)
{
return getModel(str)->getPicPath();
}
QMap<QString, cv::Mat> ModelManager::getAllImgsExcSelf(QString strName /*= QString()*/)
{
QMap<QString, cv::Mat> mpAllImage;
QStringList lst = getAllModelName();
for (int i = 0; i < lst.size(); i++) {
if (lst.at(i) == strName) {
continue;
}
QString strModeName = lst.at(i);
TempImage *pImg = getTrainImage(lst.at(i));
if (pImg) {
const std::vector<cv::Mat> &imgVec = pImg->getImgVector(1);
if (imgVec.size()<=0)
continue;
mpAllImage.insert(lst.at(i), imgVec.front());
}
}
return mpAllImage;
}
std::vector<cv::Mat> ModelManager::getFirstImgFromFalse(QString strName /*= QString()*/)
{
std::vector<cv::Mat> mpAllImage;
QStringList lst = getAllModelName();
for (int i = 0; i < lst.size(); i++) {
if (lst.at(i) == strName) {
continue;
}
TempImage *pImg = getTrainImage(lst.at(i));
if (pImg) {
const std::vector<cv::Mat> &imgVec = pImg->getImgVector(1);
mpAllImage.push_back(imgVec.front());
}
}
return mpAllImage;
}
bool ModelManager::reName(QString strOld,QString strNew)
{
if (m_mpModels.contains(strNew))
return false;
IWheelModel *pModel = m_mpModels.take(strOld);
if (pModel) {
m_mpModels.insert(strNew, pModel);
pModel->setModelID(strNew);
QString n_Pic_path = "\\pattern\\Models\\" + strNew + ".jpg";
pModel->setPicPath(n_Pic_path);
saveModel(strNew);
QVariantMap map = genDbMap(pModel);
m_pModelDB->addData(map);
bool bFlag = m_pModelDB->DeleteModelData(strOld);
QString strOldFile = m_strRoot + "\\pattern\\template\\" + strOld + "\\";
QString strNewFile = m_strRoot + "\\pattern\\template\\" + strNew + "\\";
hubBase::reNameDirectory(strOldFile, strNewFile);
QString strOldPic = m_strRoot + "\\pattern\\Models\\" + strOld + ".jpg";
QString strNewPic = m_strRoot + "\\pattern\\Models\\" + strNew + ".jpg";
hubBase::reNameFile(strOldPic, strNewPic);
pModel->reloadTmpImage(m_strRoot + "\\pattern\\");
}
else
{
return false;
}
return true;
}