打通数据流走向

master
zhou.mengjia 2 years ago
parent dbd307daed
commit 6ae5aba12f

File diff suppressed because it is too large Load Diff

@ -27,7 +27,7 @@
"param_policy": 2, "param_policy": 2,
"rely_on_camera": "", "rely_on_camera": "",
"rotation_angle": 0, "rotation_angle": 0,
"calib_file": ".\\config\\right.calib", "calib_file": ".\\config\\1.calib",
"save": 1, "save": 1,
"save_img_suffix": ".BMP", "save_img_suffix": ".BMP",
"savefile_rgb_swapped": false, "savefile_rgb_swapped": false,
@ -64,7 +64,7 @@
"param_policy": 2, "param_policy": 2,
"rely_on_camera": "", "rely_on_camera": "",
"rotation_angle": 0, "rotation_angle": 0,
"calib_file": ".\\config\\right.calib", "calib_file": ".\\config\\1.calib",
"save": 1, "save": 1,
"save_img_suffix": ".BMP", "save_img_suffix": ".BMP",
"savefile_rgb_swapped": false, "savefile_rgb_swapped": false,
@ -82,7 +82,18 @@
"height": 3072, "height": 3072,
"width": 2048, "width": 2048,
"type": 210 "type": 210
},
"Eagle-M4 F83A01121310": {
"id": 4,
"exposure": 10000,
"location": 2,
"save_img_suffix": ".BMP",
"height": 3072,
"width": 2048,
"type": 210
} }
}, },
"top": { "top": {
"startID": 0, "startID": 0,
@ -90,6 +101,6 @@
}, },
"side": { "side": {
"startID": 1, "startID": 1,
"endID": 3 "endID": 4
} }
} }

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@ -475,7 +475,7 @@ Q_SLOT void CameraControl::onCapture(int cameraLocation,int location)
#if IMAGEDRAWING == LPV #if IMAGEDRAWING == LPV
for (auto iter = m_mapSerialNumberIdTop.begin(); iter != m_mapSerialNumberIdTop.end(); iter++) for (auto iter = m_mapSerialNumberIdTop.begin(); iter != m_mapSerialNumberIdTop.end(); iter++)
{ {
if (m_cameraStockLocation.contains(iter.key())) if (m_cameraStockLocation[iter.key()] == location)
{ {
serialNumList << iter.key(); serialNumList << iter.key();
} }
@ -489,7 +489,7 @@ Q_SLOT void CameraControl::onCapture(int cameraLocation,int location)
#if IMAGEDRAWING == LPV #if IMAGEDRAWING == LPV
for (auto iter = m_mapSerialNumberIdSide.begin(); iter != m_mapSerialNumberIdSide.end(); iter++) for (auto iter = m_mapSerialNumberIdSide.begin(); iter != m_mapSerialNumberIdSide.end(); iter++)
{ {
if (m_cameraStockLocation.contains(iter.key())) if (m_cameraStockLocation[iter.key()] == location)
{ {
serialNumList << iter.key(); serialNumList << iter.key();
} }
@ -498,7 +498,6 @@ Q_SLOT void CameraControl::onCapture(int cameraLocation,int location)
serialNumList = m_mapSerialNumberIdSide.keys(); serialNumList = m_mapSerialNumberIdSide.keys();
#endif // IMAGEDRAWING == LPV #endif // IMAGEDRAWING == LPV
break; break;
default: default:
break; break;
@ -506,6 +505,7 @@ Q_SLOT void CameraControl::onCapture(int cameraLocation,int location)
if (serialNumList.length() != 0) if (serialNumList.length() != 0)
{ {
qInfo() << "Captured SerialNumList = " << serialNumList;
capture(serialNumList); capture(serialNumList);
} }
} }
@ -551,13 +551,13 @@ void CameraControl::capture(const QStringList& serialNumberList)
imgInfo.imageOrigin = ILImagePtr(__uuidof(LImage)); imgInfo.imageOrigin = ILImagePtr(__uuidof(LImage));
imgInfo.imageFixed = ILImagePtr(__uuidof(LImage)); imgInfo.imageFixed = ILImagePtr(__uuidof(LImage));
} }
//imgInfo.imageOrigin->SetImageData(imgInfo.image.cols, imgInfo.image.rows, (void*)imgInfo.image.data, imgInfo.image.step, 0);
if (serialNumber == "00787720450") { imgInfo.imageOrigin->Load("C:/Users/LENOVO/Downloads/0108/310102.bmp"); } else if (serialNumber == "00J49540865") { imgInfo.imageOrigin->Load("C:/Users/LENOVO/Downloads/0108/320111.bmp"); }
else
{
imgInfo.imageOrigin->SetImageData(imgInfo.image.cols, imgInfo.image.rows, (void*)imgInfo.image.data, imgInfo.image.step, 0); imgInfo.imageOrigin->SetImageData(imgInfo.image.cols, imgInfo.image.rows, (void*)imgInfo.image.data, imgInfo.image.step, 0);
}
//if (serialNumber == "00787720450") //{ // imgInfo.imageOrigin->Load("C:/Users/LENOVO/Downloads/0108/310102.bmp"); //} //else if (serialNumber == "00J49540865") //{ // imgInfo.imageOrigin->Load("C:/Users/LENOVO/Downloads/0108/320111.bmp"); //}
//else
//{
// imgInfo.imageOrigin->SetImageData(imgInfo.image.cols, imgInfo.image.rows, (void*)imgInfo.image.data, imgInfo.image.step, 0);
//}
if (m_calib->IsCalibrated()) if (m_calib->IsCalibrated())
{ {

@ -7,9 +7,18 @@ CategoryMatcher::CategoryMatcher(QObject *parent)
m_ilmatch = ILMatchPtr(__uuidof(LMatch)); m_ilmatch = ILMatchPtr(__uuidof(LMatch));
m_ilmatchF = ILMatchPtr(__uuidof(LMatch)); m_ilmatchF = ILMatchPtr(__uuidof(LMatch));
m_display = ILDisplayPtr(__uuidof(LDisplay)); m_display = ILDisplayPtr(__uuidof(LDisplay));
m_text = ILTextPtr(__uuidof(LText));
m_textSys= ILSystemPtr(__uuidof(LSystem));
initILMatchParam(QCoreApplication::applicationDirPath() + MATCHER_CONFIG); initILMatchParam(QCoreApplication::applicationDirPath() + MATCHER_CONFIG);
setILMatch(m_matchParam); setILMatch(m_matchParam);
qDebug() << "init CategoryMatcher successed"; qDebug() << "init CategoryMatcher successed";
m_text->Alignment = LPVAlignment::LPVAlignLeft; // 设置文本绘制时的对齐方式
m_textSys->SetFontColor(m_text, m_textSys->GetColorRef(0, 255, 0)); // 设置文本的颜色
m_textSys->SetFontHeight(m_text, 80); // 设置字体高度
m_textSys->SetFontFamily(m_text, "Microsoft YaHei"); // 设置字体类型
m_text->PosX = 100;
m_text->PosY = 100; // 设置文本绘制时的位置
} }
CategoryMatcher::~CategoryMatcher() CategoryMatcher::~CategoryMatcher()
@ -76,33 +85,14 @@ void CategoryMatcher::setILMatch(const MatchParam& matchParam)
bool CategoryMatcher::smokeMatch(const QString& typeNo, ILImagePtr image, int id) bool CategoryMatcher::smokeMatch(const QString& typeNo, ILImagePtr image, int id)
{ {
std::pair<int, QVector<ILMatchResultPtr>> templateLevelAndvecMatchRltPtr; QMap<int, ILMatchResultPtr> resultsPair;
bool bRlt = smokeMatch(typeNo, image, templateLevelAndvecMatchRltPtr,id); bool bRlt = smokeMatch(typeNo, image, resultsPair,id);
drawImage(image, templateLevelAndvecMatchRltPtr); drawImage(image, resultsPair);
return bRlt;
}
bool CategoryMatcher::smokeMatch(const QString& typeNo, const cv::Mat& inputMat, cv::Mat& rltMat)
{
if (inputMat.empty())
{
qWarning() << "inputMat is empty";
return false;
}
ILImagePtr ilImgGray(__uuidof(LImage));
cv::Mat imgMatGray;
ensureGrayImg(inputMat, imgMatGray);
qDebug() << "ensureGrayImg OK!";
ilImgGray->SetImageData(imgMatGray.cols, imgMatGray.rows, (void*)imgMatGray.data, imgMatGray.step, 0);
qDebug() << "LPV SetImageData OK!";
std::pair<int, QVector<ILMatchResultPtr>> templateLevelAndvecMatchRltPtr;
bool bRlt = smokeMatch(typeNo, ilImgGray, templateLevelAndvecMatchRltPtr, 0);
drawImage(imgMatGray, rltMat, templateLevelAndvecMatchRltPtr);
return bRlt; return bRlt;
} }
bool CategoryMatcher::smokeMatch(const QString& typeNo, const ILImagePtr ilImgPtr, bool CategoryMatcher::smokeMatch(const QString& typeNo, const ILImagePtr ilImgPtr,
std::pair<int, QVector<ILMatchResultPtr>>& templateLevelAndvecMatchRltPtr,int id) QMap<int, ILMatchResultPtr>& resultsMap, int id)
{ {
TemplateObject templateObj; TemplateObject templateObj;
QString templateImgFolderPath = TYPE_TEMPLATE_PATH; QString templateImgFolderPath = TYPE_TEMPLATE_PATH;
@ -123,16 +113,16 @@ bool CategoryMatcher::smokeMatch(const QString& typeNo, const ILImagePtr ilImgPt
QVector<double> vecMatchSroreMax; QVector<double> vecMatchSroreMax;
QVector<ILMatchResultPtr> vecMatchRltsMax; QVector<ILMatchResultPtr> vecMatchRltsMax;
QList<int> keys = templateObj.uniqueKeys(); QList<int> keys = templateObj.uniqueKeys();
int templateLevel = keys.length(); int templateLevelCount = keys.length();
str = QString("[%1]:templateLevel =%2").arg(id).arg(templateLevel); str = QString("[%1]:templateLevelCount =%2").arg(id).arg(templateLevelCount);
qDebug() << str; qDebug() << str;
templateLevelAndvecMatchRltPtr.first = templateLevel;
// ±éÀú²»Í¬Ä£°å¼¶±ð // ±éÀú²»Í¬Ä£°å¼¶±ð
for each (int level in keys) for each (int level in keys)
{ {
QVector<double> vecMatchSrore; QVector<double> vecMatchSrore;
QVector<ILMatchResultPtr> vecMatchRlts; QVector<ILMatchResultPtr> vecMatchRlts;
resultsMap.insert(level, nullptr);
QMap<QString, int> strScoreMap = templateObj.value(level); QMap<QString, int> strScoreMap = templateObj.value(level);
for (QMap<QString, int>::iterator it = strScoreMap.begin(); it != strScoreMap.end(); ++it) for (QMap<QString, int>::iterator it = strScoreMap.begin(); it != strScoreMap.end(); ++it)
{ {
@ -149,6 +139,7 @@ bool CategoryMatcher::smokeMatch(const QString& typeNo, const ILImagePtr ilImgPt
m_ilmatch->Learn(ilTemplatePtr, nullptr); m_ilmatch->Learn(ilTemplatePtr, nullptr);
ILImagePtr img(__uuidof(LImage)); ILImagePtr img(__uuidof(LImage));
ILImagePtr tempImage(__uuidof(LImage)); ILImagePtr tempImage(__uuidof(LImage));
//由于如果角度开到±180部分匹配时间过长故而用两次模板匹配分别匹配模板和模板旋转180度情况
ILImageArithmPtr imgArithmF(__uuidof(LImageArithm)); ILImageArithmPtr imgArithmF(__uuidof(LImageArithm));
imgArithmF->Flip(ilTemplatePtr, LPVFlipType::LPVFlipH, tempImage); imgArithmF->Flip(ilTemplatePtr, LPVFlipType::LPVFlipH, tempImage);
imgArithmF->Flip(tempImage, LPVFlipType::LPVFlipV, tempImage); imgArithmF->Flip(tempImage, LPVFlipType::LPVFlipV, tempImage);
@ -207,7 +198,9 @@ bool CategoryMatcher::smokeMatch(const QString& typeNo, const ILImagePtr ilImgPt
} }
if (vecMatchSrore.isEmpty()) if (vecMatchSrore.isEmpty())
{ {
break; str = QString("[%1]:Level: %1 match failed!").arg(id).arg(level);
qDebug() << str;
return false;
} }
else else
{ {
@ -215,19 +208,9 @@ bool CategoryMatcher::smokeMatch(const QString& typeNo, const ILImagePtr ilImgPt
auto maxMatchScorePos = std::max_element(vecMatchSrore.begin(), vecMatchSrore.end()); auto maxMatchScorePos = std::max_element(vecMatchSrore.begin(), vecMatchSrore.end());
auto maxIndex = maxMatchScorePos - vecMatchSrore.begin(); auto maxIndex = maxMatchScorePos - vecMatchSrore.begin();
vecMatchSroreMax.push_back(*maxMatchScorePos); vecMatchSroreMax.push_back(*maxMatchScorePos);
vecMatchRltsMax.push_back(vecMatchRlts.at(maxIndex)); //vecMatchRltsMax.push_back(vecMatchRlts.at(maxIndex));
} resultsMap[level]=vecMatchRlts.at(maxIndex);
} }
if (vecMatchSroreMax.isEmpty() || (vecMatchSroreMax.length() != templateLevel))
{
str = QString("[%1]:Level: %1 match failed!").arg(id).arg(vecMatchSroreMax.length() + 1);
qDebug() << str;
templateLevelAndvecMatchRltPtr.second = vecMatchRltsMax;
return false;
}
else
{
templateLevelAndvecMatchRltPtr.second = vecMatchRltsMax;
} }
} }
else else
@ -288,48 +271,63 @@ bool CategoryMatcher::getTemplateImgFileInfo(const QString& folderPath, Template
} }
void CategoryMatcher::drawImage(ILImagePtr image, std::pair<int, QVector<ILMatchResultPtr>> templateLevelAndvecMatchRltPtr) void CategoryMatcher::drawImage(ILImagePtr image, QMap<int, ILMatchResultPtr> resultsMap)
{ {
if (image->Void()) if (image->Void())
{ {
return; return;
} }
int level = 1;
int templateLevel = templateLevelAndvecMatchRltPtr.first;
std::stringstream textStream("");
//在Display上绘制图像+结果
m_display->SetImage(image);
m_display->RemoveAllObjects();
QString tittleStr,rltStr;
QVector<ILMatchResultPtr> vecMatchRlts = templateLevelAndvecMatchRltPtr.second; bool bRlt = false;
QString rltStr; for (auto iter = resultsMap.begin(); iter != resultsMap.end(); iter++)
cv::Scalar textColor(0, 255, 0);
if (!vecMatchRlts.isEmpty() && (vecMatchRlts.length() == templateLevel))
{ {
rltStr = QString("Match successful! Total level: %1").arg(templateLevel); ILMatchResultPtr matchRlt = iter.value();
} if (matchRlt == nullptr)
else
{ {
textColor = cv::Scalar(0, 0, 255); continue;
rltStr = QString("Match failed! Total level: %1").arg(templateLevel);
} }
bRlt = true;
double score = matchRlt->GetScore();
rltStr.append(QString("\n Level %1 score: %2").arg(iter.key()).arg(score));
//在Display上绘制图像+结果 if (iter.key() == 1)
m_display->SetImage(image);
//m_display->AddObject(rltStr,0);
rltStr.clear();
for each(ILMatchResultPtr matchRltPtr in vecMatchRlts)
{ {
// 存在问题如果不存在1级模板直接是2级模板 ILRotRectRegionPtr m_rect(__uuidof(LRotRectRegion));
double score = matchRltPtr->GetScore(); m_rect->SetPlacement(matchRlt->GetCenter()->X * 2, matchRlt->GetCenter()->Y * 2
rltStr.append(QString(" Level %1 score: %2").arg(level++).arg(score)); , matchRlt->GetRect()->Width * 2, matchRlt->GetRect()->Height * 2, matchRlt->GetRect()->Angle);
//存在的问题——大模板的时候匹配的得到的结果是放缩后的结果,需要对位置进行扩大 m_textSys->SetPenWidth(m_rect, 3);
m_display->AddObject(matchRltPtr, LPVPatDrawFlags::LPVPatDrawBoundingRect | LPVPatDrawFlags::LPVPatDrawCenter); m_textSys->SetPenColor(m_rect, m_textSys->GetColorRef(0, 255, 0));
m_display->AddObject(m_rect, 0);
}
else
{
m_textSys->SetPenWidth(matchRlt, 3);
m_textSys->SetPenColor(matchRlt, m_textSys->GetColorRef(0, 255, 0));
m_display->AddObject(matchRlt, LPVPatDrawFlags::LPVPatDrawBoundingRect);
} }
if (!rltStr.isEmpty()) }
if (bRlt)
{
m_textSys->SetFontColor(m_text, m_textSys->GetColorRef(0, 255, 0));
tittleStr = QString("Match successful! Total level Count: %1").arg(resultsMap.keys().length());
}
else
{ {
//m_display->AddObject(rltStr, 0); m_textSys->SetFontColor(m_text, m_textSys->GetColorRef(255, 0, 0));
tittleStr = QString("Match failed! Total level Count: %1").arg(resultsMap.keys().length());
} }
textStream << tittleStr.toStdString();
textStream << rltStr.toStdString();
m_text->Text = textStream.str().c_str();
m_display->AddObject(m_text,0);
} }
void CategoryMatcher::saveResultsImage(const QString& filePath) void CategoryMatcher::saveResultsImage(const QString& filePath)

@ -48,7 +48,7 @@ public:
~CategoryMatcher(); ~CategoryMatcher();
bool smokeMatch(const QString& typeNo, ILImagePtr image, int id); bool smokeMatch(const QString& typeNo, ILImagePtr image, int id);
void saveResultsImage(const QString& filePath); void saveResultsImage(const QString& filePath);
bool smokeMatch(const QString& typeNo, const cv::Mat& inputMat, cv::Mat& rltMat);
//signals: //signals:
// void sgMatchRlt(bool bRlt, cv::Mat imgRltMat); // void sgMatchRlt(bool bRlt, cv::Mat imgRltMat);
@ -57,18 +57,20 @@ private:
void setILMatch(const MatchParam& matchParam); void setILMatch(const MatchParam& matchParam);
bool getTemplateImgFileInfo(const QString& folderPath, TemplateObject& templateObject); bool getTemplateImgFileInfo(const QString& folderPath, TemplateObject& templateObject);
bool smokeMatch(const QString& type, const ILImagePtr ilImgPtr, bool smokeMatch(const QString& type, const ILImagePtr ilImgPtr,
std::pair<int, QVector<ILMatchResultPtr> >& templateLevelAndvecMatchRltPtr, int id); QMap<int, ILMatchResultPtr>&, int id);
void drawImage(const cv::Mat& imgMatSrc, cv::Mat& resulQImg, void drawImage(const cv::Mat& imgMatSrc, cv::Mat& resulQImg,
std::pair<int, QVector<ILMatchResultPtr>> templateLevelAndvecMatchRltPtr); std::pair<int, QVector<ILMatchResultPtr>> templateLevelAndvecMatchRltPtr);
void drawImage(ILImagePtr image, std::pair<int, QVector<ILMatchResultPtr>> templateLevelAndvecMatchRltPtr); void drawImage(ILImagePtr image, QMap<int, ILMatchResultPtr> resultsMap);
MatchParam m_matchParam; MatchParam m_matchParam;
ILMatchPtr m_ilmatch; ILMatchPtr m_ilmatch;
ILMatchPtr m_ilmatchF; ILMatchPtr m_ilmatchF;
ILDisplayPtr m_display; ILDisplayPtr m_display;
ILTextPtr m_text;
ILSystemPtr m_textSys;
QMutex m_mutex; QMutex m_mutex;
bool m_bUseTotalThresh{ false }; bool m_bUseTotalThresh{ false };
}; };

@ -175,8 +175,8 @@ void SmokeBoxIdentification::saveImage(ILImagePtr image, const cv::Mat& imgMat3D
QFile::remove(pclPath); QFile::remove(pclPath);
} }
QFile::copy("C:\\Users\\LENOVO\\Downloads\\30t.pcd",pclPath); //QFile::copy("C:\\Users\\LENOVO\\Downloads\\30t.pcd",pclPath);
//QFile::rename(".\\Cache\\1.pcd", pclPath); QFile::rename(".\\Cache\\1.pcd", pclPath);
qDebug() << "Save 3D image: " << filePath; qDebug() << "Save 3D image: " << filePath;
} }
@ -436,6 +436,7 @@ void SmokeBoxIdentification::calculate(int stocketID)
str = QString("[%1]:Camera %2 Match successful!").arg(stocket.id).arg(imgInfo.cameraSn); str = QString("[%1]:Camera %2 Match successful!").arg(stocket.id).arg(imgInfo.cameraSn);
qDebug() << str; qDebug() << str;
bRlt = true; bRlt = true;
m_stocketList[stocketID].smokeTypeNumRlt = typeNum;
FileInfo fileInfo = imgInfo.saveImgInfo; FileInfo fileInfo = imgInfo.saveImgInfo;
QString fileName = QString("%1_%2_rlt%3").arg(fileInfo.strId) QString fileName = QString("%1_%2_rlt%3").arg(fileInfo.strId)
.arg(m_currtStockCheckInfo.smokeTypeNum).arg(fileInfo.suffix); .arg(m_currtStockCheckInfo.smokeTypeNum).arg(fileInfo.suffix);
@ -445,7 +446,7 @@ void SmokeBoxIdentification::calculate(int stocketID)
//根据相机编号对应找到3D基准文件去计算层高 //根据相机编号对应找到3D基准文件去计算层高
QString pclPath = filePath; QString pclPath = dataSaveFolder;
pclPath.append(QString("*.pcd").arg(fileInfo.strId)); pclPath.append(QString("*.pcd").arg(fileInfo.strId));
QDir dir(pclPath); QDir dir(pclPath);
@ -479,6 +480,9 @@ void SmokeBoxIdentification::calculate(int stocketID)
{ {
str = QString("[%1]:Camera %2 Match Failed!").arg(stocket.id).arg(imgInfo.cameraSn); str = QString("[%1]:Camera %2 Match Failed!").arg(stocket.id).arg(imgInfo.cameraSn);
qWarning() << str; qWarning() << str;
QString filePath = dataSaveFolder + QString("\\%1_error.PNG")
.arg(stocket.smokeTypeNum);
m_pCategoryMatcher->saveResultsImage(filePath);
} }
} }
else else
@ -489,22 +493,15 @@ void SmokeBoxIdentification::calculate(int stocketID)
} }
if (!bRlt) if (!bRlt)
{ {
QString filePath = dataSaveFolder + QString("\\%1_error.PNG") m_stocketList[stocketID].smokeTypeNumRlt = "0";
.arg(stocket.smokeTypeNum); m_stocketList[stocketID].smokeQuantityRlt = "0";
m_pCategoryMatcher->saveResultsImage(filePath);
//saveImage(imgRltMat, filePath);
} }
QString typeNumRlt = bRlt ? typeNum : "0";
m_stocketList[stocketID].smokeTypeNumRlt = typeNumRlt;
qInfo() << "smokeQuantity = " << m_stocketList[stocketID].smokeQuantity;
if (!bRlt || m_stocketList[stocketID].smokeQuantity!= m_stocketList[stocketID].smokeQuantityRlt) if (!bRlt || m_stocketList[stocketID].smokeQuantity!= m_stocketList[stocketID].smokeQuantityRlt)
{ {
m_stocketList[stocketID].correctness = false; m_stocketList[stocketID].correctness = false;
} }
sendResults(MsgType::StockCheckResult,stocketID); sendResults(MsgType::StockCheckResult,stocketID);
//emit sgCategoryMatchFinished(typeNumRlt);
}); });
} }
@ -624,6 +621,8 @@ void SmokeBoxIdentification::sendResults(int mode, int id)
.append(m_stocketList.value(id).smokeQuantityRlt).append(SPLIT_RULE) .append(m_stocketList.value(id).smokeQuantityRlt).append(SPLIT_RULE)
.append(QString::number(m_stocketList.value(id).correctness)).append(END_SYMBOL); .append(QString::number(m_stocketList.value(id).correctness)).append(END_SYMBOL);
m_stocketList.remove(id); m_stocketList.remove(id);
qInfo() << "m_stocketList.remove(id) = " << id <<"; Next ="<<m_stocketList.size();
break; break;
default: default:
break; break;

Loading…
Cancel
Save