From e901966409d6f96dd88cd0c3f4c0e5c25d7d6091 Mon Sep 17 00:00:00 2001 From: "15089880081@163.com" <15089880081@163.com> Date: Fri, 24 May 2024 18:05:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E4=BA=86=E6=80=9D=E7=A7=91?= =?UTF-8?q?=E7=AE=97=E6=B3=95=EF=BC=8C=E8=BF=9E=E6=8E=A5=E4=B8=8A=E4=BA=86?= =?UTF-8?q?=E5=AD=98=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HanddleAI/HandleAiUi-new/CMakeLists.txt | 12 +- .../HandleAiUi-new/algo/ALGO_Correction.h | 181 +++ .../HandleAiUi-new/algo/ALGO_Inspection.h | 279 +++++ .../algo/{pinAioEvalute.h => ALGO_Test.h} | 6 +- HanddleAI/HandleAiUi-new/algo/algo.zip | Bin 0 -> 11464 bytes .../HandleAiUi-new/algo/algorithmThread.cpp | 898 -------------- .../HandleAiUi-new/algo/algorithmThread.h | 1092 ----------------- HanddleAI/HandleAiUi-new/algo/simpleAlgo.h | 694 +++++++++++ .../HandleAiUi-new/back/backEndManager.cpp | 8 +- .../HandleAiUi-new/back/backEndManager.h | 7 + .../HandleAiUi-new/back/cameraManager.cpp | 12 +- .../back/imgSaveThreadManager.cpp | 7 + .../back/imgSaveThreadManager.h | 77 +- .../HandleAiUi-new/back/threadPoolManager.cpp | 87 +- .../HandleAiUi-new/back/threadPoolManager.h | 81 +- .../HandleAiUi-new/back/triggerManager.cpp | 8 +- ...{sqliteReader.cpp => sqlControlWidget.cpp} | 62 +- .../front/pages/sqlControlWidget.h | 29 +- .../HandleAiUi-new/front/pages/sqliteReader.h | 27 - .../{sqliteManager => sqlManager}/sqlBase.h | 0 .../HandleAiUi-new/sqlManager/sqlManager.cpp | 181 +++ .../sqlManager.h | 17 +- .../{sqliteManager => sqlManager}/sqlStruct.h | 0 .../sqliteModule.cpp | 2 +- .../sqliteModule.h | 0 .../sqliteManager/sqlManager.cpp | 409 ------ .../uiModule/uiModule_dumpToExcel.h | 2 +- .../uiModule/uiModule_imageView.h | 6 +- lib/Hd_3DCameraLMI_module_PointLazer.exp | Bin 784 -> 772 bytes lib/Hd_3DCameraLMI_module_PointLazer.lib | Bin 2276 -> 2276 bytes lib/Hd_DalsaCamera_module.exp | Bin 763 -> 751 bytes lib/Hd_DalsaCamera_module.lib | Bin 2120 -> 2120 bytes lib/Hd_FinsTcp_module.exp | Bin 755 -> 743 bytes lib/Hd_FinsTcp_module.lib | Bin 2064 -> 2064 bytes lib/Hd_MvCamera_module_GENTL.exp | Bin 768 -> 756 bytes lib/Hd_MvCamera_module_GENTL.lib | Bin 2164 -> 2164 bytes lib/Hd_MvCamera_module_GIGE.exp | Bin 767 -> 755 bytes lib/Hd_MvCamera_module_GIGE.lib | Bin 2148 -> 2148 bytes lib/Hd_ResultsSummary_module.exp | Bin 768 -> 756 bytes lib/Hd_ResultsSummary_module.lib | Bin 2164 -> 2164 bytes lib/Hd_SocketModule_ModbusTcp.exp | Bin 1513 -> 1501 bytes lib/Hd_SocketModule_ModbusTcp.lib | Bin 3446 -> 3446 bytes 42 files changed, 1592 insertions(+), 2592 deletions(-) create mode 100644 HanddleAI/HandleAiUi-new/algo/ALGO_Correction.h create mode 100644 HanddleAI/HandleAiUi-new/algo/ALGO_Inspection.h rename HanddleAI/HandleAiUi-new/algo/{pinAioEvalute.h => ALGO_Test.h} (95%) create mode 100644 HanddleAI/HandleAiUi-new/algo/algo.zip delete mode 100644 HanddleAI/HandleAiUi-new/algo/algorithmThread.cpp delete mode 100644 HanddleAI/HandleAiUi-new/algo/algorithmThread.h create mode 100644 HanddleAI/HandleAiUi-new/algo/simpleAlgo.h rename HanddleAI/HandleAiUi-new/front/pages/{sqliteReader.cpp => sqlControlWidget.cpp} (79%) delete mode 100644 HanddleAI/HandleAiUi-new/front/pages/sqliteReader.h rename HanddleAI/HandleAiUi-new/{sqliteManager => sqlManager}/sqlBase.h (100%) create mode 100644 HanddleAI/HandleAiUi-new/sqlManager/sqlManager.cpp rename HanddleAI/HandleAiUi-new/{sqliteManager => sqlManager}/sqlManager.h (64%) rename HanddleAI/HandleAiUi-new/{sqliteManager => sqlManager}/sqlStruct.h (100%) rename HanddleAI/HandleAiUi-new/{sqliteManager => sqlManager}/sqliteModule.cpp (99%) rename HanddleAI/HandleAiUi-new/{sqliteManager => sqlManager}/sqliteModule.h (100%) delete mode 100644 HanddleAI/HandleAiUi-new/sqliteManager/sqlManager.cpp diff --git a/HanddleAI/HandleAiUi-new/CMakeLists.txt b/HanddleAI/HandleAiUi-new/CMakeLists.txt index 982a541e..af0370f7 100644 --- a/HanddleAI/HandleAiUi-new/CMakeLists.txt +++ b/HanddleAI/HandleAiUi-new/CMakeLists.txt @@ -49,10 +49,12 @@ FILE(GLOB UIMODULE_HEAD_FILES "./uiModule/*.h" ) FILE(GLOB UIMODULE_SRC_FILES "./uiModule/*.cpp") FILE(GLOB BACK_HEAD_FILES "./back/*.h" ) FILE(GLOB BACK_SRC_FILES "./back/*.cpp") +FILE(GLOB FRONT_PAGES_HEAD_FILES "./front/pages/*.h" ) +FILE(GLOB FRONT_PAGES_SRC_FILES "./front/pages/*.cpp") FILE(GLOB FRONT_HEAD_FILES "./front/*.h" ) FILE(GLOB FRONT_SRC_FILES "./front/*.cpp") -FILE(GLOB SQL_HEAD_FILES "./sqliteManager/*.h" ) -FILE(GLOB SQL_SRC_FILES "./sqliteManager/*.cpp") +FILE(GLOB SQL_HEAD_FILES "./sqlManager/*.h" ) +FILE(GLOB SQL_SRC_FILES "./sqlManager/*.cpp") FILE(GLOB TCP_HEAD_FILES "./TCP/*.h" ) FILE(GLOB TCP_SRC_FILES "./TCP/*.cpp") FILE(GLOB HEAD_FILES "./*.h" ) @@ -69,6 +71,8 @@ if(ANDROID) ${SRC_FILES} ${BACK_HEAD_FILES} ${BACK_SRC_FILES} + ${FRONT_PAGES_HEAD_FILES} + ${FRONT_PAGES_SRC_FILES} ${FRONT_HEAD_FILES} ${FRONT_SRC_FILES} ${SQL_HEAD_FILES} @@ -90,6 +94,8 @@ else() ${SRC_FILES} ${BACK_HEAD_FILES} ${BACK_SRC_FILES} + ${FRONT_PAGES_HEAD_FILES} + ${FRONT_PAGES_SRC_FILES} ${FRONT_HEAD_FILES} ${FRONT_SRC_FILES} ${SQL_HEAD_FILES} @@ -109,6 +115,8 @@ else() ${SRC_FILES} ${BACK_HEAD_FILES} ${BACK_SRC_FILES} + ${FRONT_PAGES_HEAD_FILES} + ${FRONT_PAGES_SRC_FILES} ${FRONT_HEAD_FILES} ${FRONT_SRC_FILES} ${SQL_HEAD_FILES} diff --git a/HanddleAI/HandleAiUi-new/algo/ALGO_Correction.h b/HanddleAI/HandleAiUi-new/algo/ALGO_Correction.h new file mode 100644 index 00000000..48210560 --- /dev/null +++ b/HanddleAI/HandleAiUi-new/algo/ALGO_Correction.h @@ -0,0 +1,181 @@ +#include +#include +void ALGO_Correction(std::shared_ptr data) +{ + if (data->correctionData == nullptr) + return; +#pragma region XOY_DEFINE + HTuple hv_in_X_X0Y; + for (auto rangeData : data->correctionData->in_X_X0Y) + hv_in_X_X0Y.Append(rangeData); + + HTuple hv_in_Y_X0Y; + for (auto rangeData : data->correctionData->in_Y_X0Y) + hv_in_Y_X0Y.Append(rangeData); + + HTuple hv_in_Z_X0Y; + for (auto rangeData : data->correctionData->in_Z_X0Y) + hv_in_Z_X0Y.Append(rangeData); + + HTuple hv_in_Z_X0Y_Value; + for (auto rangeData : data->correctionData->in_Z_X0Y_Value) + hv_in_Z_X0Y_Value.Append(rangeData); +#pragma endregion + +#pragma region XOZ_DEFINE + HTuple hv_in_X_X0Z; + for (auto rangeData : data->correctionData->in_X_X0Z) + hv_in_X_X0Z.Append(rangeData); + + HTuple hv_in_Y_X0Z; + for (auto rangeData : data->correctionData->in_Y_X0Z) + hv_in_Y_X0Z.Append(rangeData); + + HTuple hv_in_Z_X0Z; + for (auto rangeData : data->correctionData->in_Z_X0Z) + hv_in_Z_X0Z.Append(rangeData); + + HTuple hv_in_Y_X0Z_Value; + for (auto rangeData : data->correctionData->in_Y_X0Z_Value) + hv_in_Y_X0Z_Value.Append(rangeData); +#pragma endregion + +#pragma region YOZ_DEFINE + HTuple hv_in_X_Y0Z; + for (auto rangeData : data->correctionData->in_X_Y0Z) + hv_in_X_Y0Z.Append(rangeData); + + HTuple hv_in_Y_Y0Z; + for (auto rangeData : data->correctionData->in_Y_Y0Z) + hv_in_Y_Y0Z.Append(rangeData); + + HTuple hv_in_Z_Y0Z; + for (auto rangeData : data->correctionData->in_Z_Y0Z) + hv_in_Z_Y0Z.Append(rangeData); + + HTuple hv_in_X_Y0Z_Value; + for (auto rangeData : data->correctionData->in_X_Y0Z_Value) + hv_in_X_Y0Z_Value.Append(rangeData); +#pragma endregion + + HTuple hv_out_Origin; + HTuple hv_out_Result_X; + HTuple hv_out_Result_Y; + HTuple hv_out_Result_Z; + HTuple hv_out_AngleZX; + HTuple hv_out_AngleYZ; + HTuple hv_out_AngleXY; + HTuple hv_out_Flag; + halcon_Correction( + hv_in_X_X0Y, hv_in_Y_X0Y, hv_in_Z_X0Y, hv_in_Z_X0Y_Value, + hv_in_X_X0Z, hv_in_Y_X0Z, hv_in_Z_X0Z, hv_in_Y_X0Z_Value, + hv_in_X_Y0Z, hv_in_Y_Y0Z, hv_in_Z_Y0Z, hv_in_X_Y0Z_Value, + &hv_out_Origin, &hv_out_Result_X, &hv_out_Result_Y, &hv_out_Result_Z, + &hv_out_AngleZX, &hv_out_AngleYZ, &hv_out_AngleXY, &hv_out_Flag); + + int ok_Flag = 0; + std::vectorout_Origin; + std::vectorout_Result_X; + std::vectorout_Result_Y; + std::vectorout_Result_Z; + double out_AngleZX; + double out_AngleYZ; + double out_AngleXY; + + if (hv_out_Flag.Length() == 1) + if (hv_out_Flag[0].D() == 1) + { + if (hv_out_Origin.Length() == 3) + { + out_Origin = { hv_out_Origin[0].D(),hv_out_Origin[1].D(), hv_out_Origin[2].D() }; + ok_Flag++; + } + if (hv_out_Result_X.Length() == 3) + { + out_Result_X = { hv_out_Result_X[0].D(),hv_out_Result_X[1].D(), hv_out_Result_X[2].D() }; + ok_Flag++; + } + if (hv_out_Result_Y.Length() == 3) + { + out_Result_Y = { hv_out_Result_Y[0].D(),hv_out_Result_Y[1].D(), hv_out_Result_Y[2].D() }; + ok_Flag++; + } + if (hv_out_Result_Z.Length() == 3) + { + out_Result_Z = { hv_out_Result_Z[0].D(),hv_out_Result_Z[1].D(), hv_out_Result_Z[2].D() }; + ok_Flag++; + } + if (hv_out_AngleZX.Length() == 1) + { + out_AngleZX = hv_out_AngleZX[0].D(); + ok_Flag++; + } + if (hv_out_AngleYZ.Length() == 1) + { + out_AngleYZ = hv_out_AngleYZ[0].D(); + ok_Flag++; + } + if (hv_out_AngleXY.Length() == 1) + { + out_AngleXY = hv_out_AngleXY[0].D(); + ok_Flag++; + } + } + else + { + std::cout << "error"; + } + + if (ok_Flag != 7) + { + //qDebug() + return; + } + + int pValueBounus = 100; + //originX + data->writeBack("short", 310, QString::number(out_Origin[0] < 0 ? 2 : 1)); + data->writeBack("short", 311, QString::number(abs(static_cast(out_Origin[0])))); + double pvalue = out_Origin[0] - static_cast(out_Origin[0]); + data->writeBack("short", 312, QString::number(abs(pvalue * pValueBounus))); + //originY + data->writeBack("short", 313, QString::number(out_Origin[1] < 0 ? 2 : 1)); + data->writeBack("short", 314, QString::number(abs(static_cast(out_Origin[1])))); + pvalue = out_Origin[1] - static_cast(out_Origin[1]); + data->writeBack("short", 315, QString::number(abs(pvalue * pValueBounus))); + //originZ + data->writeBack("short", 316, QString::number(out_Origin[2] < 0 ? 2 : 1)); + data->writeBack("short", 317, QString::number(abs(static_cast(out_Origin[2])))); + pvalue = out_Origin[2] - static_cast(out_Origin[2]); + data->writeBack("short", 318, QString::number(abs(pvalue * pValueBounus))); + //originX1 + data->writeBack("short", 319, QString::number(out_Result_X[0] < 0 ? 2 : 1)); + data->writeBack("short", 320, QString::number(abs(static_cast(out_Result_X[0])))); + pvalue = out_Result_X[0] - static_cast(out_Result_X[0]); + data->writeBack("short", 321, QString::number(abs(pvalue * pValueBounus))); + //originX2 + data->writeBack("short", 322, QString::number(out_Result_X[1] < 0 ? 2 : 1)); + data->writeBack("short", 323, QString::number(abs(static_cast(out_Result_X[1])))); + pvalue = out_Result_X[1] - static_cast(out_Result_X[1]); + data->writeBack("short", 324, QString::number(abs(pvalue * pValueBounus))); + //originX3 + data->writeBack("short", 325, QString::number(out_Result_X[2] < 0 ? 2 : 1)); + data->writeBack("short", 326, QString::number(abs(static_cast(out_Result_X[2])))); + pvalue = out_Result_X[2] - static_cast(out_Result_X[2]); + data->writeBack("short", 327, QString::number(abs(pvalue * pValueBounus))); + //originY1 + data->writeBack("short", 328, QString::number(out_Result_Y[0] < 0 ? 2 : 1)); + data->writeBack("short", 329, QString::number(abs(static_cast(out_Result_Y[0])))); + pvalue = out_Result_Y[0] - static_cast(out_Result_Y[0]); + data->writeBack("short", 330, QString::number(abs(pvalue * pValueBounus))); + //originY2 + data->writeBack("short", 331, QString::number(out_Result_Y[1] < 0 ? 2 : 1)); + data->writeBack("short", 332, QString::number(abs(static_cast(out_Result_Y[1])))); + pvalue = out_Result_Y[1] - static_cast(out_Result_Y[1]); + data->writeBack("short", 333, QString::number(abs(pvalue * pValueBounus))); + //originY3 + data->writeBack("short", 334, QString::number(out_Result_Y[2] < 0 ? 2 : 1)); + data->writeBack("short", 335, QString::number(abs(static_cast(out_Result_Y[2])))); + pvalue = out_Result_Y[2] - static_cast(out_Result_Y[2]); + data->writeBack("short", 336, QString::number(abs(pvalue * pValueBounus))); +} \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/algo/ALGO_Inspection.h b/HanddleAI/HandleAiUi-new/algo/ALGO_Inspection.h new file mode 100644 index 00000000..8730bfa2 --- /dev/null +++ b/HanddleAI/HandleAiUi-new/algo/ALGO_Inspection.h @@ -0,0 +1,279 @@ +#include +#include +static HalconCpp::HObject MatToHObject(cv::Mat& image) +{ + HalconCpp::HObject Hobj; + int hgt = image.rows; + int wid = image.cols; + int i; + if (image.type() == CV_8UC3) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + std::vector imgchannel; + split(image, imgchannel); + cv::Mat imgB = imgchannel[0]; + cv::Mat imgG = imgchannel[1]; + cv::Mat imgR = imgchannel[2]; + uchar* dataR = new uchar[hgt * wid]; + uchar* dataG = new uchar[hgt * wid]; + uchar* dataB = new uchar[hgt * wid]; + for (i = 0; i < hgt; i++) + { + memcpy(dataR + wid * i, imgR.data + imgR.step * i, wid); + memcpy(dataG + wid * i, imgG.data + imgG.step * i, wid); + memcpy(dataB + wid * i, imgB.data + imgB.step * i, wid); + } + himage.GenImage3("byte", wid, hgt, dataR, dataG, dataB); + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPtR, * hImgPtG, * hImgPtB; + himage.GetImagePointer3(&hImgPtR, &hImgPtG, &hImgPtB, &tmpType, &tmpW, &tmpH); + + GenImage3(&Hobj, "byte", wid, hgt, (Hlong)hImgPtR, (Hlong)hImgPtG, (Hlong)hImgPtB); + delete[]dataR; + delete[]dataG; + delete[]dataB; + dataR = NULL; + dataG = NULL; + dataB = NULL; + } + else if (image.type() == CV_8UC1) + { + //HalconCpp::HImage himage = HalconCpp::HImage(); + + ////uchar* data = new uchar[hgt * wid]; + ////for (i = 0; i < hgt; i++) + ////{ + //// memcpy(data + wid * i, image.data + image.step * i, wid); + ////} + ////gen_image_const + //himage.GenImage1("byte", wid, hgt, image.data); + + //HalconCpp::HString tmpType; + //Hlong tmpW, tmpH; + //void* hImgPt; + //hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + //GenImage1(&Hobj, "byte", wid, hgt, (Hlong)hImgPt); + GenImage1(&Hobj, "byte", wid, hgt, (Hlong)image.data); + + /* delete[] data; + data = NULL;*/ + + } + else if (image.type() == CV_16UC1) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + ushort* data = new ushort[hgt * wid * 2]; + + memcpy(data, image.data, hgt * wid * 2); + + + himage.GenImage1("uint2", wid, hgt, data); + + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPt; + hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + GenImage1(&Hobj, "uint2", wid, hgt, (Hlong)hImgPt); + + delete[] data; + data = NULL; + + } + else if (image.type() == CV_16SC1) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + short* data = new short[hgt * wid * 2]; + + memcpy(data, image.data, hgt * wid * 2); + + + himage.GenImage1("int2", wid, hgt, data); + + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPt; + hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + GenImage1(&Hobj, "int2", wid, hgt, (Hlong)hImgPt); + + delete[] data; + data = NULL; + + } + + return Hobj; +} +static void MatToHObjectV(cv::Mat& image, HalconCpp::HObject& Hobj) +{ + int hgt = image.rows; + int wid = image.cols; + int i; + if (image.type() == CV_8UC3) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + std::vector imgchannel; + split(image, imgchannel); + cv::Mat imgB = imgchannel[0]; + cv::Mat imgG = imgchannel[1]; + cv::Mat imgR = imgchannel[2]; + uchar* dataR = new uchar[hgt * wid]; + uchar* dataG = new uchar[hgt * wid]; + uchar* dataB = new uchar[hgt * wid]; + for (i = 0; i < hgt; i++) + { + memcpy(dataR + wid * i, imgR.data + imgR.step * i, wid); + memcpy(dataG + wid * i, imgG.data + imgG.step * i, wid); + memcpy(dataB + wid * i, imgB.data + imgB.step * i, wid); + } + himage.GenImage3("byte", wid, hgt, dataR, dataG, dataB); + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPtR, * hImgPtG, * hImgPtB; + himage.GetImagePointer3(&hImgPtR, &hImgPtG, &hImgPtB, &tmpType, &tmpW, &tmpH); + + GenImage3(&Hobj, "byte", wid, hgt, (Hlong)hImgPtR, (Hlong)hImgPtG, (Hlong)hImgPtB); + delete[]dataR; + delete[]dataG; + delete[]dataB; + dataR = NULL; + dataG = NULL; + dataB = NULL; + } + else if (image.type() == CV_8UC1) + { + //HalconCpp::HImage himage = HalconCpp::HImage(); + + ////uchar* data = new uchar[hgt * wid]; + ////for (i = 0; i < hgt; i++) + ////{ + //// memcpy(data + wid * i, image.data + image.step * i, wid); + ////} + ////gen_image_const + //himage.GenImage1("byte", wid, hgt, image.data); + + //HalconCpp::HString tmpType; + //Hlong tmpW, tmpH; + //void* hImgPt; + //hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + //GenImage1(&Hobj, "byte", wid, hgt, (Hlong)hImgPt); + GenImage1(&Hobj, "byte", wid, hgt, (Hlong)image.data); + + /* delete[] data; + data = NULL;*/ + + } + else if (image.type() == CV_16UC1) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + ushort* data = new ushort[hgt * wid * 2]; + + memcpy(data, image.data, hgt * wid * 2); + + + himage.GenImage1("uint2", wid, hgt, data); + + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPt; + hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + GenImage1(&Hobj, "uint2", wid, hgt, (Hlong)hImgPt); + + delete[] data; + data = NULL; + + } + else if (image.type() == CV_16SC1) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + short* data = new short[hgt * wid * 2]; + + memcpy(data, image.data, hgt * wid * 2); + + + himage.GenImage1("int2", wid, hgt, data); + + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPt; + hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + GenImage1(&Hobj, "int2", wid, hgt, (Hlong)hImgPt); + + delete[] data; + data = NULL; + + } + +} +void ALGO_Inspection(std::shared_ptr data) +{ + if (data->oriImgs.size() < 1) + { + qDebug() << __FUNCDNAME__ << __LINE__ << "camera Mat size is Error!"; + return; + } + //hv_in_Parameter + //[0]-产品种类; 1A正面 2A反面 3B正面 4C正面 + //[1]-图像序号第一位; + //[2]-图像序号第二位; + //[3]-3d相机精度(mm); + //[4]-ping针偏移判NG阈值(mm); + //[5]-切图存图开关 +#pragma region halcon变量定义 + //测量 + HObject ho_in_Image; + HObject ho_in_Image2; + HTuple hv_in_ShapePath; + HTuple hv_in_Parameter; + HTuple hv_out_Pings_X; + HTuple hv_out_Pings_Y; + HTuple hv_out_NG_Pings_X; + HTuple hv_out_NG_Pings_Y; + HTuple hv_out_Pings_Num; + HTuple hv_out_NG_Pings_Num; + HTuple hv_out_Flag_INS; + + //ROI + HTuple hv_out_ROI_Value; + HTuple hv_out_Flag_ROI; +#pragma endregion + + cv::Mat mat = cv::imread("C://NHMJDHNN78474-5_1-ASR1006X20240320-150822.BMP", -1); + ho_in_Image = MatToHObject(mat); + MatToHObjectV(mat, ho_in_Image); + hv_in_Parameter.Append(3); + hv_in_Parameter.Append(5); + hv_in_Parameter.Append(1); + hv_in_Parameter.Append(0.0135); + hv_in_Parameter.Append(0.2); + hv_in_Parameter.Append(2); + + hv_in_ShapePath = "./halconModel"; + + + Pings_Inspection(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_Pings_X, + &hv_out_Pings_Y, &hv_out_NG_Pings_X, &hv_out_NG_Pings_Y, &hv_out_Pings_Num, + &hv_out_NG_Pings_Num, &hv_out_Flag_INS); + + Pings_ROI(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_ROI_Value, &hv_out_Flag_ROI); + std::vectorResult; + for (int i = 0; i < hv_out_ROI_Value.Length() / 4; i++) + { + Result.push_back( + cv::Rect( + hv_out_ROI_Value[i * 4 + 1].D(), + hv_out_ROI_Value[i * 4].D(), + hv_out_ROI_Value[i * 4 + 3].D() - hv_out_ROI_Value[i * 4 + 1].D(), + hv_out_ROI_Value[i * 4 + 2].D() - hv_out_ROI_Value[i * 4].D() + )); + } + cv::Mat Paint; + cvtColor(mat, Paint, cv::COLOR_GRAY2BGR); + rectangle(Paint, Result[0], cv::Scalar(0, 0, 255), 4); + _sleep(100); +} \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/algo/pinAioEvalute.h b/HanddleAI/HandleAiUi-new/algo/ALGO_Test.h similarity index 95% rename from HanddleAI/HandleAiUi-new/algo/pinAioEvalute.h rename to HanddleAI/HandleAiUi-new/algo/ALGO_Test.h index 66def2e4..23fe1a83 100644 --- a/HanddleAI/HandleAiUi-new/algo/pinAioEvalute.h +++ b/HanddleAI/HandleAiUi-new/algo/ALGO_Test.h @@ -3,7 +3,7 @@ void pinAioEvalute(std::shared_ptr data) { auto start_time = std::chrono::high_resolution_clock::now(); - if (data->imgs.size() < 1) + if (data->oriImgs.size() < 1) { qDebug() << __FUNCDNAME__ << __LINE__ << "camera Mat size is Error!"; return; @@ -18,9 +18,9 @@ void pinAioEvalute(std::shared_ptr data) double pixAccX = 0.013502052, pixAccY = 0.014005423575; double camera1Width = 1, camera1Height = 2; QFuture future1; - if (data->imgs.size() == 1) + if (data->oriImgs.size() == 1) { - src = data->imgs[0]; + src = data->oriImgs[0]; if (Paint.channels() == 1) cv::cvtColor(src, Paint, cv::COLOR_GRAY2BGR); else diff --git a/HanddleAI/HandleAiUi-new/algo/algo.zip b/HanddleAI/HandleAiUi-new/algo/algo.zip new file mode 100644 index 0000000000000000000000000000000000000000..ff411e379513b4f9fca9819225bb9ddacc0f286e GIT binary patch literal 11464 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 literal 0 HcmV?d00001 diff --git a/HanddleAI/HandleAiUi-new/algo/algorithmThread.cpp b/HanddleAI/HandleAiUi-new/algo/algorithmThread.cpp deleted file mode 100644 index 4e0ccd13..00000000 --- a/HanddleAI/HandleAiUi-new/algo/algorithmThread.cpp +++ /dev/null @@ -1,898 +0,0 @@ -锘�#include -#include "FrontendBackendBridge.h" -#include - -#include -#include -#include -#include -#include -bool showOk = true;//鏄剧ずok缂洪櫡鐨勬 -std::string fileSavePath("D://CCD//"); -////////////////////// -std::vector rotateRect(const cv::Rect& rect, const cv::Point2f& center, double angle) { - // 鏋勫缓鐭╁舰鐨勫洓涓鐐� - std::vector corners(4); - corners[0] = cv::Point2f(rect.x, rect.y); - corners[1] = cv::Point2f(rect.x + rect.width, rect.y); - corners[2] = cv::Point2f(rect.x + rect.width, rect.y + rect.height); - corners[3] = cv::Point2f(rect.x, rect.y + rect.height); - - // 鍒涘缓鏃嬭浆鐭╅樀 - cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, 1.0); - - // 瀵规瘡涓鐐瑰簲鐢ㄦ棆杞彉鎹� - std::vector rotatedCorners(4); - for (int i = 0; i < 4; ++i) { - cv::Mat pointMat = (cv::Mat_(3, 1) << corners[i].x, corners[i].y, 1); - cv::Mat rotatedPoint = rotationMatrix * pointMat; - rotatedCorners[i] = cv::Point2f(rotatedPoint.at(0, 0), rotatedPoint.at(1, 0)); - } - - return rotatedCorners; -} -double calculateAngleWithXAxis(const cv::Point& p1, const cv::Point& p2) { - // 璁$畻涓ょ偣鐨勫潗鏍囧樊寮� - double dx = p2.x - p1.x; - double dy = p2.y - p1.y; - - // 浣跨敤鍙嶆鍒囧嚱鏁拌绠楄搴� - double angle = std::atan2(dy, dx) * 180 / CV_PI; - - // 纭繚瑙掑害鍦� 0 鍒� 360 搴︿箣闂� - if (angle < 0) { - angle += 360; - } - - return angle; -} -void rotateImage(const cv::Mat& src, double angle, cv::Mat& dst) { - // 鍥惧儚涓績浣滀负鏃嬭浆涓績 - cv::Point2f center(static_cast(src.cols / 2), static_cast(src.rows / 2)); - - // 璁$畻鏃嬭浆鐭╅樀 - cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0); - - // 搴旂敤鏃嬭浆 - cv::warpAffine(src, dst, rot, src.size()); -} -double calculateDistance(const cv::Point& p1, const cv::Point& p2) { - // 璁$畻璺濈 - double distance = std::sqrt(std::pow(p2.x - p1.x, 2) + std::pow(p2.y - p1.y, 2)); - return distance; -} -//std::vector> fitLines(const std::vector& points, double length) { -// // 杩涜澶氳竟褰㈡嫙鍚� -// std::vector approxCurve; -// cv::approxPolyDP(points, approxCurve, length, true); -// -// std::vector> lines; -// -// // 浠庢嫙鍚堝悗鐨勫杈瑰舰涓彁鍙栫洿绾挎 -// for (size_t i = 0; i < approxCurve.size(); ++i) { -// cv::Point p1 = approxCurve[i]; -// cv::Point p2 = approxCurve[(i + 1) % approxCurve.size()]; -// -// lines.push_back(std::make_pair(p1, p2)); -// } -// -// return lines; -//} - -std::vector> fitLines(const std::vector& points, double length) { - // 杩涜澶氳竟褰㈡嫙鍚� - std::vector approxCurve; - cv::approxPolyDP(points, approxCurve, length, true); - - std::vector> lines; - - // 鏋勫缓鍑稿寘 - std::vector convexHull; - cv::convexHull(approxCurve, convexHull); - - // 璁$畻鍑稿寘鐨勫嚑浣曚腑蹇� - cv::Point2f center(0, 0); - for (const auto& point : convexHull) { - center.x += point.x; - center.y += point.y; - } - center *= (1.0 / convexHull.size()); - - // 浠庢嫙鍚堝悗鐨勫杈瑰舰涓彁鍙栫洿绾挎锛屽苟鎺掗櫎鏂瑰悜鍚戝唴鐨勭嚎娈� - for (size_t i = 0; i < approxCurve.size(); ++i) { - cv::Point p1 = approxCurve[i]; - cv::Point p2 = approxCurve[(i + 1) % approxCurve.size()]; - - // 璁$畻绾挎鐨勪腑鐐� - cv::Point midPoint = (p1 + p2) * 0.5; - - // 璁$畻绾挎涓偣鍒板杈瑰舰鍑犱綍涓績鐨勫悜閲� - cv::Point2f centerToMid = cv::Point2f(midPoint) - center; - - // 璁$畻绾挎鏂瑰悜鍚戦噺 - cv::Point2f lineDirection = cv::Point2f(p2) - cv::Point2f(p1); - - // 璁$畻鍑稿寘娉曠嚎 - cv::Point2f normal = cv::Point2f(-centerToMid.y, centerToMid.x); - - // 妫�鏌ョ嚎娈垫柟鍚戞槸鍚︽湞鍚戝嚫鍖呭唴閮紙涓庡嚫鍖呮硶绾挎柟鍚戠浉鍙嶏級 - if (lineDirection.dot(normal) < 0) { - lines.push_back(std::make_pair(p1, p2)); - } - } - - return lines; -} -void writeToData_xxxCsvOkNgNew(detData* rdata, QString OKNG, ngNoteCls* note) -{ - QDateTime currentDateTime = QDateTime::currentDateTime(); - std::string ymd = currentDateTime.toString("yyyy-MM-dd").toStdString(); - QString filePath = QString::fromStdString(fileSavePath + "//result//" + ymd + "//Data_" + ymd + ".csv"); - /* QString searchString = QString::fromStdString(rdata->getSN() + "_" + to_string(rdata->snCountIndex));*/ - QString searchString = QString::fromStdString(rdata->SNcode); - QFile file(filePath); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qDebug() << "Error opening file."; - } - - QStringList headers; - QList data; - - QTextStream in(&file); - while (!in.atEnd()) { - QString line = in.readLine(); - QStringList fields = line.split(','); - - if (headers.isEmpty()) { - // 濡傛灉headers涓虹┖锛屽垯褰撳墠琛屼负鏍囬琛� - headers = fields; - } - else { - data.append(fields); - } - } - - file.close(); - - // 鍦╠ata涓繘琛屽瓧绗︿覆妫�绱㈠苟淇敼鍖归厤鐨勮 - int modifiedRowCount = 0; - for (int i = data.size() - 1; i > 0; --i) { - QStringList& row = data[i]; - //if (row.size()<3||row.isEmpty()) - //{ - // break; - //} - // 鍦ㄥ綋鍓嶈涓绱㈠瓧绗︿覆 - try - { - if (row.size() >= 6) - if (row[1].contains(searchString, Qt::CaseInsensitive)) { - // 鍖归厤鍒板瓧绗︿覆锛岃繘琛屼慨鏀� - row[3] = OKNG; - row[4] += note->getNgSummaryStr(); - row[5] += note->getOkSummaryStr(); - modifiedRowCount++; - } - } - catch (...) - { - break; - } - } - - // 灏嗕慨鏀瑰悗鐨勬暟鎹啓鍥炴枃浠� - QFile writeFile(filePath); - if (!writeFile.open(QIODevice::WriteOnly | QIODevice::Text)) { - qDebug() << "Error opening file for writing."; - } - - QTextStream out(&writeFile); - // 鍐欏叆鏍囬琛� - out << headers.join(",") << "\n"; - - // 鍐欏叆淇敼鍚庣殑鏁版嵁琛� - for (const auto& row : data) { - out << row.join(",") << "\n"; - } - - writeFile.close(); - - qDebug() << "Modified rows:" << modifiedRowCount; - qDebug() << "Data modified and saved to data_modified.csv"; - - //return 0; -} -void writeToData_xxxCSVNew(detData* resData, string OKNG, ngNoteCls* note) -{ - QDateTime currentDateTime = QDateTime::currentDateTime(); - std::string ymd = currentDateTime.toString("yyyy-MM-dd").toStdString(); - int hour = currentDateTime.time().hour(); - - QString filePath = QString::fromStdString(fileSavePath + "//result//" + ymd + "//Data_" + ymd + ".csv"); - //string sn(resData->SNcode + "-" + to_string(resData->snCountIndex)); - string sn(resData->SNcode); - /*std::string str(to_string(hour) + "H//" + sn + "-" + to_string(resData->snCountIndex) + "//" + ymd - + "-" + to_string(hour) + "_" + resData->getSN() + "-" + to_string(resData->snCountIndex));*/ - std::string str(to_string(hour) + "H//" + sn + "//" + ymd - + "-" + to_string(hour) + "_" + sn); - bool fileExist = false; - QStringList dataList; - if (hour < 10) - dataList.append("0" + QString::number(hour) + "H"); - else - dataList.append(QString::number(hour) + "H"); - dataList.append(QString::fromStdString(sn)); - dataList.append(QString::fromStdString(str)); - dataList.append(QString::fromStdString(OKNG)); - dataList.append(note->getNgSummaryStr()); - dataList.append(note->getOkSummaryStr()); - // 鍒涘缓CSV鏂囦欢 - QFile file(filePath); - if (!file.exists()) - { - // 鍒涘缓鐩綍锛堝鏋滀笉瀛樺湪锛� - QDir dir; - if (!dir.mkpath(QFileInfo(filePath).absolutePath())) - { - //qWarning() << "鏃犳硶鍒涘缓鐩綍锛�" << QFileInfo(filePath).absolutePath(); - return; - } - fileExist = true; - } - // 鎵撳紑CSV鏂囦欢骞跺啓鍏ユ暟鎹� - if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { - QTextStream stream(&file); - if (fileExist == true) - { - stream << "Time,"; - stream << "SN,"; - stream << "Path,"; - stream << "Result,"; - stream << "summuryResult,"; - stream << "\n"; - } - // 灏嗘暟鎹啓鍏SV鏂囦欢 - for (const QString& data : dataList) { - stream << data << ","; - } - stream << "\n"; - - file.close(); - qDebug() << "CSV鏂囦欢鍐欏叆鎴愬姛"; - } - //else - // qWarning() << "鏃犳硶鎵撳紑CSV鏂囦欢锛�" << filePath; - -} -void algoThread::getAllFiles(string path, vector& files, string format) -{ - intptr_t hFile = 0;//鎭呯拑鏇嗘 - struct _finddata_t fileinfo;//鎭呯拑闄撴礃 - string p; - if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1) //鎭呯拑婀斿⿹ - { - do - { - if ((fileinfo.attrib & _A_SUBDIR))//鐡氬壙宀嗙榿宄堟亝鐠冩 - { - if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)//鎭呯拑妯欓潯绗㈢ゥ婕�"."鐫�".." - { - files.push_back(p.assign(path).append("\\").append(fileinfo.name)); //鎮垫箶鎭呯拑妯欓潯 - getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format); //鑿板姊㈢洩鎭呯拑妯� - } - } - else - { - files.push_back(p.assign(path).append("\\").append(fileinfo.name));//餇卞絾绁ュ矄鎭呯拑妯欍剾鎻f箶鎭呯拑闈� - } - } while (_findnext(hFile, &fileinfo) == 0); - _findclose(hFile); - } -} - -void drawContoursOverlap(cv::Mat& image, const std::vector>& contours) { - cv::Mat mask = cv::Mat::zeros(image.size(), CV_8U); - - // 缁樺埗杞粨鍦ㄦ帺鐮佷笂 - cv::drawContours(mask, contours, -1, cv::Scalar(255), cv::FILLED); - - // 灏嗗浘鍍忎腑涓庢帺鐮佷笉閲嶅彔鐨勫尯鍩熸秱榛� - cv::Mat result; - image.copyTo(result, mask); - image.setTo(cv::Scalar(0, 0, 0), ~mask); -} -void drawContourOnImage(Mat seg, cv::Mat& imgInput, Size offset = Size(0, 0)) { - if (seg.empty() || imgInput.empty()) { - std::cerr << "Empty contour or input image." << std::endl; - return; - } - cv::Mat imgWithAlpha; - cv::cvtColor(imgInput, imgWithAlpha, cv::COLOR_BGR2BGRA); - std::vector>contours; - if (offset.width != 0 && offset.height != 0) - { - Mat offsetImg(offset.width + seg.rows, offset.height + seg.cols, CV_8UC1, Scalar(0)); - seg.copyTo(offsetImg(Rect(offset.width, offset.height, seg.rows, seg.cols))); - offsetImg.copyTo(seg); - } - cv::findContours(seg, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - for (auto& contour : contours) - { - cv::Scalar color(0, 255, 0, 128); - cv::polylines(imgWithAlpha, contour, true, color); - cv::cvtColor(imgWithAlpha, imgInput, cv::COLOR_BGRA2BGR); - } -} -/////Specified function//////////////// -void writeSpecificStatement(Mat& Paint, const wchar_t* Text, rectAndData& data, int amount, int limit, Scalar& color) -{ - wstring MM(to_wstring(max(data.defectHeight, data.defectWidth))); - MM = MM.substr(0, MM.find_first_of(L".") + 2); - putTextHusky(Paint, (WString2String(Text + to_wstring(amount) - + L"/" + to_wstring(limit) + L"|" + - MM + L"mm")).c_str(), - cv::Point(data.rect.x, data.rect.y - 20), color, 20); -} -int getMaxAreaIndex(std::vector>& pts) -{ - int maxVal = 0, maxI = -1; - for (int i =0;i maxVal) - { - maxI = i; - maxVal = areaSize; - } - } - return maxI; -} -std::vector < std::vector>> splitLinesByCenterAndAngle(const std::vector>& lines, const cv::Point& center) { - std::vector> topLines, bottomLines, leftLines, rightLines; - - for (const auto& line : lines) { - const cv::Point& p1 = line.first; - const cv::Point& p2 = line.second; - - // 璁$畻绾挎鐨勬柟鍚戝悜閲� - cv::Point2f lineDirection = cv::Point2f(p2) - cv::Point2f(p1); - - // 璁$畻绾挎涓� x 杞村拰 y 杞寸殑澶硅 - double angleWithX = std::atan2(lineDirection.y, lineDirection.x) * 180 / CV_PI; - double angleWithY = std::atan2(lineDirection.x, lineDirection.y) * 180 / CV_PI; - angleWithX = (angleWithX < 0) ? 180 + angleWithX : angleWithX; - angleWithY = (angleWithY < 0) ? 180 + angleWithY : angleWithY; - // 鏍规嵁绾挎鏂瑰悜鍜屼腑蹇冪偣浣嶇疆灏嗙嚎娈靛垎缁� - if (p1.y <= center.y && p2.y <= center.y && (angleWithX < 10 || angleWithX > 170)) { - std::cout << "A" << to_string(angleWithX) << "A" << to_string(angleWithY) << std::endl; - topLines.push_back(line); - } - else if (p1.y >= center.y && p2.y >= center.y && (angleWithX < 10 || angleWithX > 170)) { - bottomLines.push_back(line); - } - - else if (p1.x <= center.x && p2.x <= center.x && (angleWithY < 10 || angleWithY > 170)) { - leftLines.push_back(line); - } - else if (p1.x >= center.x && p2.x >= center.x && (angleWithY < 10 || angleWithY > 170)) { - rightLines.push_back(line); - } - } - - // 杩斿洖鍥涗釜鏂瑰悜鐨勭嚎娈电粨鏋� - return { topLines, bottomLines, leftLines, rightLines }; -} - -std::vector> filterLinesByAngle(const std::vector>& lines) { - std::vector> filteredLines; - - for (const auto& line : lines) { - const cv::Point& p1 = line.first; - const cv::Point& p2 = line.second; - - // 璁$畻绾挎鐨勬柟鍚戝悜閲� - cv::Point2f lineDirection = cv::Point2f(p2) - cv::Point2f(p1); - - // 璁$畻绾挎涓� x 杞村拰 y 杞寸殑澶硅 - double angleWithX = std::abs(std::atan2(lineDirection.y, lineDirection.x) * 180 / CV_PI); - double angleWithY = std::abs(std::atan2(lineDirection.x, lineDirection.y) * 180 / CV_PI); - - // 濡傛灉涓� x 杞存垨 y 杞寸殑澶硅鍦ㄦ璐�30搴﹀唴锛屽垯淇濈暀璇ョ嚎娈� - if ((angleWithX < 10 || angleWithX > 170) || (angleWithY < 10 || angleWithY > 170)) { - filteredLines.push_back(line); - } - } - - return filteredLines; -} - -double pointLineSegmentDistance(const cv::Point& p, const cv::Point& q, const cv::Point& a, const cv::Point& b) { - cv::Point pq = q - p; - cv::Point ab = b - a; - cv::Point pa = a - p; - - double t = static_cast(pq.dot(ab)) / pq.dot(pq); - - if (t >= 0 && t <= 1) { - cv::Point pt = p + pq * t; - return cv::norm(pt - a); - } - else { - double dist1 = cv::norm(p - a); - double dist2 = cv::norm(q - b); - return std::min(dist1, dist2); - } -} - -double calculateLineSegmentDistance(const std::pair& line1, const std::pair& line2) { - cv::Point p1 = line1.first; - cv::Point p2 = line1.second; - cv::Point p3 = line2.first; - cv::Point p4 = line2.second; - - double distance1 = pointLineSegmentDistance(p1, p2, p3, p4); - double distance2 = pointLineSegmentDistance(p2, p1, p3, p4); - double distance3 = pointLineSegmentDistance(p3, p4, p1, p2); - double distance4 = pointLineSegmentDistance(p4, p3, p1, p2); - - //return std::min({distance1, distance2, distance3, distance4 }); - return (distance1 + distance2 + distance3 + distance4) / 4; -} - -void calculateLineSegmentDistances(const std::vector>& lines1, const std::vector>& lines2) { - double minDistance = std::numeric_limits::max(); - double maxDistance = std::numeric_limits::min(); - double sumDistance = 0.0; - - size_t count = 0; - for (const auto& line1 : lines1) { - for (const auto& line2 : lines2) { - double distance = calculateLineSegmentDistance(line1, line2); - if (distance >= 0) { - sumDistance += distance; - std::cout << "Minimum dist ssdce: " << distance * 0.014744 << std::endl; - if (distance < minDistance) { - minDistance = distance; - } - - if (distance > maxDistance) { - maxDistance = distance; - } - - ++count; - } - } - } - - std::cout << "Minimum distance: " << minDistance* 0.014744 << std::endl; - std::cout << "Maximum distance: " << maxDistance* 0.014744 << std::endl; - std::cout << "Average distance: " << (sumDistance / count)* 0.014744 << std::endl; -} - - -/////////////////////ALGOTHREAD///////////////////////// -bool algoThread::addDetTask(std::shared_ptr data) -{ - detQueueMutex.lock(); - detQueue.append(data); - detQueueMutex.unlock(); - this->start(); - return false; -} -bool algoThread::waitForImg(std::shared_ptr data,int timeOutSet=10000) -{ - int timeOut = 0; - int sleepMs = 100; - while (1) - { - int imgSize = data->imgs.size(); - int imgAmountMin = data->imgAmountMin; - if (imgSize >= imgAmountMin) - return true; - timeOut+= sleepMs; - if (timeOut > timeOutSet) - return false; - QThread::msleep(sleepMs); - } -} -void algoThread::run() -{ - while (m_runFlag == true) - { - while (detQueue.size() > 0) - { - - detQueueMutex.lock(); - std::shared_ptr data = detQueue.dequeue();//鍙栧嚭鏁版嵁 - detQueueMutex.unlock(); - int threadId = data->algoThreadIndex;//鑾峰彇绾跨▼id - if (waitForImg(data) == false) - { - qDebug() << "鍙栧浘澶辫触"; - cout << "get img err" << endl; - detDataManager* dManager = data->dManager; - data->dManager->deleteDetData(data->timeCode); - break; - } - detDataManager* dManager = data->dManager; - data->dManager->deleteDetData(data->timeCode); - continue; - if (threadId == 0) - { - int timeOut = 0; - int sleepMs = 100; - while (data->correctionData==nullptr) - { - if (timeOut > 10000)break; - timeOut += sleepMs; - QThread::msleep(sleepMs); - } - ALGO_Correction(data); - } - else - { - - if (waitForImg(data) == false) - { - qDebug() << "鍙栧浘澶辫触"; - cout << "get img err" << endl; - break; - } - bridge.front.showImg("Camera", data->imgs[0], threadId);//鏄剧ず鍘熷浘 - - auto start = std::chrono::high_resolution_clock::now(); - switch (threadId) - { - case 0: - Camera1_Algo(data); - break; - case 1: - Camera1_Algo(data); - break; - } - //oriSaveThread->saveOriImg(data);//淇濆瓨鍘熷浘 - - auto end = std::chrono::high_resolution_clock::now(); - auto duration = std::chrono::duration_cast(end - start); - std::cout << "Time taken by function: " << duration.count() << " milliseconds" << std::endl; - - //if (!data->SNcode.compare(snDatas->snErrorsnError))//鏃爏n闃诲 - // data->SNcode = snDatas->waitForSn(data->timeCode); - if (data->resultImgs.size() > 0) - { - //resSaveThread->saveResImg(data);//淇濆瓨缁撴灉鍥� - bridge.front.showImg("Algorithm", data->resultImgs[0], threadId);//鏄剧ず鍘熷浘 - //cout << "algoEnd" << data->algoThreadIndex; - } - - std::vector sqlDatas;//瀹氫箟sql鏁版嵁 - for (auto sqlData : data->sqlVec)//灏嗙畻娉曚腑鐨勬暟鎹鍏ュ埌鏁版嵁缁撴瀯涓� - sqlDatas.push_back({ sqlData.first, std::to_string(sqlData.second) }); - sql->addData(data->SNcode, sqlDatas);//灏嗘暟鎹彃鍏ユ暟鎹簱 - - std::vectorstrVec({ QString::fromStdString(data->SNcode),QString::number(data->camera1Width) + "x" + QString::number(data->camera1Height) }); - bridge.front.tableViewPtr->addRowDataValue(strVec);//灏嗘暟鎹彃鍏ョ晫闈㈣〃鏍� - - detDataManager* dManager = data->dManager; - data->dManager->deleteDetData(data->timeCode); - } - } - QThread::msleep(10); - } -} -void matsToMat(cv::Mat& mat1, cv::Mat& mat2, cv::Mat* Paint) -{ - auto start_time = std::chrono::high_resolution_clock::now(); - *Paint = cv::Mat(mat1.rows + mat2.rows, mat1.cols, CV_8UC1); - memcpy(Paint->data, mat1.data, mat1.rows * mat1.cols); - memcpy(mat1.rows * mat1.cols + Paint->data, mat2.data, mat2.rows * mat2.cols); - if (Paint->channels() == 1) - cv::cvtColor(*Paint, *Paint, cv::COLOR_GRAY2BGR); - auto end_time = std::chrono::high_resolution_clock::now(); - auto duration = std::chrono::duration_cast(end_time - start_time); - std::cout << "matsToMat: " << duration.count() << " microseconds" << std::endl; -} -void algoThread::ALGO_Correction(std::shared_ptr data) -{ - ALGO_Inspection(data); - int pValueBounus = 100; - if (data->correctionData == nullptr) - return; -#pragma region XOY_DEFINE - HTuple hv_in_X_X0Y; - for (auto rangeData : data->correctionData->in_X_X0Y) - hv_in_X_X0Y.Append(rangeData); - - HTuple hv_in_Y_X0Y; - for (auto rangeData : data->correctionData->in_Y_X0Y) - hv_in_Y_X0Y.Append(rangeData); - - HTuple hv_in_Z_X0Y; - for (auto rangeData : data->correctionData->in_Z_X0Y) - hv_in_Z_X0Y.Append(rangeData); - - HTuple hv_in_Z_X0Y_Value; - for (auto rangeData : data->correctionData->in_Z_X0Y_Value) - hv_in_Z_X0Y_Value.Append(rangeData); -#pragma endregion - -#pragma region XOZ_DEFINE - HTuple hv_in_X_X0Z; - for (auto rangeData : data->correctionData->in_X_X0Z) - hv_in_X_X0Z.Append(rangeData); - - HTuple hv_in_Y_X0Z; - for (auto rangeData : data->correctionData->in_Y_X0Z) - hv_in_Y_X0Z.Append(rangeData); - - HTuple hv_in_Z_X0Z; - for (auto rangeData : data->correctionData->in_Z_X0Z) - hv_in_Z_X0Z.Append(rangeData); - - HTuple hv_in_Y_X0Z_Value; - for (auto rangeData : data->correctionData->in_Y_X0Z_Value) - hv_in_Y_X0Z_Value.Append(rangeData); -#pragma endregion - -#pragma region YOZ_DEFINE - HTuple hv_in_X_Y0Z; - for (auto rangeData : data->correctionData->in_X_Y0Z) - hv_in_X_Y0Z.Append(rangeData); - - HTuple hv_in_Y_Y0Z; - for (auto rangeData : data->correctionData->in_Y_Y0Z) - hv_in_Y_Y0Z.Append(rangeData); - - HTuple hv_in_Z_Y0Z; - for (auto rangeData : data->correctionData->in_Z_Y0Z) - hv_in_Z_Y0Z.Append(rangeData); - - HTuple hv_in_X_Y0Z_Value; - for (auto rangeData : data->correctionData->in_X_Y0Z_Value) - hv_in_X_Y0Z_Value.Append(rangeData); -#pragma endregion - - HTuple hv_out_Origin; - HTuple hv_out_Result_X; - HTuple hv_out_Result_Y; - HTuple hv_out_Result_Z; - HTuple hv_out_AngleZX; - HTuple hv_out_AngleYZ; - HTuple hv_out_AngleXY; - HTuple hv_out_Flag; - halcon_Correction( - hv_in_X_X0Y, hv_in_Y_X0Y, hv_in_Z_X0Y, hv_in_Z_X0Y_Value, - hv_in_X_X0Z, hv_in_Y_X0Z, hv_in_Z_X0Z, hv_in_Y_X0Z_Value, - hv_in_X_Y0Z, hv_in_Y_Y0Z, hv_in_Z_Y0Z, hv_in_X_Y0Z_Value, - &hv_out_Origin,&hv_out_Result_X,&hv_out_Result_Y,&hv_out_Result_Z, - &hv_out_AngleZX,&hv_out_AngleYZ,&hv_out_AngleXY,&hv_out_Flag); - - int ok_Flag = 0; - vectorout_Origin; - vectorout_Result_X; - vectorout_Result_Y; - vectorout_Result_Z; - double out_AngleZX; - double out_AngleYZ; - double out_AngleXY; - - if(hv_out_Flag.Length()==1) - if (hv_out_Flag[0].D()== 1) - { - if (hv_out_Origin.Length() == 3) - { - out_Origin = { hv_out_Origin[0].D(),hv_out_Origin[1].D(), hv_out_Origin[2].D() }; - ok_Flag++; - } - if (hv_out_Result_X.Length() == 3) - { - out_Result_X = { hv_out_Result_X[0].D(),hv_out_Result_X[1].D(), hv_out_Result_X[2].D() }; - ok_Flag++; - } - if (hv_out_Result_Y.Length() == 3) - { - out_Result_Y = { hv_out_Result_Y[0].D(),hv_out_Result_Y[1].D(), hv_out_Result_Y[2].D() }; - ok_Flag++; - } - if (hv_out_Result_Z.Length() == 3) - { - out_Result_Z = { hv_out_Result_Z[0].D(),hv_out_Result_Z[1].D(), hv_out_Result_Z[2].D() }; - ok_Flag++; - } - if (hv_out_AngleZX.Length() == 1) - { - out_AngleZX = hv_out_AngleZX[0].D(); - ok_Flag++; - } - if (hv_out_AngleYZ.Length() == 1) - { - out_AngleYZ = hv_out_AngleYZ[0].D(); - ok_Flag++; - } - if (hv_out_AngleXY.Length() == 1) - { - out_AngleXY = hv_out_AngleXY[0].D(); - ok_Flag++; - } - } - else - { - std::cout << "error"; - } - - if (ok_Flag != 7) - { - //qDebug() - return; - } - //originX - _triggerManager->sendFinsMsg("write_short_310_" + QString::number(out_Origin[0] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_311_" + QString::number(abs(static_cast(out_Origin[0])))); - double pvalue = out_Origin[0] - static_cast(out_Origin[0]); - _triggerManager->sendFinsMsg("write_short_312_" + QString::number(abs(pvalue* pValueBounus))); - - //originY - _triggerManager->sendFinsMsg("write_short_313_" + QString::number(out_Origin[1] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_314_" + QString::number(abs(static_cast(out_Origin[1])))); - pvalue = out_Origin[1] - static_cast(out_Origin[1]); - _triggerManager->sendFinsMsg("write_short_315_" + QString::number(abs(pvalue * pValueBounus))); - - //originZ - _triggerManager->sendFinsMsg("write_short_316_" + QString::number(out_Origin[2] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_317_" + QString::number(abs(static_cast(out_Origin[2])))); - pvalue = out_Origin[2] - static_cast(out_Origin[2]); - _triggerManager->sendFinsMsg("write_short_318_" + QString::number(abs(pvalue * pValueBounus))); - - //ResultX1 - _triggerManager->sendFinsMsg("write_short_319_" + QString::number(out_Result_X[0] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_320_" + QString::number(abs(static_cast(out_Result_X[0])))); - pvalue = out_Result_X[0] - static_cast(out_Result_X[0]); - _triggerManager->sendFinsMsg("write_short_321_" + QString::number(abs(pvalue * pValueBounus))); - - //ResultX2 - _triggerManager->sendFinsMsg("write_short_322_" + QString::number(out_Result_X[1] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_323_" + QString::number(abs(static_cast(out_Result_X[1])))); - pvalue = out_Result_X[1] - static_cast(out_Result_X[1]); - _triggerManager->sendFinsMsg("write_short_324_" + QString::number(abs(pvalue * pValueBounus))); - - //ResultX3 - _triggerManager->sendFinsMsg("write_short_325_" + QString::number(out_Result_X[2] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_326_" + QString::number(abs(static_cast(out_Result_X[2])))); - pvalue = out_Result_X[2] - static_cast(out_Result_X[2]); - _triggerManager->sendFinsMsg("write_short_327_" + QString::number(abs(pvalue * pValueBounus))); - - //ResultY1 - _triggerManager->sendFinsMsg("write_short_328_" + QString::number(out_Result_Y[0] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_329_" + QString::number(abs(static_cast(out_Result_Y[0])))); - pvalue = out_Result_Y[0] - static_cast(out_Result_Y[0]); - _triggerManager->sendFinsMsg("write_short_330_" + QString::number(abs(pvalue * pValueBounus))); - - //ResultY2 - _triggerManager->sendFinsMsg("write_short_331_" + QString::number(out_Result_Y[1] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_332_" + QString::number(abs(static_cast(out_Result_Y[1])))); - pvalue = out_Result_Y[1] - static_cast(out_Result_Y[1]); - _triggerManager->sendFinsMsg("write_short_333_" + QString::number(abs(pvalue * pValueBounus))); - - //ResultY3 - _triggerManager->sendFinsMsg("write_short_334_" + QString::number(out_Result_Y[2] < 0 ? 2 : 1)); - _triggerManager->sendFinsMsg("write_short_335_" + QString::number(abs(static_cast(out_Result_Y[2])))); - pvalue = out_Result_Y[2] - static_cast(out_Result_Y[2]); - _triggerManager->sendFinsMsg("write_short_336_" + QString::number(abs(pvalue * pValueBounus))); -} -void algoThread::ALGO_Inspection(std::shared_ptr data) -{ - if (data->imgs.size() < 1) - { - qDebug() << __FUNCDNAME__ << __LINE__ << "camera Mat size is Error!"; - return; - } - //hv_in_Parameter - //[0]-浜у搧绉嶇被; 1A姝i潰 2A鍙嶉潰 3B姝i潰 4C姝i潰 - //[1]-鍥惧儚搴忓彿绗竴浣�; - //[2]-鍥惧儚搴忓彿绗簩浣�; - //[3]-3d鐩告満绮惧害锛坢m锛�; - //[4]-ping閽堝亸绉诲垽NG闃堝�硷紙mm锛�; - //[5]-鍒囧浘瀛樺浘寮�鍏� -#pragma region halcon鍙橀噺瀹氫箟 - //娴嬮噺 - HObject ho_in_Image; - HTuple hv_in_ShapePath; - HTuple hv_in_Parameter; - HTuple hv_out_Pings_X; - HTuple hv_out_Pings_Y; - HTuple hv_out_NG_Pings_X; - HTuple hv_out_NG_Pings_Y; - HTuple hv_out_Pings_Num; - HTuple hv_out_NG_Pings_Num; - HTuple hv_out_Flag_INS; - - //ROI - HTuple hv_out_ROI_Value; - HTuple hv_out_Flag_ROI; -#pragma endregion - - cv::Mat mat = cv::imread("C://NHMJDHNN78474-5_1-ASR1006X20240320-150822.BMP", -1); - ho_in_Image=simpleAlgo::MatToHObject(mat); - - hv_in_Parameter.Append(3); - hv_in_Parameter.Append(5); - hv_in_Parameter.Append(1); - hv_in_Parameter.Append(0.0135); - hv_in_Parameter.Append(0.2); - hv_in_Parameter.Append(2); - - hv_in_ShapePath = "./halconModel"; - - - Pings_Inspection(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_Pings_X, - &hv_out_Pings_Y, &hv_out_NG_Pings_X, &hv_out_NG_Pings_Y, &hv_out_Pings_Num, - &hv_out_NG_Pings_Num, &hv_out_Flag_INS); - - Pings_ROI(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_ROI_Value, &hv_out_Flag_ROI); - vectorResult; - for (int i = 0; i < hv_out_ROI_Value.Length()/4;i++) - { - Result.push_back( - cv::Rect( - hv_out_ROI_Value[i * 4 +1].D(), - hv_out_ROI_Value[i * 4].D(), - hv_out_ROI_Value[i * 4 +3].D() - hv_out_ROI_Value[i * 4 + 1].D(), - hv_out_ROI_Value[i * 4 +2].D() - hv_out_ROI_Value[i * 4].D() - )); - } - cv::Mat Paint; - cvtColor(mat, Paint, COLOR_GRAY2BGR); - rectangle(Paint, Result[0], cv::Scalar(0, 0, 255), 4); - _sleep(100); -} -void algoThread::Camera1_Algo(std::shared_ptr data) -{ - auto start_time = std::chrono::high_resolution_clock::now(); - if (data->imgs.size() < 1) - { - qDebug() << __FUNCDNAME__ << __LINE__ << "camera Mat size is Error!"; - return; - } - ///////////////////鍙栧浘///澹版槑///////////////////// - ngNoteCls Note; - cv::Mat src; - cv::Mat Paint; - int CCD1OK = 1; - double CCD1height = -1; - double dmCodeWidth = 0, dmCodeHeight = 0; - double pixAccX = 0.013502052, pixAccY = 0.014005423575; - double camera1Width = 1, camera1Height = 2; - QFuture future1; - if (data->imgs.size() == 1) - { - src = data->imgs[0]; - if (Paint.channels() == 1) - cv::cvtColor(src, Paint, cv::COLOR_GRAY2BGR); - else - src.copyTo(Paint); - } - - - //} - if (CCD1OK == 2) - cv::putText(Paint, "NG", cv::Point(150, 600), 1, 10, cv::Scalar(0, 0, 255), 30); - else - cv::putText(Paint, "OK", cv::Point(150, 600), 1, 10, cv::Scalar(0, 255, 0), 30); - - ///////////////////鏃燬N闃诲/////////////////////// - //if (!data->SNcode.compare(snDatas->snErrorsnError)) - // data->SNcode = snDatas->waitForSn(data->timeCode); - cv::putText(Paint, data->SNcode, cv::Point(150, 800), 1, 10, cv::Scalar(0, 255, 0), 10); - /////////////////////SQL//////////////////////// - data->sqlVec.push_back({ "Camera1Result", CCD1OK }); - data->sqlVec.push_back({ "Camera1_Width", camera1Width }); - data->sqlVec.push_back({ "Camera1_Height", camera1Height }); - ////////////////////缁撴灉淇濆瓨////////////////// - cv::resize(Paint, Paint, cv::Size(Paint.cols / 2, Paint.rows / 2)); - data->resultImgs.push_back(Paint); - //////////////CSV///////////////////////////// - string OKNG("OK"); - if (CCD1OK == 2)OKNG = "NG"; - qDebug() << "[Debug]algo1 end:" << QString::fromStdString(data->SNcode); - std::cout << "algo1 end:" << QString::fromStdString(data->SNcode).toStdString() << endl; -} \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/algo/algorithmThread.h b/HanddleAI/HandleAiUi-new/algo/algorithmThread.h deleted file mode 100644 index 843ffea2..00000000 --- a/HanddleAI/HandleAiUi-new/algo/algorithmThread.h +++ /dev/null @@ -1,1092 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include . -#include -#include -#include -#include -using namespace std; -using namespace HalconCpp; -enum ngTypeEnum -{ - OK, - huaHeng, - aoKeng, - zangWu -}; -//简单的图像相关算法 -class simpleAlgo -{ -public: - //融合两张图片白色区域 - static cv::Mat mergeBinaryMats(const cv::Mat& mat1, const cv::Mat& mat2) - { - // 确保两个输入图像具有相同的尺寸 - if (mat1.size() != mat2.size()) { - std::cerr << "Error: Input images must have the same size." << std::endl; - return cv::Mat(); - } - - // 创建一个输出图像,初始化为全黑 - cv::Mat merged = cv::Mat::zeros(mat1.size(), CV_8U); - - // 将两个输入图像中的白色部分合并到输出图像 - cv::bitwise_or(mat1, mat2, merged); - - return merged; - } - //Rect相加 - cv::Rect rectPlusRect(cv::Rect world, cv::Rect rect) - { - return cv::Rect(rect.x + world.x, rect.y + world.y, rect.width, rect.height); - } - static cv::Rect findMaxAreaContour(cv::Mat src) - { - int maxIndex = 0, maxArea = 0; - std::vector>contours; - cv::findContours(src, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - if (contours.size() == 0) - return cv::Rect(0, 0, 0, 0); - for (int i = 0; i < contours.size(); i++) - { - int Area = cv::contourArea(contours[i]); - if (Area > maxArea) - { - maxArea = Area; - maxIndex = i; - } - } - if (contours.size() != 0) - return cv::boundingRect(contours[maxIndex]); - return cv::Rect(0, 0, 0, 0); - } - static cv::Rect findMaxAreaContour(cv::Mat src, int& indexReturn) - { - int maxIndex = 0, maxArea = 0; - std::vector>contours; - cv::findContours(src, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - if (contours.size() == 0) - return cv::Rect(0, 0, 0, 0); - for (int i = 0; i < contours.size(); i++) - { - int Area = cv::contourArea(contours[i]); - if (Area > maxArea) - { - maxArea = Area; - maxIndex = i; - } - } - if (contours.size() != 0) - { - indexReturn = maxIndex; - return cv::boundingRect(contours[maxIndex]); - } - } - static cv::Mat cutImg2Cls(std::vectorcontour, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)) - { - if (contour.empty() || imgInput.empty()) { - std::cerr << "Empty contour or input image." << std::endl; - return cv::Mat(); - } - cv::Rect boundingBox = cv::boundingRect(contour); - cv::Point mid(boundingBox.x + boundingBox.width / 2, boundingBox.y + boundingBox.height / 2); - int sideLength = max(max(boundingBox.width, boundingBox.height), 128); - cv::Mat squareImage(sideLength, sideLength, imgInput.type(), cv::Scalar(0, 0, 0)); - cv::Rect expectRect(mid.x - sideLength / 2, mid.y - sideLength / 2, sideLength, sideLength); - int xOffset = 0; - int yOffset = 0;// (sideLength - boundingBox.height) / 2; - //越界判断 - { - if (expectRect.x < 0) - { - expectRect.width += expectRect.x; - xOffset -= expectRect.x; - expectRect.x = 0; - } - if (expectRect.y < 0) - { - expectRect.height += expectRect.y; - yOffset -= expectRect.y; - expectRect.y = 0; - } - if (expectRect.x + expectRect.width > imgInput.cols) - expectRect.width = imgInput.cols - expectRect.x; - if (expectRect.y + expectRect.height > imgInput.rows) - expectRect.height = imgInput.rows - expectRect.y; - } - imgInput(expectRect).copyTo(squareImage(cv::Rect(xOffset, yOffset, expectRect.width, expectRect.height))); - resize(squareImage, squareImage, targetSize); - return squareImage; - } - static cv::Mat cutImg2Cls(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)) - { - if (boundingBox.empty() || imgInput.empty()) { - std::cerr << "Empty contour or input image." << std::endl; - return cv::Mat(); - } - cv::Point mid(boundingBox.x + boundingBox.width / 2, boundingBox.y + boundingBox.height / 2); - int sideLength = max(max(boundingBox.width, boundingBox.height), 128); - cv::Mat squareImage(sideLength, sideLength, imgInput.type(), cv::Scalar(0, 0, 0)); - cv::Rect expectRect(mid.x - sideLength / 2, mid.y - sideLength / 2, sideLength, sideLength); - int xOffset = 0; - int yOffset = 0;// (sideLength - boundingBox.height) / 2; - //越界判断 - { - if (expectRect.x < 0) - { - expectRect.width += expectRect.x; - xOffset -= expectRect.x; - expectRect.x = 0; - } - if (expectRect.y < 0) - { - expectRect.height += expectRect.y; - yOffset -= expectRect.y; - expectRect.y = 0; - } - if (expectRect.x + expectRect.width > imgInput.cols) - expectRect.width = imgInput.cols - expectRect.x; - if (expectRect.y + expectRect.height > imgInput.rows) - expectRect.height = imgInput.rows - expectRect.y; - } - imgInput(expectRect).copyTo(squareImage(cv::Rect(xOffset, yOffset, expectRect.width, expectRect.height))); - resize(squareImage, squareImage, targetSize); - return squareImage; - } - static cv::Mat HObject2Mat(HObject Hobj) //HObject类型转Mat类型 - { - HTuple htCh; - HString cType; - cv::Mat Image; - ConvertImageType(Hobj, &Hobj, "byte"); - CountChannels(Hobj, &htCh); - Hlong wid = 0; - Hlong hgt = 0; - if (htCh[0].I() == 1) - { - HImage hImg(Hobj); - void* ptr = hImg.GetImagePointer1(&cType, &wid, &hgt);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt); - int W = wid; - int H = hgt; - Image.create(H, W, CV_8UC1); - unsigned char* pdata = static_cast(ptr); - memcpy(Image.data, pdata, W * H); - } - else if (htCh[0].I() == 3) - { - void* Rptr; - void* Gptr; - void* Bptr; - HImage hImg(Hobj); - hImg.GetImagePointer3(&Rptr, &Gptr, &Bptr, &cType, &wid, &hgt); - int W = wid; - int H = hgt; - Image.create(H, W, CV_8UC3); - std::vector VecM(3); - VecM[0].create(H, W, CV_8UC1); - VecM[1].create(H, W, CV_8UC1); - VecM[2].create(H, W, CV_8UC1); - unsigned char* R2 = (unsigned char*)Rptr; - unsigned char* G = (unsigned char*)Gptr; - unsigned char* B = (unsigned char*)Bptr; - memcpy(VecM[2].data, R2, W * H); - memcpy(VecM[1].data, G, W * H); - memcpy(VecM[0].data, B, W * H); - cv::merge(VecM, Image); - } - return Image; - } - enum MatsToHObjectEnum - { - horizontal, - vertical - }; - static HalconCpp::HObject MatsToHObject(cv::Mat* img1, cv::Mat* img2, MatsToHObjectEnum type) - { - auto start3 = std::chrono::high_resolution_clock::now(); - HalconCpp::HObject Hobj; - int height = 0; - int width = 0; - switch (type) - { - case horizontal: - width = img1->cols; - height = img1->rows + img2->rows; - break; - case vertical: - width = img1->cols + img2->cols; - height = img1->rows; - break; - } - if (img1->type() == CV_8UC1) - { - unsigned char* imgData = new unsigned char[width * height]; - memcpy(imgData, img1->data, img1->rows * img1->cols); - memcpy(img1->rows * img1->cols + imgData, img2->data, img1->rows * img1->cols); - GenImage1(&Hobj, "byte", width, height, (Hlong)imgData); - delete[]imgData; - imgData = nullptr; - } - auto end3 = std::chrono::high_resolution_clock::now(); - auto duration3 = std::chrono::duration_cast(end3 - start3); - std::cout << "Time taken by functionxxx: " << duration3.count() << " milliseconds" << std::endl; - return Hobj; - } - static HalconCpp::HObject MatsToHObject(cv::Mat& img1, cv::Mat& img2,MatsToHObjectEnum type) - { - auto start3 = std::chrono::high_resolution_clock::now(); - HalconCpp::HObject Hobj; - int height = 0; - int width = 0; - switch (type) - { - case horizontal: - width = img1.cols; - height = img1.rows + img2.rows; - break; - case vertical: - width = img1.cols + img2.cols; - height = img1.rows; - break; - } - if (img1.type() == CV_8UC1) - { - unsigned char* imgData = new unsigned char[width * height]; - //#pragma omp parallel for - //for (int i = 0; i < 2; i++) - //{ - // switch (i) - // { - // case 0: - // memcpy(imgData, img1.data, img1.rows * img1.cols); - // break; - // case 1: - // memcpy(img1.rows * img1.cols + imgData, img2.data, img1.rows * img1.cols); - // break; - // } - //} - memcpy(imgData, img1.data, img1.rows * img1.cols); - memcpy(img1.rows * img1.cols + imgData, img2.data, img1.rows * img1.cols); - GenImage1(&Hobj, "byte", width, height, (Hlong)imgData); - delete []imgData; - imgData = nullptr; - } - auto end3 = std::chrono::high_resolution_clock::now(); - auto duration3 = std::chrono::duration_cast(end3 - start3); - std::cout << "Time taken by functionxxx: " << duration3.count() << " milliseconds" << std::endl; - return Hobj; - } - static void MatToHObjectV(cv::Mat& image, HalconCpp::HObject* Hobj) - { - int hgt = image.rows; - int wid = image.cols; - int i; - if (image.type() == CV_8UC3) - { - HalconCpp::HImage himage = HalconCpp::HImage(); - - std::vector imgchannel; - split(image, imgchannel); - cv::Mat imgB = imgchannel[0]; - cv::Mat imgG = imgchannel[1]; - cv::Mat imgR = imgchannel[2]; - uchar* dataR = new uchar[hgt * wid]; - uchar* dataG = new uchar[hgt * wid]; - uchar* dataB = new uchar[hgt * wid]; - for (i = 0; i < hgt; i++) - { - memcpy(dataR + wid * i, imgR.data + imgR.step * i, wid); - memcpy(dataG + wid * i, imgG.data + imgG.step * i, wid); - memcpy(dataB + wid * i, imgB.data + imgB.step * i, wid); - } - himage.GenImage3("byte", wid, hgt, dataR, dataG, dataB); - HalconCpp::HString tmpType; - Hlong tmpW, tmpH; - void* hImgPtR, * hImgPtG, * hImgPtB; - himage.GetImagePointer3(&hImgPtR, &hImgPtG, &hImgPtB, &tmpType, &tmpW, &tmpH); - - GenImage3(Hobj, "byte", wid, hgt, (Hlong)hImgPtR, (Hlong)hImgPtG, (Hlong)hImgPtB); - delete[]dataR; - delete[]dataG; - delete[]dataB; - dataR = NULL; - dataG = NULL; - dataB = NULL; - } - else if (image.type() == CV_8UC1) - { - //HalconCpp::HImage himage = HalconCpp::HImage(); - - ////uchar* data = new uchar[hgt * wid]; - ////for (i = 0; i < hgt; i++) - ////{ - //// memcpy(data + wid * i, image.data + image.step * i, wid); - ////} - ////gen_image_const - //himage.GenImage1("byte", wid, hgt, image.data); - - //HalconCpp::HString tmpType; - //Hlong tmpW, tmpH; - //void* hImgPt; - //hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); - //GenImage1(&Hobj, "byte", wid, hgt, (Hlong)hImgPt); - GenImage1(Hobj, "byte", wid, hgt, (Hlong)image.data); - - /* delete[] data; - data = NULL;*/ - - } - else if (image.type() == CV_16UC1) - { - HalconCpp::HImage himage = HalconCpp::HImage(); - - ushort* data = new ushort[hgt * wid * 2]; - - memcpy(data, image.data, hgt * wid * 2); - - - himage.GenImage1("uint2", wid, hgt, data); - - HalconCpp::HString tmpType; - Hlong tmpW, tmpH; - void* hImgPt; - hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); - GenImage1(Hobj, "uint2", wid, hgt, (Hlong)hImgPt); - - delete[] data; - data = NULL; - - } - else if (image.type() == CV_16SC1) - { - HalconCpp::HImage himage = HalconCpp::HImage(); - - short* data = new short[hgt * wid * 2]; - - memcpy(data, image.data, hgt * wid * 2); - - - himage.GenImage1("int2", wid, hgt, data); - - HalconCpp::HString tmpType; - Hlong tmpW, tmpH; - void* hImgPt; - hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); - GenImage1(Hobj, "int2", wid, hgt, (Hlong)hImgPt); - - delete[] data; - data = NULL; - - } - - } - static HalconCpp::HObject MatToHObject(cv::Mat& image) - { - HalconCpp::HObject Hobj; - int hgt = image.rows; - int wid = image.cols; - int i; - if (image.type() == CV_8UC3) - { - HalconCpp::HImage himage = HalconCpp::HImage(); - - std::vector imgchannel; - split(image, imgchannel); - cv::Mat imgB = imgchannel[0]; - cv::Mat imgG = imgchannel[1]; - cv::Mat imgR = imgchannel[2]; - uchar* dataR = new uchar[hgt * wid]; - uchar* dataG = new uchar[hgt * wid]; - uchar* dataB = new uchar[hgt * wid]; - for (i = 0; i < hgt; i++) - { - memcpy(dataR + wid * i, imgR.data + imgR.step * i, wid); - memcpy(dataG + wid * i, imgG.data + imgG.step * i, wid); - memcpy(dataB + wid * i, imgB.data + imgB.step * i, wid); - } - himage.GenImage3("byte", wid, hgt, dataR, dataG, dataB); - HalconCpp::HString tmpType; - Hlong tmpW, tmpH; - void* hImgPtR, * hImgPtG, * hImgPtB; - himage.GetImagePointer3(&hImgPtR, &hImgPtG, &hImgPtB, &tmpType, &tmpW, &tmpH); - - GenImage3(&Hobj, "byte", wid, hgt, (Hlong)hImgPtR, (Hlong)hImgPtG, (Hlong)hImgPtB); - delete[]dataR; - delete[]dataG; - delete[]dataB; - dataR = NULL; - dataG = NULL; - dataB = NULL; - } - else if (image.type() == CV_8UC1) - { - //HalconCpp::HImage himage = HalconCpp::HImage(); - - ////uchar* data = new uchar[hgt * wid]; - ////for (i = 0; i < hgt; i++) - ////{ - //// memcpy(data + wid * i, image.data + image.step * i, wid); - ////} - ////gen_image_const - //himage.GenImage1("byte", wid, hgt, image.data); - - //HalconCpp::HString tmpType; - //Hlong tmpW, tmpH; - //void* hImgPt; - //hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); - //GenImage1(&Hobj, "byte", wid, hgt, (Hlong)hImgPt); - GenImage1(&Hobj, "byte", wid, hgt, (Hlong)image.data); - - /* delete[] data; - data = NULL;*/ - - } - else if (image.type() == CV_16UC1) - { - HalconCpp::HImage himage = HalconCpp::HImage(); - - ushort* data = new ushort[hgt * wid * 2]; - - memcpy(data, image.data, hgt * wid * 2); - - - himage.GenImage1("uint2", wid, hgt, data); - - HalconCpp::HString tmpType; - Hlong tmpW, tmpH; - void* hImgPt; - hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); - GenImage1(&Hobj, "uint2", wid, hgt, (Hlong)hImgPt); - - delete[] data; - data = NULL; - - } - else if (image.type() == CV_16SC1) - { - HalconCpp::HImage himage = HalconCpp::HImage(); - - short* data = new short[hgt * wid * 2]; - - memcpy(data, image.data, hgt * wid * 2); - - - himage.GenImage1("int2", wid, hgt, data); - - HalconCpp::HString tmpType; - Hlong tmpW, tmpH; - void* hImgPt; - hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); - GenImage1(&Hobj, "int2", wid, hgt, (Hlong)hImgPt); - - delete[] data; - data = NULL; - - } - - return Hobj; - } - //获取两点之间的直线距离 - static double getDistance(cv::Point pointO, cv::Point pointA) - { - double distance; - distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2); - distance = sqrtf(distance); - return distance; - } - //计算角度,pt2为顶点 - static double calculateAngle(cv::Point pt1, cv::Point pt2, cv::Point pt3) - { - // 计算两个向量 - cv::Point vector1 = pt1 - pt2; - cv::Point vector2 = pt3 - pt2; - - // 计算两个向量的长度 - double length1 = norm(vector1); - double length2 = norm(vector2); - - // 计算两个向量的点积 - double dotProduct = vector1.dot(vector2); - - // 计算夹角的余弦值 - double cosAngle = dotProduct / (length1 * length2); - - // 计算夹角的弧度 - double angleRadians = acos(cosAngle); - - // 将弧度转换为度数 - double angleDegrees = angleRadians * 180 / CV_PI; - - return angleDegrees; - } - //计算角度偏移量,pt1,pt2为第一条线段,pt3,pt4为第二条线段 - static double calculateAngleOffset(cv::Point pt11, cv::Point pt12, cv::Point pt21, cv::Point pt22) - { - // 计算第一条线段的向量 - cv::Point vec1(pt12.x - pt11.x, pt12.y - pt11.y); - - // 计算第二条线段的向量 - cv::Point vec2(pt22.x - pt21.x, pt22.y - pt21.y); - - // 计算向量的叉乘 - double crossProduct = vec1.x * vec2.y - vec1.y * vec2.x; - - // 计算角度偏移量 - double angleOffset = atan2(crossProduct, vec1.dot(vec2)); - - // 将弧度转换为度数 - angleOffset = angleOffset * 180 / CV_PI; - - return angleOffset; - } - //通过角度计算圆上点的位置 - cv::Point calculatePointOnCircle(cv::Point center, double radius, double angleDegrees) - { - // 将角度转换为弧度 - double angleRadians = angleDegrees * CV_PI / 180.0; - - // 计算点的坐标 - int x = static_cast(center.x + radius * cos(angleRadians)); - int y = static_cast(center.y + radius * sin(angleRadians)); - - return cv::Point(x, y); - } - /// - /// 模板匹配,以MatchResult返回 - /// - /// 图像 - /// 模板图像 - /// - static MatchResult templateMatching(const cv::Mat& originalImage, const cv::Mat& templateImage) { - MatchResult result; - - // 创建结果图像 - int resultCols = originalImage.cols - templateImage.cols + 1; - int resultRows = originalImage.rows - templateImage.rows + 1; - cv::Mat resultImg(resultRows, resultCols, CV_32FC1); - - // 进行模板匹配 - cv::matchTemplate(originalImage, templateImage, resultImg, cv::TM_CCOEFF_NORMED); - - // 归一化结果图像 - cv::normalize(resultImg, resultImg, 0, 1, cv::NORM_MINMAX, -1, cv::Mat()); - - // 寻找最佳匹配位置 - double minVal, maxVal; - cv::Point minLoc, maxLoc; - cv::minMaxLoc(resultImg, &minVal, &maxVal, &minLoc, &maxLoc); - - // 设置矩形框和可信度 - result.boundingRect = cv::Rect(maxLoc.x, maxLoc.y, templateImage.cols, templateImage.rows); - result.confidence = maxVal; - - return result; - } - /// - /// 模板匹配,返回Rect以及分数 - /// - /// 模板图像 - /// 匹配图像 - /// 分数 - /// - static cv::Rect doMatchTemplate(const cv::Mat& templateImg, const cv::Mat& srcImg, double* sorce) - { - cv::Mat resultImage; - matchTemplate(srcImg, templateImg, resultImage, cv::TM_CCOEFF_NORMED); - double minVal = 0, maxVal = 0; - cv::Point minLoc(0, 0), maxLoc(0, 0); - minMaxLoc(resultImage, &minVal, &maxVal, &minLoc, &maxLoc); - *sorce = maxVal; - cv::Rect rect(maxLoc.x, maxLoc.y, templateImg.cols, templateImg.rows); - return rect; - } - //计算contour是否重叠 - static bool isContoursOverlap(const std::vector& contour1, const std::vector& contour2, double thresholdPercent = 0) { - cv::Rect rect1 = cv::boundingRect(contour1); - cv::Rect rect2 = cv::boundingRect(contour2); - cv::Size tempImgSize(max(rect1.x + rect1.width, rect2.x + rect2.width), max(rect1.y + rect1.height, rect2.y + rect2.height)); - cv::Mat binaryImage = cv::Mat::zeros(tempImgSize,CV_8U); - - // 画出目标轮廓 - drawContours(binaryImage, std::vector>{contour2}, 0, cv::Scalar(255), -1); - - double totalOverlap = 0.0; - - - // 创建一个临时的二值图像 - cv::Mat tempBinaryImage = cv::Mat::zeros(tempImgSize, CV_8U); - // 画出当前轮廓 - drawContours(tempBinaryImage, std::vector>{contour1}, 0, cv::Scalar(255), -1); - - // 计算重叠的像素数 - cv::Mat intersection = binaryImage & tempBinaryImage; - int overlapPixelCount = countNonZero(intersection); - - // 计算当前轮廓的重叠百分比 - double overlapPercentage = static_cast(overlapPixelCount) / countNonZero(tempBinaryImage); - - return overlapPercentage * 100.0> thresholdPercent; // 将结果转换为百分比 - } - //计算rect是否重叠 - static bool isRectOverlap(const cv::Rect& rect1, const cv::Rect& rect2,double thresholdPercent=0) { - // 计算两个矩形的重叠区域 - cv::Rect intersection = rect1 & rect2; - if (thresholdPercent != 0)//如果有阈值 - { - int maxCnotourArea = max(rect1.area(), rect2.area()); - if (intersection.area() / maxCnotourArea < thresholdPercent) - return false; - } - // 如果重叠区域的面积大于0,则说明两个矩形重叠 - return intersection.area() > 0; - } - //将两个contour的区域合并 - static std::vector contourPlusContour(const std::vector& contour1, const std::vector& contour2) - { - std::vectorres; - res.insert(res.end(), contour1.begin(), contour1.end()); - res.insert(res.end(), contour2.begin(), contour2.end()); - return res; - } -}; -struct rectAndData -{ - cv::Rect rect; - double defectHeight; - double defectWidth; - int badType=0; - bool result; - ngTypeEnum ngType; - std::vector contour; - rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput,bool resultInput) - { - rect = rectInput; - defectHeight = defectHeightInput; - defectWidth = defectWidthInput; - result = resultInput; - } - rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput) - { - rect = rectInput; - defectHeight = defectHeightInput; - defectWidth = defectWidthInput; - badType = n; - result = resultInput; - } - rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput, std::vector& contourInput) - { - rect = rectInput; - defectHeight = defectHeightInput; - defectWidth = defectWidthInput; - badType = n; - result = resultInput; - contour = contourInput; - } - rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput, std::vector&contourInput, ngTypeEnum inputNgType) - { - rect = rectInput; - defectHeight = defectHeightInput; - defectWidth = defectWidthInput; - badType = n; - result = resultInput; - contour = contourInput; - ngType = inputNgType; - } -}; - -//计算主线程 -class algoThread : public QThread -{ - Q_OBJECT -public: - - bool m_runFlag = true; - QString threadName; - ~algoThread() - { - this->terminate(); - } - //handleAiModel* modelPtr; - sqlManager* sql; - threadManager* tManager; - sncodeCls* snDatas; - triggerManager* _triggerManager; - - QMutex detQueueMutex; - QQueue> detQueue; - QMutex currentMutex, nextMutex, globalMutex; - - std::string snErrorsnError = std::string("snErrNoSn"); - QMutex* snAndHashMutex; - - int Index = 1; - int areaIndex = 0; - void run(); - bool waitForImg(std::shared_ptr data,int); - void getAllFiles(std::string path, std::vector& files, std::string format); - void Init(threadManager* threadManager) { - tManager = threadManager; - sql = threadManager->sql; - snDatas = &threadManager->snDatas; - } - bool addDetTask(std::shared_ptr );//添加任务 - - //算法 - void ALGO_Correction(std::shared_ptr ); - void ALGO_Inspection(std::shared_ptr ); - void Camera1_Algo(std::shared_ptr ); -signals: - void subThreadStart(); -}; - -//用于记录写入csv的缺陷数据 -class ngNoteCls -{ -public: - struct defectStruct - { - QString Name; - std::vectorValue; - defectStruct(QString nameInput) - { - Name = nameInput; - } - }; - std::unordered_mapngDefectMap; - std::unordered_mapokDefectMap; - std::unordered_map::iterator it; - /// - /// 数据存在返回true,不存在返回false - /// - /// 数据名 - /// - bool checkExisted(QString name, std::unordered_map* map) - { - it = map->find(name); - if (it == map->end()) - { - return false; - } - return true; - } - void insertNgData(QString name) - { - if (checkExisted(name, &ngDefectMap) == false) - { - defectStruct defect(name); - ngDefectMap.insert({ name,defect }); - } - } - void insertNgData(QString name, double width, double height) - { - if (checkExisted(name, &ngDefectMap) == false) - { - defectStruct defect(name); - defect.Value.push_back(width); - defect.Value.push_back(height); - ngDefectMap.insert({ name,defect }); - } - else//负数缺陷大小设0 - { - defectStruct* defect = &it->second; - for (auto& data : defect->Value) - data = 0; - } - } - void insertNgData(QString name, double width, double height, double depth) - { - if (checkExisted(name, &ngDefectMap) == false) - { - defectStruct defect(name); - defect.Value.push_back(width); - defect.Value.push_back(height); - defect.Value.push_back(depth); - ngDefectMap.insert({ name,defect }); - } - else//负数缺陷大小设0 - { - defectStruct* defect = &it->second; - for (auto& data : defect->Value) - data = 0; - } - } - QString getNgSummaryStr() - { - QString str; - for (auto it : ngDefectMap) - { - str += "&MAX-" + it.second.Name + "_("; - if (it.second.Value.size() > 0) - { - for (auto data : it.second.Value) - str += QString::number(data) + "*"; - str.left(str.size() - 1); - } - str += ")"; - } - return str; - } - - void insertOkData(QString name) - { - if (checkExisted(name, &okDefectMap) == false) - { - defectStruct defect(name); - okDefectMap.insert({ name,defect }); - } - } - void insertOkData(QString name, double width, double height) - { - if (checkExisted(name, &okDefectMap) == false) - { - defectStruct defect(name); - defect.Value.push_back(width); - defect.Value.push_back(height); - okDefectMap.insert({ name,defect }); - } - else//负数缺陷大小设0 - { - defectStruct* defect = &it->second; - for (auto& data : defect->Value) - data = 0; - } - } - void insertOkData(QString name, double width, double height, double depth) - { - if (checkExisted(name, &okDefectMap) == false) - { - defectStruct defect(name); - defect.Value.push_back(width); - defect.Value.push_back(height); - defect.Value.push_back(depth); - okDefectMap.insert({ name,defect }); - } - else//负数缺陷大小设0 - { - defectStruct* defect = &it->second; - for (auto& data : defect->Value) - data = 0; - } - } - QString getOkSummaryStr() - { - QString str; - for (auto it : okDefectMap) - { - str += "&OK-" + it.second.Name + "_("; - if (it.second.Value.size() > 0) - { - for (auto data : it.second.Value) - str += QString::number(data) + "*"; - str.left(str.size() - 1); - } - str += ")"; - } - return str; - } -private: - -}; - -//用于储存以及计算需要在图片上屏蔽的区域 -class avoidArea -{ -public: - std::vector>avoidContours; - bool addArea(cv::Mat& detImg, handdleAI::pSegmentation* segPtr)//只取最大的 - { - cv::Mat resMat = ~segPtr->Evaluate(detImg); - int maxIndex = 0, maxArea = 0; - vector>contours; - cv::findContours(resMat, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); - if (contours.size() == 0) - return false; - for (int i = 0; i < contours.size(); i++) - { - int Area = contourArea(contours[i]); - if (Area > maxArea) - { - maxArea = Area; - maxIndex = i; - } - } - if (contours.size() != 0) - { - avoidContours.push_back(contours[maxIndex]); - return true; - } - return false; - } - bool checkOverLap(cv::Point input)//检测与中心点是否重叠 - { - for (auto& contour : avoidContours) - { - if (cv::pointPolygonTest(contour, input, true) >= 0) - { - return true; - } - } - return false; - } - bool checkOverLap(std::vector contourInput) - { - for (auto& contour : avoidContours) - { - if (simpleAlgo::isContoursOverlap(contour, contourInput)==true) - return true; - } - return false; - } -}; - -//用法:先将contour用insertContours插入,然后调用fusionContourToMat生成Mat -class contour2Mat -{ -public: - enum type - { - jiZhuPoSun, - aoKeng, - huaHeng, - max = huaHeng - }; - struct _strcut - { - std::vector contours; - cv::Point offset; - }; - contour2Mat(cv::Size sizeInput) - { - contoursVec.resize(max+1); - offsets.resize(max + 1); - imgSize = sizeInput; - } - contour2Mat() - { - contoursVec.resize(max + 1); - offsets.resize(max + 1); - } - void insertContours(vector contours, type t,cv::Point offset=cv::Point(0,0)) - { - if (contours.size() == 0) - return; - contoursVec[t].push_back({ contours,offset }); - } - cv::Mat fusionContourToMat(type t) - { - cv::Mat res; - res = cv::Mat( - cv::Size( imgSize.width,imgSize.height ), - CV_8UC1, cv::Scalar(0)); - - if (contoursVec[t].size() == 0) - { - cv::copyMakeBorder(res, res, offsets[t].x, 0, offsets[t].y, 0, 1, cv::Scalar(0)); - return res; - } - for (auto& data : contoursVec[t]) - { - cv::Rect rect = cv::boundingRect(data.contours); - if (res.cols < rect.x + rect.width) - cv::copyMakeBorder(res, res, 0, 0, 0, rect.x + rect.width - res.cols, cv::BORDER_CONSTANT, cv::Scalar(0)); - if (res.rows < rect.y + rect.height) - cv::copyMakeBorder(res, res, 0, rect.y + rect.height - res.rows, 0, 0, cv::BORDER_CONSTANT, cv::Scalar(0)); - } - for (auto& data : contoursVec[t]) - { - cv::drawContours(res(cv::Rect(data.offset.x,data.offset.y,imgSize.width-data.offset.x,imgSize.height-data.offset.y)), - vector >(1,data.contours), -1, cv::Scalar(255), -1); - } - return res; - } - void setImgSize(cv::Size sizeInput) - { - imgSize = sizeInput; - } - void setOffSet(cv::Point offsetInput, type t) - { - offsets[t] = offsetInput; - } -private: - cv::Size imgSize; - std::vectoroffsets; - std::vector>contoursVec; -}; - -//用于储存检测结果,以及防止重复画图 //尚不启用 -class rectAndDataCls -{ -public: - vectorrectAndDatas; - void insert(vector& input) - { - if (rectAndDatas.size() == 0)//第一次插入 - { - rectAndDatas = input; - return; - } - else//第2+次插入 需要进行重合判定 - { - for (auto& data : input) - { - bool flag = false; - for (auto& data2 : rectAndDatas)//检查是否重合 - { - if (simpleAlgo::isContoursOverlap(data.contour, data2.contour, 50) == true)//重合部分超过30% - { - flag = true; - data2.contour = simpleAlgo::contourPlusContour(data.contour, data2.contour);//融合 - data2.ngType = max(data.ngType, data2.ngType); - } - } - if (flag == false)// 否 - rectAndDatas.push_back(data); - } - } - } - void insert(vector input) - { - if (rectAndDatas.size() == 0)//第一次插入 - { - rectAndDatas = input; - return; - } - else//第2+次插入 需要进行重合判定 - { - for (auto& data : input) - { - bool flag = false; - for (auto& data2 : rectAndDatas)//检查是否重合 - { - if (simpleAlgo::isContoursOverlap(data.contour, data2.contour, 50) == true)//重合部分超过30% - { - flag = true; - data2.contour = simpleAlgo::contourPlusContour(data.contour, data2.contour);//融合 - data2.ngType = max(data.ngType, data2.ngType); - } - } - if (flag == false)// 否 - rectAndDatas.push_back(data); - } - } - } - void clear() - { - rectAndDatas.clear(); - } -private: - -}; - - -#pragma once diff --git a/HanddleAI/HandleAiUi-new/algo/simpleAlgo.h b/HanddleAI/HandleAiUi-new/algo/simpleAlgo.h new file mode 100644 index 00000000..0632b000 --- /dev/null +++ b/HanddleAI/HandleAiUi-new/algo/simpleAlgo.h @@ -0,0 +1,694 @@ +#include +#include +#include +using namespace HalconCpp; +struct MatchResult { + cv::Rect boundingRect; + double confidence; +}; +// 简单的图像相关算法 + +//融合两张图片白色区域 +static cv::Mat mergeBinaryMats(const cv::Mat& mat1, const cv::Mat& mat2) +{ + // 确保两个输入图像具有相同的尺寸 + if (mat1.size() != mat2.size()) { + std::cerr << "Error: Input images must have the same size." << std::endl; + return cv::Mat(); + } + + // 创建一个输出图像,初始化为全黑 + cv::Mat merged = cv::Mat::zeros(mat1.size(), CV_8U); + + // 将两个输入图像中的白色部分合并到输出图像 + cv::bitwise_or(mat1, mat2, merged); + + return merged; +} +//Rect相加 +cv::Rect rectPlusRect(cv::Rect world, cv::Rect rect) +{ + return cv::Rect(rect.x + world.x, rect.y + world.y, rect.width, rect.height); +} +static cv::Rect findMaxAreaContour(cv::Mat src) +{ + int maxIndex = 0, maxArea = 0; + std::vector>contours; + cv::findContours(src, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + if (contours.size() == 0) + return cv::Rect(0, 0, 0, 0); + for (int i = 0; i < contours.size(); i++) + { + int Area = cv::contourArea(contours[i]); + if (Area > maxArea) + { + maxArea = Area; + maxIndex = i; + } + } + if (contours.size() != 0) + return cv::boundingRect(contours[maxIndex]); + return cv::Rect(0, 0, 0, 0); +} +static cv::Rect findMaxAreaContour(cv::Mat src, int& indexReturn) +{ + int maxIndex = 0, maxArea = 0; + std::vector>contours; + cv::findContours(src, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + if (contours.size() == 0) + return cv::Rect(0, 0, 0, 0); + for (int i = 0; i < contours.size(); i++) + { + int Area = cv::contourArea(contours[i]); + if (Area > maxArea) + { + maxArea = Area; + maxIndex = i; + } + } + if (contours.size() != 0) + { + indexReturn = maxIndex; + return cv::boundingRect(contours[maxIndex]); + } +} +static cv::Mat cutImg2Cls(std::vectorcontour, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)) +{ + if (contour.empty() || imgInput.empty()) { + std::cerr << "Empty contour or input image." << std::endl; + return cv::Mat(); + } + cv::Rect boundingBox = cv::boundingRect(contour); + cv::Point mid(boundingBox.x + boundingBox.width / 2, boundingBox.y + boundingBox.height / 2); + int sideLength = std::max(std::max(boundingBox.width, boundingBox.height), 128); + cv::Mat squareImage(sideLength, sideLength, imgInput.type(), cv::Scalar(0, 0, 0)); + cv::Rect expectRect(mid.x - sideLength / 2, mid.y - sideLength / 2, sideLength, sideLength); + int xOffset = 0; + int yOffset = 0;// (sideLength - boundingBox.height) / 2; + //越界判断 + { + if (expectRect.x < 0) + { + expectRect.width += expectRect.x; + xOffset -= expectRect.x; + expectRect.x = 0; + } + if (expectRect.y < 0) + { + expectRect.height += expectRect.y; + yOffset -= expectRect.y; + expectRect.y = 0; + } + if (expectRect.x + expectRect.width > imgInput.cols) + expectRect.width = imgInput.cols - expectRect.x; + if (expectRect.y + expectRect.height > imgInput.rows) + expectRect.height = imgInput.rows - expectRect.y; + } + imgInput(expectRect).copyTo(squareImage(cv::Rect(xOffset, yOffset, expectRect.width, expectRect.height))); + resize(squareImage, squareImage, targetSize); + return squareImage; +} +static cv::Mat cutImg2Cls(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)) +{ + if (boundingBox.empty() || imgInput.empty()) { + std::cerr << "Empty contour or input image." << std::endl; + return cv::Mat(); + } + cv::Point mid(boundingBox.x + boundingBox.width / 2, boundingBox.y + boundingBox.height / 2); + int sideLength = std::max(std::max(boundingBox.width, boundingBox.height), 128); + cv::Mat squareImage(sideLength, sideLength, imgInput.type(), cv::Scalar(0, 0, 0)); + cv::Rect expectRect(mid.x - sideLength / 2, mid.y - sideLength / 2, sideLength, sideLength); + int xOffset = 0; + int yOffset = 0;// (sideLength - boundingBox.height) / 2; + //越界判断 + { + if (expectRect.x < 0) + { + expectRect.width += expectRect.x; + xOffset -= expectRect.x; + expectRect.x = 0; + } + if (expectRect.y < 0) + { + expectRect.height += expectRect.y; + yOffset -= expectRect.y; + expectRect.y = 0; + } + if (expectRect.x + expectRect.width > imgInput.cols) + expectRect.width = imgInput.cols - expectRect.x; + if (expectRect.y + expectRect.height > imgInput.rows) + expectRect.height = imgInput.rows - expectRect.y; + } + imgInput(expectRect).copyTo(squareImage(cv::Rect(xOffset, yOffset, expectRect.width, expectRect.height))); + resize(squareImage, squareImage, targetSize); + return squareImage; +} +static cv::Mat HObject2Mat(HObject Hobj) //HObject类型转Mat类型 +{ + HTuple htCh; + HString cType; + cv::Mat Image; + ConvertImageType(Hobj, &Hobj, "byte"); + CountChannels(Hobj, &htCh); + Hlong wid = 0; + Hlong hgt = 0; + if (htCh[0].I() == 1) + { + HImage hImg(Hobj); + void* ptr = hImg.GetImagePointer1(&cType, &wid, &hgt);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt); + int W = wid; + int H = hgt; + Image.create(H, W, CV_8UC1); + unsigned char* pdata = static_cast(ptr); + memcpy(Image.data, pdata, W * H); + } + else if (htCh[0].I() == 3) + { + void* Rptr; + void* Gptr; + void* Bptr; + HImage hImg(Hobj); + hImg.GetImagePointer3(&Rptr, &Gptr, &Bptr, &cType, &wid, &hgt); + int W = wid; + int H = hgt; + Image.create(H, W, CV_8UC3); + std::vector VecM(3); + VecM[0].create(H, W, CV_8UC1); + VecM[1].create(H, W, CV_8UC1); + VecM[2].create(H, W, CV_8UC1); + unsigned char* R2 = (unsigned char*)Rptr; + unsigned char* G = (unsigned char*)Gptr; + unsigned char* B = (unsigned char*)Bptr; + memcpy(VecM[2].data, R2, W * H); + memcpy(VecM[1].data, G, W * H); + memcpy(VecM[0].data, B, W * H); + cv::merge(VecM, Image); + } + return Image; +} +enum MatsToHObjectEnum +{ + horizontal, + vertical +}; +static HalconCpp::HObject MatsToHObject(cv::Mat* img1, cv::Mat* img2, MatsToHObjectEnum type) +{ + auto start3 = std::chrono::high_resolution_clock::now(); + HalconCpp::HObject Hobj; + int height = 0; + int width = 0; + switch (type) + { + case horizontal: + width = img1->cols; + height = img1->rows + img2->rows; + break; + case vertical: + width = img1->cols + img2->cols; + height = img1->rows; + break; + } + if (img1->type() == CV_8UC1) + { + unsigned char* imgData = new unsigned char[width * height]; + memcpy(imgData, img1->data, img1->rows * img1->cols); + memcpy(img1->rows * img1->cols + imgData, img2->data, img1->rows * img1->cols); + GenImage1(&Hobj, "byte", width, height, (Hlong)imgData); + delete[]imgData; + imgData = nullptr; + } + auto end3 = std::chrono::high_resolution_clock::now(); + auto duration3 = std::chrono::duration_cast(end3 - start3); + std::cout << "Time taken by functionxxx: " << duration3.count() << " milliseconds" << std::endl; + return Hobj; +} +static HalconCpp::HObject MatsToHObject(cv::Mat& img1, cv::Mat& img2, MatsToHObjectEnum type) +{ + auto start3 = std::chrono::high_resolution_clock::now(); + HalconCpp::HObject Hobj; + int height = 0; + int width = 0; + switch (type) + { + case horizontal: + width = img1.cols; + height = img1.rows + img2.rows; + break; + case vertical: + width = img1.cols + img2.cols; + height = img1.rows; + break; + } + if (img1.type() == CV_8UC1) + { + unsigned char* imgData = new unsigned char[width * height]; + //#pragma omp parallel for + //for (int i = 0; i < 2; i++) + //{ + // switch (i) + // { + // case 0: + // memcpy(imgData, img1.data, img1.rows * img1.cols); + // break; + // case 1: + // memcpy(img1.rows * img1.cols + imgData, img2.data, img1.rows * img1.cols); + // break; + // } + //} + memcpy(imgData, img1.data, img1.rows * img1.cols); + memcpy(img1.rows * img1.cols + imgData, img2.data, img1.rows * img1.cols); + GenImage1(&Hobj, "byte", width, height, (Hlong)imgData); + delete[]imgData; + imgData = nullptr; + } + auto end3 = std::chrono::high_resolution_clock::now(); + auto duration3 = std::chrono::duration_cast(end3 - start3); + std::cout << "Time taken by functionxxx: " << duration3.count() << " milliseconds" << std::endl; + return Hobj; +} +static void MatToHObjectV(cv::Mat& image, HalconCpp::HObject* Hobj) +{ + int hgt = image.rows; + int wid = image.cols; + int i; + if (image.type() == CV_8UC3) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + std::vector imgchannel; + split(image, imgchannel); + cv::Mat imgB = imgchannel[0]; + cv::Mat imgG = imgchannel[1]; + cv::Mat imgR = imgchannel[2]; + uchar* dataR = new uchar[hgt * wid]; + uchar* dataG = new uchar[hgt * wid]; + uchar* dataB = new uchar[hgt * wid]; + for (i = 0; i < hgt; i++) + { + memcpy(dataR + wid * i, imgR.data + imgR.step * i, wid); + memcpy(dataG + wid * i, imgG.data + imgG.step * i, wid); + memcpy(dataB + wid * i, imgB.data + imgB.step * i, wid); + } + himage.GenImage3("byte", wid, hgt, dataR, dataG, dataB); + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPtR, * hImgPtG, * hImgPtB; + himage.GetImagePointer3(&hImgPtR, &hImgPtG, &hImgPtB, &tmpType, &tmpW, &tmpH); + + GenImage3(Hobj, "byte", wid, hgt, (Hlong)hImgPtR, (Hlong)hImgPtG, (Hlong)hImgPtB); + delete[]dataR; + delete[]dataG; + delete[]dataB; + dataR = NULL; + dataG = NULL; + dataB = NULL; + } + else if (image.type() == CV_8UC1) + { + //HalconCpp::HImage himage = HalconCpp::HImage(); + + ////uchar* data = new uchar[hgt * wid]; + ////for (i = 0; i < hgt; i++) + ////{ + //// memcpy(data + wid * i, image.data + image.step * i, wid); + ////} + ////gen_image_const + //himage.GenImage1("byte", wid, hgt, image.data); + + //HalconCpp::HString tmpType; + //Hlong tmpW, tmpH; + //void* hImgPt; + //hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + //GenImage1(&Hobj, "byte", wid, hgt, (Hlong)hImgPt); + GenImage1(Hobj, "byte", wid, hgt, (Hlong)image.data); + + /* delete[] data; + data = NULL;*/ + + } + else if (image.type() == CV_16UC1) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + ushort* data = new ushort[hgt * wid * 2]; + + memcpy(data, image.data, hgt * wid * 2); + + + himage.GenImage1("uint2", wid, hgt, data); + + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPt; + hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + GenImage1(Hobj, "uint2", wid, hgt, (Hlong)hImgPt); + + delete[] data; + data = NULL; + + } + else if (image.type() == CV_16SC1) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + short* data = new short[hgt * wid * 2]; + + memcpy(data, image.data, hgt * wid * 2); + + + himage.GenImage1("int2", wid, hgt, data); + + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPt; + hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + GenImage1(Hobj, "int2", wid, hgt, (Hlong)hImgPt); + + delete[] data; + data = NULL; + + } + +} +static HalconCpp::HObject MatToHObject(cv::Mat& image) +{ + HalconCpp::HObject Hobj; + int hgt = image.rows; + int wid = image.cols; + int i; + if (image.type() == CV_8UC3) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + std::vector imgchannel; + split(image, imgchannel); + cv::Mat imgB = imgchannel[0]; + cv::Mat imgG = imgchannel[1]; + cv::Mat imgR = imgchannel[2]; + uchar* dataR = new uchar[hgt * wid]; + uchar* dataG = new uchar[hgt * wid]; + uchar* dataB = new uchar[hgt * wid]; + for (i = 0; i < hgt; i++) + { + memcpy(dataR + wid * i, imgR.data + imgR.step * i, wid); + memcpy(dataG + wid * i, imgG.data + imgG.step * i, wid); + memcpy(dataB + wid * i, imgB.data + imgB.step * i, wid); + } + himage.GenImage3("byte", wid, hgt, dataR, dataG, dataB); + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPtR, * hImgPtG, * hImgPtB; + himage.GetImagePointer3(&hImgPtR, &hImgPtG, &hImgPtB, &tmpType, &tmpW, &tmpH); + + GenImage3(&Hobj, "byte", wid, hgt, (Hlong)hImgPtR, (Hlong)hImgPtG, (Hlong)hImgPtB); + delete[]dataR; + delete[]dataG; + delete[]dataB; + dataR = NULL; + dataG = NULL; + dataB = NULL; + } + else if (image.type() == CV_8UC1) + { + //HalconCpp::HImage himage = HalconCpp::HImage(); + + ////uchar* data = new uchar[hgt * wid]; + ////for (i = 0; i < hgt; i++) + ////{ + //// memcpy(data + wid * i, image.data + image.step * i, wid); + ////} + ////gen_image_const + //himage.GenImage1("byte", wid, hgt, image.data); + + //HalconCpp::HString tmpType; + //Hlong tmpW, tmpH; + //void* hImgPt; + //hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + //GenImage1(&Hobj, "byte", wid, hgt, (Hlong)hImgPt); + GenImage1(&Hobj, "byte", wid, hgt, (Hlong)image.data); + + /* delete[] data; + data = NULL;*/ + + } + else if (image.type() == CV_16UC1) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + ushort* data = new ushort[hgt * wid * 2]; + + memcpy(data, image.data, hgt * wid * 2); + + + himage.GenImage1("uint2", wid, hgt, data); + + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPt; + hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + GenImage1(&Hobj, "uint2", wid, hgt, (Hlong)hImgPt); + + delete[] data; + data = NULL; + + } + else if (image.type() == CV_16SC1) + { + HalconCpp::HImage himage = HalconCpp::HImage(); + + short* data = new short[hgt * wid * 2]; + + memcpy(data, image.data, hgt * wid * 2); + + + himage.GenImage1("int2", wid, hgt, data); + + HalconCpp::HString tmpType; + Hlong tmpW, tmpH; + void* hImgPt; + hImgPt = himage.GetImagePointer1(&tmpType, &tmpW, &tmpH); + GenImage1(&Hobj, "int2", wid, hgt, (Hlong)hImgPt); + + delete[] data; + data = NULL; + + } + + return Hobj; +} +//获取两点之间的直线距离 +static double getDistance(cv::Point pointO, cv::Point pointA) +{ + double distance; + distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2); + distance = sqrtf(distance); + return distance; +} +//计算角度,pt2为顶点 +static double calculateAngle(cv::Point pt1, cv::Point pt2, cv::Point pt3) +{ + // 计算两个向量 + cv::Point vector1 = pt1 - pt2; + cv::Point vector2 = pt3 - pt2; + + // 计算两个向量的长度 + double length1 = norm(vector1); + double length2 = norm(vector2); + + // 计算两个向量的点积 + double dotProduct = vector1.dot(vector2); + + // 计算夹角的余弦值 + double cosAngle = dotProduct / (length1 * length2); + + // 计算夹角的弧度 + double angleRadians = acos(cosAngle); + + // 将弧度转换为度数 + double angleDegrees = angleRadians * 180 / CV_PI; + + return angleDegrees; +} +//计算角度偏移量,pt1,pt2为第一条线段,pt3,pt4为第二条线段 +static double calculateAngleOffset(cv::Point pt11, cv::Point pt12, cv::Point pt21, cv::Point pt22) +{ + // 计算第一条线段的向量 + cv::Point vec1(pt12.x - pt11.x, pt12.y - pt11.y); + + // 计算第二条线段的向量 + cv::Point vec2(pt22.x - pt21.x, pt22.y - pt21.y); + + // 计算向量的叉乘 + double crossProduct = vec1.x * vec2.y - vec1.y * vec2.x; + + // 计算角度偏移量 + double angleOffset = atan2(crossProduct, vec1.dot(vec2)); + + // 将弧度转换为度数 + angleOffset = angleOffset * 180 / CV_PI; + + return angleOffset; +} +//通过角度计算圆上点的位置 +cv::Point calculatePointOnCircle(cv::Point center, double radius, double angleDegrees) +{ + // 将角度转换为弧度 + double angleRadians = angleDegrees * CV_PI / 180.0; + + // 计算点的坐标 + int x = static_cast(center.x + radius * cos(angleRadians)); + int y = static_cast(center.y + radius * sin(angleRadians)); + + return cv::Point(x, y); +} +/// +/// 模板匹配,以MatchResult返回 +/// +/// 图像 +/// 模板图像 +/// +static MatchResult templateMatching(const cv::Mat& originalImage, const cv::Mat& templateImage) { + MatchResult result; + + // 创建结果图像 + int resultCols = originalImage.cols - templateImage.cols + 1; + int resultRows = originalImage.rows - templateImage.rows + 1; + cv::Mat resultImg(resultRows, resultCols, CV_32FC1); + + // 进行模板匹配 + cv::matchTemplate(originalImage, templateImage, resultImg, cv::TM_CCOEFF_NORMED); + + // 归一化结果图像 + cv::normalize(resultImg, resultImg, 0, 1, cv::NORM_MINMAX, -1, cv::Mat()); + + // 寻找最佳匹配位置 + double minVal, maxVal; + cv::Point minLoc, maxLoc; + cv::minMaxLoc(resultImg, &minVal, &maxVal, &minLoc, &maxLoc); + + // 设置矩形框和可信度 + result.boundingRect = cv::Rect(maxLoc.x, maxLoc.y, templateImage.cols, templateImage.rows); + result.confidence = maxVal; + + return result; +} +/// +/// 模板匹配,返回Rect以及分数 +/// +/// 模板图像 +/// 匹配图像 +/// 分数 +/// +static cv::Rect doMatchTemplate(const cv::Mat& templateImg, const cv::Mat& srcImg, double* sorce) +{ + cv::Mat resultImage; + matchTemplate(srcImg, templateImg, resultImage, cv::TM_CCOEFF_NORMED); + double minVal = 0, maxVal = 0; + cv::Point minLoc(0, 0), maxLoc(0, 0); + minMaxLoc(resultImage, &minVal, &maxVal, &minLoc, &maxLoc); + *sorce = maxVal; + cv::Rect rect(maxLoc.x, maxLoc.y, templateImg.cols, templateImg.rows); + return rect; +} +//计算contour是否重叠 +static bool isContoursOverlap(const std::vector& contour1, const std::vector& contour2, double thresholdPercent = 0) { + cv::Rect rect1 = cv::boundingRect(contour1); + cv::Rect rect2 = cv::boundingRect(contour2); + cv::Size tempImgSize(std::max(rect1.x + rect1.width, rect2.x + rect2.width), std::max(rect1.y + rect1.height, rect2.y + rect2.height)); + cv::Mat binaryImage = cv::Mat::zeros(tempImgSize, CV_8U); + + // 画出目标轮廓 + drawContours(binaryImage, std::vector>{contour2}, 0, cv::Scalar(255), -1); + + double totalOverlap = 0.0; + + + // 创建一个临时的二值图像 + cv::Mat tempBinaryImage = cv::Mat::zeros(tempImgSize, CV_8U); + // 画出当前轮廓 + drawContours(tempBinaryImage, std::vector>{contour1}, 0, cv::Scalar(255), -1); + + // 计算重叠的像素数 + cv::Mat intersection = binaryImage & tempBinaryImage; + int overlapPixelCount = countNonZero(intersection); + + // 计算当前轮廓的重叠百分比 + double overlapPercentage = static_cast(overlapPixelCount) / countNonZero(tempBinaryImage); + + return overlapPercentage * 100.0 > thresholdPercent; // 将结果转换为百分比 +} +//计算rect是否重叠 +static bool isRectOverlap(const cv::Rect& rect1, const cv::Rect& rect2, double thresholdPercent = 0) { + // 计算两个矩形的重叠区域 + cv::Rect intersection = rect1 & rect2; + if (thresholdPercent != 0)//如果有阈值 + { + int maxCnotourArea = std::max(rect1.area(), rect2.area()); + if (intersection.area() / maxCnotourArea < thresholdPercent) + return false; + } + // 如果重叠区域的面积大于0,则说明两个矩形重叠 + return intersection.area() > 0; +} +//将两个contour的区域合并 +static std::vector contourPlusContour(const std::vector& contour1, const std::vector& contour2) + { + std::vectorres; + res.insert(res.end(), contour1.begin(), contour1.end()); + res.insert(res.end(), contour2.begin(), contour2.end()); + return res; + } + +enum ngTypeEnum +{ + OK, + huaHeng, + aoKeng, + zangWu +}; + +struct rectAndData +{ + cv::Rect rect; + double defectHeight; + double defectWidth; + int badType = 0; + bool result; + ngTypeEnum ngType; + std::vector contour; + rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, bool resultInput) + { + rect = rectInput; + defectHeight = defectHeightInput; + defectWidth = defectWidthInput; + result = resultInput; + } + rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput) + { + rect = rectInput; + defectHeight = defectHeightInput; + defectWidth = defectWidthInput; + badType = n; + result = resultInput; + } + rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput, std::vector& contourInput) + { + rect = rectInput; + defectHeight = defectHeightInput; + defectWidth = defectWidthInput; + badType = n; + result = resultInput; + contour = contourInput; + } + rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput, std::vector& contourInput, ngTypeEnum inputNgType) + { + rect = rectInput; + defectHeight = defectHeightInput; + defectWidth = defectWidthInput; + badType = n; + result = resultInput; + contour = contourInput; + ngType = inputNgType; + } +}; +#pragma once \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/back/backEndManager.cpp b/HanddleAI/HandleAiUi-new/back/backEndManager.cpp index 9cda4994..deb25be1 100644 --- a/HanddleAI/HandleAiUi-new/back/backEndManager.cpp +++ b/HanddleAI/HandleAiUi-new/back/backEndManager.cpp @@ -4,15 +4,18 @@ #include #include #include +#include +#include backEndManager::backEndManager() { _jsonConfiguration = new jsonConfiguration(); _detDataManager = new detDataManager(); + _handleAiModelManager = new handleAiModelManager(); + _imgSaveThreadManager = new imgSaveThreadManager(this); _triggerManager = new triggerManager(); _cameraManager = new cameraManager(); _threadManager = new threadManager(); - _handleAiModelManager = new handleAiModelManager(); } void backEndManager::run() { @@ -31,12 +34,15 @@ void backEndManager::run() { std::vector> futures;//异步初始化 + futures.push_back(std::async(std::launch::async, &threadManager::init, _threadManager, this)); futures.push_back(std::async(std::launch::async, &triggerManager::init, _triggerManager, this)); futures.push_back(std::async(std::launch::async, &cameraManager::init, _cameraManager, this)); + futures.push_back(std::async(std::launch::async, &sqlManager::initPara, &_sqlManager, sqlDefaultDatabasePath,true)); futures.push_back(std::async(std::launch::async, &handleAiModelManager::init, _handleAiModelManager,this)); for (auto& future : futures) { future.wait(); } + _imgSaveThreadManager->start(); if (_triggerManager->isInit == true && _cameraManager->isInit == true) isInit = InitOK; else diff --git a/HanddleAI/HandleAiUi-new/back/backEndManager.h b/HanddleAI/HandleAiUi-new/back/backEndManager.h index 900b9f53..dd6f1007 100644 --- a/HanddleAI/HandleAiUi-new/back/backEndManager.h +++ b/HanddleAI/HandleAiUi-new/back/backEndManager.h @@ -4,26 +4,33 @@ #include #include #include +#include class handleAiModelManager; class triggerManager; class cameraManager; class jsonConfiguration; class threadManager; class detDataManager; +class imgSaveThreadManager; class backEndManager :public QThread { Q_OBJECT public: initStatus isInit = NotInit; QMutex mutex; + //数据类 jsonConfiguration* _jsonConfiguration = nullptr; detDataManager* _detDataManager = nullptr; handleAiModelManager* _handleAiModelManager; + sqlManager _sqlManager; + //线程类 + imgSaveThreadManager* _imgSaveThreadManager = nullptr; triggerManager* _triggerManager = nullptr;//触发器 cameraManager* _cameraManager = nullptr;// threadManager* _threadManager = nullptr; + backEndManager(); ~backEndManager(); diff --git a/HanddleAI/HandleAiUi-new/back/cameraManager.cpp b/HanddleAI/HandleAiUi-new/back/cameraManager.cpp index fa43cd4a..489170ef 100644 --- a/HanddleAI/HandleAiUi-new/back/cameraManager.cpp +++ b/HanddleAI/HandleAiUi-new/back/cameraManager.cpp @@ -49,19 +49,19 @@ void camera::run() mutex.lock(); std::shared_ptr data = requestQueue.dequeue(); trigger(); - data->imgMutex.lock(); + data->oriImgMutex.lock(); const unsigned long long timeCode = data->timeCode; while(1) { - getCameraImg(data->imgs); - if (data->imgs.size() >= data->imgAmountMin) + getCameraImg(data->oriImgs); + if (data->oriImgs.size() >= data->imgAmountMin) { - qDebug() << data->timeCode << " Min:" << data->imgAmountMin << " Get:" << data->imgs.size(); + qDebug() << data->timeCode << " Min:" << data->imgAmountMin << " Get:" << data->oriImgs.size(); if (lastUpdateTime.elapsed() > 200)//显示在界面 { lastUpdateTime.start(); // 记录本次更新时间 QPixmap pixmap; - cvMatToQPixMap(data->imgs[0], pixmap); + cvMatToQPixMap(data->oriImgs[0], pixmap); showImgPack* pack = new showImgPack(); pack->img = pixmap; pack->type = imgWidgetOri; @@ -73,7 +73,7 @@ void camera::run() showLost++; qDebug() << cameraModulePtr.moduleName << "Lost show"; } - data->imgMutex.unlock(); + data->oriImgMutex.unlock(); mutex.unlock(); break; } diff --git a/HanddleAI/HandleAiUi-new/back/imgSaveThreadManager.cpp b/HanddleAI/HandleAiUi-new/back/imgSaveThreadManager.cpp index cd50169b..2ea0797d 100644 --- a/HanddleAI/HandleAiUi-new/back/imgSaveThreadManager.cpp +++ b/HanddleAI/HandleAiUi-new/back/imgSaveThreadManager.cpp @@ -10,3 +10,10 @@ imgSaveThreadManager::imgSaveThreadManager(backEndManager* backEndManagerIn) oriSaveThread = new imgSaveThread(oriImgSaveThread,str); resSaveThread = new imgSaveThread(resImgSaveThread,str); } +imgSaveThreadManager::~imgSaveThreadManager() +{ + oriSaveThread->terminate(); + delete oriSaveThread; + resSaveThread->terminate(); + delete resSaveThread; +} \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/back/imgSaveThreadManager.h b/HanddleAI/HandleAiUi-new/back/imgSaveThreadManager.h index 594b0bd9..3153dd82 100644 --- a/HanddleAI/HandleAiUi-new/back/imgSaveThreadManager.h +++ b/HanddleAI/HandleAiUi-new/back/imgSaveThreadManager.h @@ -1,9 +1,10 @@ #include #include #include -#include +#include #include #include +#include class backEndManager; enum imgSaveThreadType { @@ -13,16 +14,6 @@ enum imgSaveThreadType class imgSaveThread :public QThread { public: - struct imgSaveStruct { - std::string cameraKeyName; - std::string SNcode; - std::string customName; - std::string format;//留空则按原图bmp,结果图jpg - int showIndex = -1; - unsigned long long timeCode; - std::vectorimgs; - - }; ~imgSaveThread() { runFlag = false; @@ -46,57 +37,68 @@ public: { while (runFlag) { - while (imgQueue.size()>0) - saveImg(imgQueue.dequeue()); - QThread::msleep(100); + while (imgDataQueue.size()>0) + saveImg(imgDataQueue.dequeue()); + QThread::msleep(1000); } } - void saveImg(imgSaveStruct& data) + void saveImg(std::shared_ptr data) { try { //根据时间获取大概路径 - sqlTableDatas sqlRes = sql->selectSingleData("saveHour", data.SNcode);//查找之前的数据 + //sqlTableDatas sqlRes = sql->selectSingleData("saveHour", data->SNcode);//查找之前的数据 std::string fileSavePath = path; - if (sqlRes.rowDatas.size() > 0 && sqlRes.rowDatas[0][0].value != "")//数据存在 - { - fileSavePath += sqlRes.tableName + "//" + sqlRes.rowDatas[0][0].value + "H//"; - } - else//数据不存在 新建数据 + //if (sqlRes.rowDatas.size() > 0 && sqlRes.rowDatas[0][0].value != "")//数据存在 + //{ + // fileSavePath += sqlRes.tableName + "//" + sqlRes.rowDatas[0][0].value + "H//"; + //} + //else//数据不存在 新建数据 { QDateTime currentDateTime = QDateTime::currentDateTime(); std::string ymd = currentDateTime.toString("yyyy-MM-dd").toStdString(); int h = currentDateTime.time().hour(); fileSavePath += ymd + "//" + std::to_string(h) + "H//"; - sql->addData(data.SNcode, { { "saveHour",std::to_string(h) } }); + //sql->addData(data->SNcode, { { "saveHour",std::to_string(h) } }); } //有SN码就储存在SN码路径,无则储存在相机路径 - if ((data.SNcode).length() != 0) - fileSavePath += data.SNcode + "//"; + if ((data->SNcode).length() != 0) + fileSavePath += data->SNcode + "//"; else - fileSavePath += data.cameraKeyName + "//"; + fileSavePath += data->cameraKeyName.toStdString() + "//"; createDirectoryIfNotExists(fileSavePath);//文件夹处理 std::string fileName; + switch (type) { - for (int i = 0; i < data.imgs.size(); i++) + case oriImgSaveThread: + for (int i = 0; i < data->oriImgs.size(); i++) { - fileName = data.cameraKeyName + "_" + getCurrentDateTime() + "_Count" + std::to_string(i) + ".jpg"; - cv::imwrite(fileSavePath + fileName, data.imgs[i]); - qInfo() << QString::fromStdString(data.cameraKeyName + " ori:" + fileSavePath + fileName); + fileName = data->cameraKeyName.toStdString() + "_" + getCurrentDateTime() + "_Count" + std::to_string(i) + ".jpg"; + cv::imwrite(fileSavePath + fileName, data->oriImgs[i]); + qInfo() << QString::fromStdString(data->cameraKeyName.toStdString() + " ori:" + fileSavePath + fileName); } + break; + case resImgSaveThread: + for (int i = 0; i < data->resultImgs.size(); i++) + { + fileName = data->cameraKeyName.toStdString() + "_" + getCurrentDateTime() + "_Count" + std::to_string(i) + ".jpg"; + cv::imwrite(fileSavePath + fileName, data->resultImgs[i]); + qInfo() << QString::fromStdString(data->cameraKeyName.toStdString() + " ori:" + fileSavePath + fileName); + } + break; } + } catch (...) { return; } } - + QQueue> imgDataQueue; private: - QQueue imgQueue; - + std::string path = ""; std::string basicFormat = ""; imgSaveThreadType type; @@ -107,9 +109,16 @@ class imgSaveThreadManager { public: imgSaveThreadManager(backEndManager* backEndManagerIn); + ~imgSaveThreadManager(); + imgSaveThread* oriSaveThread; + imgSaveThread* resSaveThread; + void start() + { + oriSaveThread->start(); + resSaveThread->start(); + } private: backEndManager* _backEndManager; - imgSaveThread* oriSaveThread; - imgSaveThread* resSaveThread; + }; #pragma once \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/back/threadPoolManager.cpp b/HanddleAI/HandleAiUi-new/back/threadPoolManager.cpp index 526ec5e9..9b337575 100644 --- a/HanddleAI/HandleAiUi-new/back/threadPoolManager.cpp +++ b/HanddleAI/HandleAiUi-new/back/threadPoolManager.cpp @@ -1,11 +1,12 @@ #include #include -#include -#include -/// -/// 检查目标文件夹是否存在,不存在则创建 -/// -/// +#include +#include + +#include +#include +#include + using namespace std; void createDirectoryIfNotExists_2(const std::string& path) { // 检查路径是否存在 @@ -31,21 +32,26 @@ std::string getCurrentDateTime_2() { return ss.str(); } -int threadAmount = 0; -int maxThread = 16; ////////////THREAD//Manager//////////////////////// -threadManager::threadManager(QObject* parent) : QThread(parent) +threadManager::threadManager() { //sql初始化 - sql = new sqlManager; - sql->initPara(); + //sql = new sqlManager; + //sql->initPara(); //辅助线程初始化 //oriSaveThread->oriThread = true; //oriSaveThread->Init(this); - this->start(); + //this->start(); } +void threadManager::init(backEndManager* _backEndManagerIn) +{ + _backEndManager = _backEndManagerIn; + sql = &_backEndManager->_sqlManager; + _imgSaveThreadManager = _backEndManagerIn->_imgSaveThreadManager; + this->start(); +} void threadManager::process() { @@ -59,11 +65,12 @@ void threadManager::process() for (auto it = waitImgData.begin(); it != waitImgData.end();) { std::shared_ptr ptr = *it; - if (ptr->imgs.size() >= ptr->imgAmountMin) + if (ptr->oriImgs.size() >= ptr->imgAmountMin) { - futures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, pinAioEvalute, ptr))); - it = waitImgData.erase(it); + algoFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, ALGO_Inspection, ptr))); processData.push_back(ptr); + + it = waitImgData.erase(it); } else ++it; @@ -73,12 +80,29 @@ void threadManager::process() for (auto it = processData.begin(); it != processData.end();) { std::shared_ptr ptr = *it; - futrueIte = futures.find(ptr->timeCode); - if (futrueIte->second.valid()) + futrueIte = algoFutures.find(ptr->timeCode); + if (futrueIte->second.wait_for(zeroSec)== std::future_status::ready) { - it = processData.erase(it); // 删除元素后,更新迭代器 - futures.erase(futrueIte); - std::async(std::launch::async, &threadManager::resultHandle, this, ptr); + resultData.push_back(ptr); + resultFutures.insert(std::make_pair(ptr->timeCode, std::async(std::launch::async, &threadManager::resultHandle, this, ptr))); + + it = processData.erase(it); + algoFutures.erase(futrueIte); + } + else + ++it; + } +#pragma endregion +#pragma region 等待结果并执行显示图片等操作 + for (auto it = resultData.begin(); it != resultData.end();) + { + std::shared_ptr ptr = *it; + futrueIte = resultFutures.find(ptr->timeCode); + if (futrueIte->second.wait_for(zeroSec) == std::future_status::ready) + { + + it = resultData.erase(it); + resultFutures.erase(futrueIte); } else ++it; @@ -86,9 +110,28 @@ void threadManager::process() #pragma endregion } -void threadManager::resultHandle(std::shared_ptr ) +void threadManager::resultHandle(std::shared_ptr data) { + //储存结果图 + _imgSaveThreadManager->resSaveThread->imgDataQueue.append(data); + //发送图片 + QPixmap pixmap; + cvMatToQPixMap(data->resultImgs[0], pixmap); + showImgPack* pack = new showImgPack(); + pack->img = pixmap; + pack->type = imgWidgetRes; + pack->index = data->oriShowIndex; + emit _backEndManager->sendPixmapImageWidget(pack); + //SQL + std::vector sqlDatas; + for (auto sqlData : data->sqlVec) + sqlDatas.push_back({ sqlData.first, std::to_string(sqlData.second) }); + sql->addData(data->SNcode, sqlDatas); + + //提交清理申请 + detDataManager* dManager = data->dManager; + data->dManager->deleteDetData(data->timeCode); } void threadManager::run() { @@ -115,7 +158,7 @@ threadManager::~threadManager() this->stop(); this->terminate(); processData.clear(); - futures.clear(); + algoFutures.clear(); } ////////////////DET//DATA////////////////// sncodeCls::sncodeCls() diff --git a/HanddleAI/HandleAiUi-new/back/threadPoolManager.h b/HanddleAI/HandleAiUi-new/back/threadPoolManager.h index 56b78bd6..5f5ae1cb 100644 --- a/HanddleAI/HandleAiUi-new/back/threadPoolManager.h +++ b/HanddleAI/HandleAiUi-new/back/threadPoolManager.h @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include @@ -22,42 +22,37 @@ class algoThread; class subThread; class detDataManager; //class detData; -struct saveStruct -{ - std::string filePath; - std::string fileName; - cv::Mat file; -}; -struct MatchResult { - cv::Rect boundingRect; - double confidence; -}; - +class backEndManager; class detData { public: const unsigned long long timeCode = getTimeCode();//根据时间和随机数生成的值,唯一 - QMutex imgMutex; + std::string SNcode; - + QString cameraKeyName; QString algoThreadName; std::string cameraNameStr; correctionStruct* correctionData=nullptr; double camera1Width = 0, camera1Height = 0; - - int algoThreadIndex = -1;//进入第几个算法线程 int cameraIndex = -1; //是第几次拍照 int imgAmountMin = 1; - std::arrayskip; std::vector> sqlVec; - std::vector imgs; + QMutex oriImgMutex; + std::vector oriImgs; + + QMutex resultMutex; std::vector resultImgs; int oriShowIndex = -1;//原图在第几个框展示 int resShowIndex = -1;//结果图在第几个框展示 std::string snErrorsnError = std::string("snErrNoSn"); + std::vector writeBackData; + void writeBack(QString type,int pos, QString value) + { + writeBackData.push_back(QString("write_%1_%2_%3").arg(type).arg(QString::number(pos)).arg(value)); + } detDataManager* dManager=nullptr; static unsigned long long getTimeCode() { auto now = std::chrono::high_resolution_clock::now(); @@ -71,7 +66,6 @@ public: unsigned long long uniqueNumber = (timestamp << 32) | randomValue; return uniqueNumber; } - void Init(QString IN_cameraKeyName, QString IN_algoThreadName, std::string IN_SN, int IN_oriShowIndex) { @@ -103,30 +97,10 @@ public: } ~detData() { - for (auto img : imgs) + for (auto img : oriImgs) img.release(); for (auto img : resultImgs) img.release(); - //delete cameraImgPtr; - } - - void clear() - { - imgs.clear(); - //timeCode = -1; - resShowIndex = -1; - oriShowIndex = -1; - algoThreadIndex = -1; - cameraIndex = -1; - //snCountIndex = -1; - std::string SNcode = ""; - } - bool isEmpty() - { - if (imgs.size() == 0) - return true; - else - return false; } }; class detDataManager @@ -184,7 +158,7 @@ public: auto it = map.find(timeCode); if (it != map.end()) { - it->second->imgMutex.lock(); + it->second->oriImgMutex.lock(); //delete it->second; map.erase(it); dataMutex.unlock(); @@ -223,14 +197,13 @@ class threadManager : public QThread Q_OBJECT public: - explicit threadManager(QObject* parent = nullptr); - QQueue> detDataQueue; + threadManager(); + sqlManager* sql; - //handleAiModel models;//初始化模型 + imgSaveThreadManager* _imgSaveThreadManager; + QQueue> detDataQueue; autoDelete* autoDeleteThread; - - - + void init(backEndManager* _backEndManagerIn); void run(); void stop() { @@ -249,14 +222,22 @@ public: QQueue>insertQueue; void process(); private: - std::list> waitImgData; - std::list> processData; - std::unordered_map> futures; + backEndManager* _backEndManager; + std::list> waitImgData;//等待图片 + std::list> processData;//处理中 + std::list> resultData;//等待结果 + + std::unordered_map> algoFutures; + std::unordered_map> resultFutures; + + std::chrono::seconds zeroSec = std::chrono::seconds(0); std::unordered_map>::iterator futrueIte; bool runFlag = true; QList>imgWaitList; std::vector>deleteVec; +signals: + }; #pragma once diff --git a/HanddleAI/HandleAiUi-new/back/triggerManager.cpp b/HanddleAI/HandleAiUi-new/back/triggerManager.cpp index f8c9e156..06f2e39e 100644 --- a/HanddleAI/HandleAiUi-new/back/triggerManager.cpp +++ b/HanddleAI/HandleAiUi-new/back/triggerManager.cpp @@ -20,12 +20,12 @@ void triggerManager::decodeCameraCMD(QByteArray byte) } //if (checkTrigger(2, 2, byte) == true) { - std::shared_ptr data = dManager->insertDetData("Camera1", "Thread2", "TEST", 0); + std::shared_ptr data = dManager->insertDetData("Camera1", "Thread2", "TEST", 1); data->correctionData = correctionData; _threadManager->addTask(data);//添加任务 - auto camera = _cameraManager->cameras.find("456"); - if (camera != _cameraManager->cameras.end()) - camera->second->Process(data); + //auto camera = _cameraManager->cameras.find("456"); + //if (camera != _cameraManager->cameras.end()) + // camera->second->Process(data); } return; #endif diff --git a/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.cpp b/HanddleAI/HandleAiUi-new/front/pages/sqlControlWidget.cpp similarity index 79% rename from HanddleAI/HandleAiUi-new/front/pages/sqliteReader.cpp rename to HanddleAI/HandleAiUi-new/front/pages/sqlControlWidget.cpp index 5599066a..d83676b4 100644 --- a/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.cpp +++ b/HanddleAI/HandleAiUi-new/front/pages/sqlControlWidget.cpp @@ -1,30 +1,32 @@ -#include "sqliteReader.h" +#include +#include #include #include #include #include #include +#include +#include - -sqliteReader::sqliteReader(QWidget *parent) - : QMainWindow(parent) +sqliteReader::sqliteReader() { - ui.setupUi(this); + return; readIniFile(".//config//sqliteReader.ini"); - sqlManager.initPara(); - std::vector res=sqlManager.GetTables(); + //_sqlManager.initPara(); + std::vector res; + _sqlManager->GetTables(res); widgetInit(res); } sqliteReader::~sqliteReader() { - sqlManager.uninitlize(); + //_sqlManager.uninitlize(); } void sqliteReader::widgetInit(std::vectortables) { //1 layout1 = new QVBoxLayout(); - ui.centralWidget->setLayout(layout1); + this->setLayout(layout1); //1-1 QWidget* vLayout2Widget = new QWidget(); @@ -61,14 +63,14 @@ void sqliteReader::widgetInit(std::vectortables) } void sqliteReader::switchWidget(std::string tableName) { - std::vector res = sqlManager.getAllData(tableName); + sqlTableDatas res = _sqlManager->selectAllData(tableName); tableWidget->clear(); delete tableWidget; tableWidget = new QTableWidget(); layout1->addWidget(tableWidget); - if (res.size() > 0) + if (res.rowDatas.size() > 0) { - int colsNum = res.at(0).dataVec.size() + 1 - avoidMap.size(); + int colsNum = res.rowDatas[0].size() + 1 - avoidMap.size(); tableWidget->setColumnCount(colsNum); tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN")); //for (int i = 0; i < res.at(0).dataVec.size(); i++) @@ -77,12 +79,12 @@ void sqliteReader::switchWidget(std::string tableName) std::unordered_map::iterator it; std::unordered_map::iterator it2; - for (auto&data : res.at(0).dataVec) + for (auto&data : res.rowDatas[0]) { - it = avoidMap.find(QString::fromStdString(data.dataName)); + it = avoidMap.find(QString::fromStdString(data.key)); if (it == avoidMap.end()) { - QString Name = QString::fromStdString(data.dataName); + QString Name = QString::fromStdString(data.key); it2 = cuttomName.find(Name); if (it2 != cuttomName.end()) Name = it2->second; @@ -92,24 +94,24 @@ void sqliteReader::switchWidget(std::string tableName) } } //tableWidget->setColumnCount(res.size()); - for (int i = 0; i < res.size(); i++) + for (int i = 0; i < res.rowDatas.size(); i++) { int row = tableWidget->rowCount(); tableWidget->insertRow(row); - tableWidget->setItem(row, 0, new QTableWidgetItem(QString::fromStdString(res[i].SN))); + /*tableWidget->setItem(row, 0, new QTableWidgetItem(QString::fromStdString(res.rowDatas[i]))); { int index = 1; std::unordered_map::iterator it; - for (auto&data : res.at(i).dataVec) + for (auto& data : res.rowDatas[i]) { - it = avoidMap.find(QString::fromStdString(data.dataName)); + it = avoidMap.find(QString::fromStdString(data.key)); if (it == avoidMap.end()) { tableWidget->setItem(row, index, new QTableWidgetItem(QString::fromStdString(data.valueText))); index ++; } } - } + }*/ } } @@ -117,25 +119,25 @@ void sqliteReader::switchWidget(std::string tableName) } void sqliteReader::searchSN(std::string tableName, std::string SN) { - sqlDataStruct res = sqlManager.selectData(SN,tableName); + sqlTableDatas res = _sqlManager->selectAllData(SN); tableWidget->clear(); delete tableWidget; tableWidget = new QTableWidget(); layout1->addWidget(tableWidget); - if (res.SN.compare(""))//非空 + if (res.rowDatas.size()>0)//非空 { - tableWidget->setColumnCount(res.dataVec.size() - avoidMap.size()); + tableWidget->setColumnCount(res.rowDatas[0].size() - avoidMap.size()); //tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN")); { int index = 0; std::unordered_map::iterator it; std::unordered_map::iterator it2; - for (auto&data : res.dataVec) + for (auto&data : res.rowDatas[0]) { - it = avoidMap.find(QString::fromStdString(data.dataName)); + it = avoidMap.find(QString::fromStdString(data.key)); if (it == avoidMap.end()) { - QString Name = QString::fromStdString(data.dataName); + QString Name = QString::fromStdString(data.key); it2 = cuttomName.find(Name); if (it2 != cuttomName.end()) Name = it2->second; @@ -152,12 +154,12 @@ void sqliteReader::searchSN(std::string tableName, std::string SN) { int index = 0; std::unordered_map::iterator it; - for (auto&data : res.dataVec) + for (auto&data : res.rowDatas[0]) { - it = avoidMap.find(QString::fromStdString(data.dataName)); + it = avoidMap.find(QString::fromStdString(data.key)); if (it == avoidMap.end()) { - tableWidget->setItem(row, index, new QTableWidgetItem(QString::fromStdString(data.valueText))); + tableWidget->setItem(row, index, new QTableWidgetItem(QString::fromStdString(data.value))); index++; } } @@ -165,7 +167,7 @@ void sqliteReader::searchSN(std::string tableName, std::string SN) } else { - tableWidget->setColumnCount(res.dataVec.size() + 1); + tableWidget->setColumnCount(res.rowDatas[0].size() + 1); tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN")); tableWidget->setColumnCount(1); diff --git a/HanddleAI/HandleAiUi-new/front/pages/sqlControlWidget.h b/HanddleAI/HandleAiUi-new/front/pages/sqlControlWidget.h index 54f8fcaf..9fcae6c0 100644 --- a/HanddleAI/HandleAiUi-new/front/pages/sqlControlWidget.h +++ b/HanddleAI/HandleAiUi-new/front/pages/sqlControlWidget.h @@ -1,4 +1,28 @@ #include +#include +#include +#include +#include +#include +#include + +class sqliteReader : public QWidget +{ + Q_OBJECT + +public: + sqliteReader(); + ~sqliteReader(); + QVBoxLayout* layout1; + QTableWidget* tableWidget; + sqlManager* _sqlManager; + std::unordered_mapavoidMap;//不显示该数据 + std::unordered_mapcuttomName;//自定义列名 + void widgetInit(std::vectortables); + void switchWidget(std::string tableNam); + void searchSN(std::string tableNam, std::string SN); + bool readIniFile(const QString& filePath); +}; class sqlControlWidget :public QWidget { public: @@ -12,7 +36,7 @@ public: std::vectorbtns; QLabel* icon, * Title; QStackedWidget* widgets = new QStackedWidget(); - + sqliteReader _sqliteReader; QLabel* disconnnectedLabel = new QLabel("服务已离线"); sqlControlWidget() { @@ -49,9 +73,8 @@ public: Layout->addLayout(btnLayout); - + Layout->addWidget(&_sqliteReader); } }; -#pragma once #pragma once \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.h b/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.h deleted file mode 100644 index e8df16aa..00000000 --- a/HanddleAI/HandleAiUi-new/front/pages/sqliteReader.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include -#include "ui_sqliteReader.h" -#include "sqlControler.h" -#include -#include -#include -class sqliteReader : public QMainWindow -{ - Q_OBJECT - -public: - sqliteReader(QWidget *parent = nullptr); - ~sqliteReader(); - QVBoxLayout * layout1; - QTableWidget* tableWidget; - sqlManager sqlManager; - std::unordered_mapavoidMap;//不显示该数据 - std::unordered_mapcuttomName;//自定义列名 - void widgetInit(std::vectortables); - void switchWidget(std::string tableNam); - void searchSN(std::string tableNam,std::string SN); - bool readIniFile(const QString &filePath); -private: - Ui::sqliteReaderClass ui; -}; diff --git a/HanddleAI/HandleAiUi-new/sqliteManager/sqlBase.h b/HanddleAI/HandleAiUi-new/sqlManager/sqlBase.h similarity index 100% rename from HanddleAI/HandleAiUi-new/sqliteManager/sqlBase.h rename to HanddleAI/HandleAiUi-new/sqlManager/sqlBase.h diff --git a/HanddleAI/HandleAiUi-new/sqlManager/sqlManager.cpp b/HanddleAI/HandleAiUi-new/sqlManager/sqlManager.cpp new file mode 100644 index 00000000..cef168ec --- /dev/null +++ b/HanddleAI/HandleAiUi-new/sqlManager/sqlManager.cpp @@ -0,0 +1,181 @@ + +#include +#include + +sqlManager::sqlError sqlManager::GetTables(std::vector& input) +{ + return success; +} +std::vector getFutureDates(int days) +{ + std::vector futureDates; + + // 鑾峰彇褰撳墠鏃堕棿鐐� + auto now = std::chrono::system_clock::now(); + + for (int i = 0; i < days; i++) { + // 灏嗗綋鍓嶆椂闂寸偣鍔犱笂鎸囧畾澶╂暟 + auto future = now + std::chrono::hours(24 * i); + + // 灏嗘椂闂磋浆鎹负鏃堕棿缁撴瀯浣� + std::time_t futureTime = std::chrono::system_clock::to_time_t(future); + + // 灏嗘椂闂寸粨鏋勪綋鏍煎紡鍖栦负 "骞存湀鏃�" 鐨勫瓧绗︿覆 + std::tm* futureTm = std::localtime(&futureTime); + std::ostringstream oss; + oss << futureTm->tm_year + 1900 << '-' << std::setw(2) << std::setfill('0') << futureTm->tm_mon + 1 + << '-' << std::setw(2) << std::setfill('0') << futureTm->tm_mday; + + futureDates.push_back(oss.str()); + } + + return futureDates; +} +std::string getCurrentDate() +{ + std::time_t now = std::time(nullptr); + std::tm* localTime = std::localtime(&now); + + std::ostringstream oss; + oss << localTime->tm_year + 1900 << "-" + << std::setw(2) << std::setfill('0') << localTime->tm_mon + 1 << "-" + << std::setw(2) << std::setfill('0') << localTime->tm_mday; + + return oss.str(); +} +std::string getPreviousDate() +{ + std::time_t now = std::time(nullptr); + + const std::time_t oneDay = 24 * 60 * 60; + std::time_t previousTime = now - oneDay; + + std::tm* previousLocalTime = std::localtime(&previousTime); + + std::ostringstream oss; + oss << previousLocalTime->tm_year + 1900 << "-" + << std::setw(2) << std::setfill('0') << previousLocalTime->tm_mon + 1 << "-" + << std::setw(2) << std::setfill('0') << previousLocalTime->tm_mday; + + return oss.str(); +} +void sqlManager::uninitlize() +{ + sqlite3_close(db); +} +sqlTableDatas sqlManager::selectSingleData(std::string selectStr, std::string SN) +{ + sqlTableDatas selectResult; + dbPtr->Select(getCurrentDate(), { selectStr }, "SN", SN, selectResult); + if (selectResult.rowDatas.size() == 0)//鏃犳寚瀹氭暟鎹� 鏌ユ壘鍓嶄竴澶� + dbPtr->Select(getPreviousDate(), { selectStr }, "SN", SN, selectResult); + + return selectResult; +} +sqlTableDatas sqlManager::selectAllData(std::string SN) +{ + //dbPtr->Update(getCurrentTableName(), { {"send","1" } }, "sn", SN); + sqlTableDatas selectResult; + dbPtr->Select(getCurrentDate(), {}, "SN", SN, selectResult); + if(selectResult.rowDatas.size()==0)//鏃犳寚瀹氭暟鎹� 鏌ユ壘鍓嶄竴澶� + dbPtr->Select(getPreviousDate(), {}, "SN", SN, selectResult); + return selectResult; +} +void sqlManager::initPara(std::string dataBasePath, bool backup) +{ + std::cout << "SQL runing Init..." << std::endl; + dbPtr = new sqliteModule(dataBasePath);//鍒濆鍖� + dbPtr->backup(dataBasePath + getCurrentDate() + ".db");//澶囦唤 + std::vectortables = getFutureDates(180); + + //鏁村悎鎵�闇�瑕佺殑鏁版嵁鍚� + std::vectordataStr; + for (auto data : bridge.back.json.summaryData.datas) + dataStr.push_back(data.first.toStdString()); + + //鍒涘缓鏈潵180澶╃殑琛ㄦ牸 + for (auto table : tables) + dbPtr->createTable(table, dataStr); + + //鏌ヨ鏄惁鏈夊悗鏈熸坊鍔犳湭鍒涘缓鐨勮〃鏍� + for (auto table : tables) + { + std::vector res = dbPtr->getColumn(table); + std::unordered_map map; + for (auto str : res) + map.insert({ str,0 }); + + for (auto str : dataStr)//鍒ゆ柇姝ゅ�兼槸鍚﹀瓨鍦� + { + auto iter = map.find(str);//瀵绘壘 + if (iter == map.end())//鎵句笉鍒� + { + dbPtr->addColumn(table, str, "REAL");//鎻掑叆 + } + } + } + std::cout << "SQL init end" << std::endl; + //std::vector dataVec = { + //{"_2DPResult" , "8096"}, + //{"_2DNResult" , "8097"}, + //{"_3DResult" , "8098"}, + + //{"P_JiZhuZangWu" , "6120"}, + //{"P_JiZhuHuaHeng" , "6121"}, + //{"P_JueYuanQuanFanHuang" , "6122"}, + //{"P_JiZhuAoDian" , "6123"}, + //{"P_LvDingHanJie" , "6124"}, + //{"P_JiZhuCanQue" , "6125"}, + //{"P_JueYuanPianPoSun" , "6126"}, + //{"P_LvDingBianSe" , "6127"}, + //{"P_JueYuanPianYiWu" , "6128"}, + //{"P_HanJieQuYiWu" , "6129"}, + //{"P_HanJieQuZangWu" , "6130"}, + + //{"N_GaiBanZangWu" , "6140"}, + //{"N_GaiBanHuaHeng" , "6141"}, + //{"N_JueYuanQuanFengKouWaiXie" , "6142"}, + //{"N_JueYuanQuanFanHuang" , "6143"}, + //{"N_GaiBanTuDian" , "6144"}, + //{"N_JueYuanPianPoSun" , "6145"}, + //{"N_JueYuanPianYiWu" , "6146"}, + //{"N_HanJieQuYiWu" , "6147"}, + //{"N_HanJieQuZangWu" , "6148"}, + + //{"_3D_LvDingHanJieTuQi" , "6161"}, + //{"_3D_LvDingHanJieZhaHan" , "6161"}, + //{"_3D_HanJieQuYiWu" , "6162"}, + //{"_3D_HanJieQuZangWu" , "6163"} + //}; + //addData("12345", dataVec); + +} +bool sqlManager::addData(std::string SN,std::vector data) +{ + if (SN.empty())//SN鐮佷负绌猴紝灏嗗仠姝㈠鐞� + { + qDebug() << "[INFO] " << " SN empty!"; + return false; + } + sqlTableDatas selectResult; + std::string currentTableName = getCurrentDate(); + sqlErr res=dbPtr->Select(currentTableName, {},"sn", SN, selectResult); + if (res != sqlOK) + { + qDebug() << "[INFO] " << "select False SN:"<Update(currentTableName, data, "sn", SN); + return true; + } + + res= dbPtr->Insert(currentTableName, SN, data); + if (res == sqlFalse) + { + for (auto keyName : data) + dbPtr->addColumn(currentTableName, keyName.key, "text"); + } + return true; +} diff --git a/HanddleAI/HandleAiUi-new/sqliteManager/sqlManager.h b/HanddleAI/HandleAiUi-new/sqlManager/sqlManager.h similarity index 64% rename from HanddleAI/HandleAiUi-new/sqliteManager/sqlManager.h rename to HanddleAI/HandleAiUi-new/sqlManager/sqlManager.h index f8f202b9..6c356c2d 100644 --- a/HanddleAI/HandleAiUi-new/sqliteManager/sqlManager.h +++ b/HanddleAI/HandleAiUi-new/sqlManager/sqlManager.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include "sqlStruct.h" #define sqlDefaultDatabasePath ".//sqlDatabase//sqlite-database.db" @@ -20,15 +20,16 @@ class sqlManager : public QObject { Q_OBJECT public: - //void update(std::string,std::vector); - //sqlColDatas select(std::vectorselectStr, std::string, std::string); - //sqlRowDatas selectRow(std::string SN, std::string Key,std::string Value); - //sqlColDatas selectCol(std::vectorselectStr); - //sqlErr insert(std::string, std::vector); + enum sqlError + { + success, + error, + notfound + }; sqlTableDatas selectSingleData(std::string selectStr, std::string SN); sqlTableDatas selectAllData(std::string SN); - //sqlTableDatas selectAllData(std::string tableName = ""); - //sqlRowDatas selectData(std::string name, std::string value, std::string tableName = ""); + + sqlError GetTables(std::vector& input);//获取所有列名 void initPara(std::string dataBasePath = sqlDefaultDatabasePath,bool backUp=true); bool addData(std::string SN, std::vector data); int checktSn(std::string sn); diff --git a/HanddleAI/HandleAiUi-new/sqliteManager/sqlStruct.h b/HanddleAI/HandleAiUi-new/sqlManager/sqlStruct.h similarity index 100% rename from HanddleAI/HandleAiUi-new/sqliteManager/sqlStruct.h rename to HanddleAI/HandleAiUi-new/sqlManager/sqlStruct.h diff --git a/HanddleAI/HandleAiUi-new/sqliteManager/sqliteModule.cpp b/HanddleAI/HandleAiUi-new/sqlManager/sqliteModule.cpp similarity index 99% rename from HanddleAI/HandleAiUi-new/sqliteManager/sqliteModule.cpp rename to HanddleAI/HandleAiUi-new/sqlManager/sqliteModule.cpp index fd8c35fe..1a1d0e82 100644 --- a/HanddleAI/HandleAiUi-new/sqliteManager/sqliteModule.cpp +++ b/HanddleAI/HandleAiUi-new/sqlManager/sqliteModule.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/HanddleAI/HandleAiUi-new/sqliteManager/sqliteModule.h b/HanddleAI/HandleAiUi-new/sqlManager/sqliteModule.h similarity index 100% rename from HanddleAI/HandleAiUi-new/sqliteManager/sqliteModule.h rename to HanddleAI/HandleAiUi-new/sqlManager/sqliteModule.h diff --git a/HanddleAI/HandleAiUi-new/sqliteManager/sqlManager.cpp b/HanddleAI/HandleAiUi-new/sqliteManager/sqlManager.cpp deleted file mode 100644 index 04ddd3a1..00000000 --- a/HanddleAI/HandleAiUi-new/sqliteManager/sqlManager.cpp +++ /dev/null @@ -1,409 +0,0 @@ - -#include -#include -//鑰佷唬鐮� -std::vector getFutureDates(int days) -{ - std::vector futureDates; - - // 鑾峰彇褰撳墠鏃堕棿鐐� - auto now = std::chrono::system_clock::now(); - - for (int i = 0; i < days; i++) { - // 灏嗗綋鍓嶆椂闂寸偣鍔犱笂鎸囧畾澶╂暟 - auto future = now + std::chrono::hours(24 * i); - - // 灏嗘椂闂磋浆鎹负鏃堕棿缁撴瀯浣� - std::time_t futureTime = std::chrono::system_clock::to_time_t(future); - - // 灏嗘椂闂寸粨鏋勪綋鏍煎紡鍖栦负 "骞存湀鏃�" 鐨勫瓧绗︿覆 - std::tm* futureTm = std::localtime(&futureTime); - std::ostringstream oss; - oss << futureTm->tm_year + 1900 << '-' << std::setw(2) << std::setfill('0') << futureTm->tm_mon + 1 - << '-' << std::setw(2) << std::setfill('0') << futureTm->tm_mday; - - futureDates.push_back(oss.str()); - } - - return futureDates; -} -std::string getCurrentDate() -{ - std::time_t now = std::time(nullptr); - std::tm* localTime = std::localtime(&now); - - std::ostringstream oss; - oss << localTime->tm_year + 1900 << "-" - << std::setw(2) << std::setfill('0') << localTime->tm_mon + 1 << "-" - << std::setw(2) << std::setfill('0') << localTime->tm_mday; - - return oss.str(); -} -std::string getPreviousDate() -{ - std::time_t now = std::time(nullptr); - - const std::time_t oneDay = 24 * 60 * 60; - std::time_t previousTime = now - oneDay; - - std::tm* previousLocalTime = std::localtime(&previousTime); - - std::ostringstream oss; - oss << previousLocalTime->tm_year + 1900 << "-" - << std::setw(2) << std::setfill('0') << previousLocalTime->tm_mon + 1 << "-" - << std::setw(2) << std::setfill('0') << previousLocalTime->tm_mday; - - return oss.str(); -} -void sqlManager::uninitlize() -{ - sqlite3_close(db); -} -sqlTableDatas sqlManager::selectSingleData(std::string selectStr, std::string SN) -{ - sqlTableDatas selectResult; - dbPtr->Select(getCurrentDate(), { selectStr }, "SN", SN, selectResult); - if (selectResult.rowDatas.size() == 0)//鏃犳寚瀹氭暟鎹� 鏌ユ壘鍓嶄竴澶� - dbPtr->Select(getPreviousDate(), { selectStr }, "SN", SN, selectResult); - - return selectResult; -} -sqlTableDatas sqlManager::selectAllData(std::string SN) -{ - //dbPtr->Update(getCurrentTableName(), { {"send","1" } }, "sn", SN); - sqlTableDatas selectResult; - dbPtr->Select(getCurrentDate(), {}, "SN", SN, selectResult); - if(selectResult.rowDatas.size()==0)//鏃犳寚瀹氭暟鎹� 鏌ユ壘鍓嶄竴澶� - dbPtr->Select(getPreviousDate(), {}, "SN", SN, selectResult); - return selectResult; -} -void sqlManager::initPara(std::string dataBasePath, bool backup) -{ - std::cout << "SQL runing Init..." << std::endl; - dbPtr = new sqliteModule(dataBasePath);//鍒濆鍖� - dbPtr->backup(dataBasePath + getCurrentDate() + ".db");//澶囦唤 - std::vectortables = getFutureDates(180); - - //鏁村悎鎵�闇�瑕佺殑鏁版嵁鍚� - std::vectordataStr; - for (auto data : bridge.back.json.summaryData.datas) - dataStr.push_back(data.first.toStdString()); - - //鍒涘缓鏈潵180澶╃殑琛ㄦ牸 - for (auto table : tables) - dbPtr->createTable(table, dataStr); - - //鏌ヨ鏄惁鏈夊悗鏈熸坊鍔犳湭鍒涘缓鐨勮〃鏍� - for (auto table : tables) - { - std::vector res = dbPtr->getColumn(table); - std::unordered_map map; - for (auto str : res) - map.insert({ str,0 }); - - for (auto str : dataStr)//鍒ゆ柇姝ゅ�兼槸鍚﹀瓨鍦� - { - auto iter = map.find(str);//瀵绘壘 - if (iter == map.end())//鎵句笉鍒� - { - dbPtr->addColumn(table, str, "REAL");//鎻掑叆 - } - } - } - std::cout << "SQL init end" << std::endl; - //std::vector dataVec = { - //{"_2DPResult" , "8096"}, - //{"_2DNResult" , "8097"}, - //{"_3DResult" , "8098"}, - - //{"P_JiZhuZangWu" , "6120"}, - //{"P_JiZhuHuaHeng" , "6121"}, - //{"P_JueYuanQuanFanHuang" , "6122"}, - //{"P_JiZhuAoDian" , "6123"}, - //{"P_LvDingHanJie" , "6124"}, - //{"P_JiZhuCanQue" , "6125"}, - //{"P_JueYuanPianPoSun" , "6126"}, - //{"P_LvDingBianSe" , "6127"}, - //{"P_JueYuanPianYiWu" , "6128"}, - //{"P_HanJieQuYiWu" , "6129"}, - //{"P_HanJieQuZangWu" , "6130"}, - - //{"N_GaiBanZangWu" , "6140"}, - //{"N_GaiBanHuaHeng" , "6141"}, - //{"N_JueYuanQuanFengKouWaiXie" , "6142"}, - //{"N_JueYuanQuanFanHuang" , "6143"}, - //{"N_GaiBanTuDian" , "6144"}, - //{"N_JueYuanPianPoSun" , "6145"}, - //{"N_JueYuanPianYiWu" , "6146"}, - //{"N_HanJieQuYiWu" , "6147"}, - //{"N_HanJieQuZangWu" , "6148"}, - - //{"_3D_LvDingHanJieTuQi" , "6161"}, - //{"_3D_LvDingHanJieZhaHan" , "6161"}, - //{"_3D_HanJieQuYiWu" , "6162"}, - //{"_3D_HanJieQuZangWu" , "6163"} - //}; - //addData("12345", dataVec); - -} -bool sqlManager::addData(std::string SN,std::vector data) -{ - if (SN.empty())//SN鐮佷负绌猴紝灏嗗仠姝㈠鐞� - { - qDebug() << "[INFO] " << " SN empty!"; - return false; - } - sqlTableDatas selectResult; - sqlErr res=dbPtr->Select(getCurrentDate(), {},"sn", SN, selectResult); - if (res != sqlOK) - { - qDebug() << "[INFO] " << "select False SN:"<Insert(getCurrentDate(), SN, data); - } - else//宸插瓨鍦ㄧ浉鍚孲N鐨勬暟鎹�,灏嗚繘琛屾洿鏂版搷浣� - { - dbPtr->Update(getCurrentDate(), data,"sn", SN); - } - return true; -} - -#if 0 -void sqlManager::checkCol(sqlite3* db, std::string tableName, std::string columnName) -{ - try - { - // 鎵ц鏌ヨ锛屾鏌ヨ〃鏄惁瀛樺湪骞朵笖鍖呭惈鎸囧畾鐨勫垪 - const char* query = "SELECT sql FROM sqlite_master WHERE type='table' AND name=?"; - sqlite3_stmt* stmt; - int rc = sqlite3_prepare_v2(db, query, -1, &stmt, nullptr); - - if (rc != SQLITE_OK) { - std::cerr << "鏃犳硶鍑嗗鏌ヨ: " << sqlite3_errmsg(db) << std::endl; - } - sqlite3_bind_text(stmt, 1, tableName.c_str(), -1, SQLITE_STATIC); - - if (sqlite3_step(stmt) == SQLITE_ROW) { - // 琛ㄥ瓨鍦紝鐜板湪妫�鏌ユ槸鍚﹀寘鍚寚瀹氱殑鍒� - const char* tableDefinition = reinterpret_cast(sqlite3_column_text(stmt, 0)); - if (sqlite3_strlike(columnName.c_str(), tableDefinition, 0)) { - //std::cout << "table '" << tableName << "' exist and true '" << columnName << "'" << std::endl; - } - else { - std::cout << "table '" << tableName << "' exist ,but not true '" << columnName << "'" << std::endl; - } - } - - // 娓呯悊璧勬簮 - sqlite3_finalize(stmt); - - } - - catch (std::exception& e) { - std::cerr << "SQLite寮傚父: " << e.what() << std::endl; - } - -} -sqlDataStruct sqlManager::selectData(std::string SN, int send) -{ - std::string query; - int rc; - //send璁総rue - { - query = "UPDATE \'" + getCurrentTableName() + "\' SET send = " + std::to_string(send) + " WHERE sn = \'" + SN + "\' ; "; - if (debugMode == true) - { - std::cout << query << endl; - qDebug() << "sql query:" << QString::fromStdString(query); - } - rc = sqlite3_exec(db, query.c_str(), nullptr, nullptr, nullptr); - } - - ////////////////////////////// - query = "SELECT * FROM \'" + getCurrentTableName() + "\' WHERE sn =\'" + SN + "\' ; "; - - if (debugMode == true) - { - std::cout << query << endl; - qDebug() << "sql query:" << QString::fromStdString(query); - } - - std::vector rowData; - sqlDataStruct Respone; - rc = sqlite3_exec(db, query.c_str(), callback, &rowData, 0); - if (rc != SQLITE_OK) { - std::cerr << "Failed to execute query: " << sqlite3_errmsg(db) << std::endl; - } - else - { - Respone.SN = SN; - Respone.dataVec.swap(rowData); - Respone.tableName = getCurrentTableName(); - } - return Respone; -} -int sqlManager::checktSn(std::string SN) -{ - return 0; - std::string query = "SELECT COUNT(*) FROM \'" + getCurrentTableName() + "\' WHERE sn LIKE '" + SN + "%'; "; - if (debugMode == true) - { - std::cout << query << endl; - qDebug() << "sql query:" << QString::fromStdString(query); - } - sqlite3_stmt* statement; - int result = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, nullptr); - int resultReturn = -1; - int num = 0; - if (result == SQLITE_OK) - if (sqlite3_step(statement) == SQLITE_ROW) - num = sqlite3_column_int(statement, 0); - if (num > 0) - { - query = "SELECT send FROM \'" + getCurrentTableName() + "\' WHERE sn =\'" + SN + "-" + std::to_string(num - 1) + "\' ; "; - if (debugMode == true) - { - std::cout << query << endl; - qDebug() << "sql query:" << QString::fromStdString(query); - } - std::vector rowData; - int rc = sqlite3_exec(db, query.c_str(), callback, &rowData, 0); - for (int i = 0; i < rowData.size(); i++) - { - if (!rowData[i].valueText.compare("1")) - { - num -= 1; - } - } - } - sqlite3_finalize(statement); - return num; -} -bool sqlManager::addData(sqlDataStruct data) -{ - if (data.SN.empty())//SN鐮佷负绌猴紝灏嗗仠姝㈠鐞� - { - qDebug() << "[INFO] " << " SN empty!"; - return false; - } - std::string query = "SELECT COUNT(*) FROM \'" + getCurrentTableName() + "\' WHERE sn = '" + data.SN + "'; "; - - if (debugMode == true) - { - std::cout << query << "\n" << endl; - qDebug() << "sql query:" << QString::fromStdString(query); - } - sqlite3_stmt* statement; - - int result = sqlite3_prepare_v2(db, query.c_str(), -1, &statement, nullptr);//鎵ц璇彞 - - if (result == SQLITE_OK) { - if (sqlite3_step(statement) == SQLITE_ROW) { - if (sqlite3_column_int(statement, 0) > 0)//鏌ヨ鍑烘潵鐨勮鏁板ぇ浜�0 - { - //鎷兼帴鏁版嵁 - std::string updateQuery = "UPDATE \'" + getCurrentTableName() + "\' SET send=1,"; - for (auto d : data.dataVec) - { - updateQuery += d.dataName + " = "; - if (d.valueDouble != 0) - updateQuery += std::to_string(d.valueDouble) + ","; - else if (d.valueInt != 0) - updateQuery += std::to_string(d.valueInt) + ","; - else//TEXT - updateQuery += "\'" + d.valueText + "\',"; - } - updateQuery.replace(updateQuery.find_last_of(","), 1, " WHERE SN = \'" + data.SN + "\';"); - int rc = sqlite3_exec(db, updateQuery.c_str(), nullptr, nullptr, nullptr); - if (debugMode == true) - { - std::cout << updateQuery << endl; - qDebug() << "sql query:" << QString::fromStdString(updateQuery); - } - if (rc != SQLITE_OK) { - std::cout << "鏇存柊鎿嶄綔澶辫触: " << sqlite3_errmsg(db) << ";" << updateQuery; - sqlite3_finalize(statement); - return false; - } - } - else { - std::string insertQuery = "INSERT INTO \'" + getCurrentTableName() + "\' (send,SN,"; - for (auto d : data.dataVec) - insertQuery += d.dataName + ","; - insertQuery += "updateTime,"; - insertQuery.replace(insertQuery.find_last_of(","), 1, ") VALUES (1,\'" + data.SN + "\',"); - for (auto d : data.dataVec) - { - if (d.valueDouble != 0) - insertQuery += std::to_string(d.valueDouble) + ","; - else if (d.valueInt != 0) - insertQuery += std::to_string(d.valueInt) + ","; - else//TEXT - insertQuery += "\'" + d.valueText + "\',"; - } - insertQuery += "\'" + getCurrentDateTimeHMS() + "\',"; - insertQuery.replace(insertQuery.find_last_of(","), 1, " );"); - if (debugMode == true) - { - std::cout << insertQuery << endl; - qDebug() << "sql query:" << QString::fromStdString(insertQuery); - } - int rc = sqlite3_exec(db, insertQuery.c_str(), nullptr, nullptr, nullptr); - if (rc != SQLITE_OK) { - std::cout << "鎻掑叆鎿嶄綔澶辫触: " << sqlite3_errmsg(db) << ";" << insertQuery; - sqlite3_finalize(statement); - return false; - } - } - } - } - sqlite3_finalize(statement); - return true; -} -#endif -#if 0 -sqlDataStruct sqlManager::selectData(std::string SN, int snCountIndex, int send) -{ - std::string query; - int rc; - //send璁総rue - { - query = "UPDATE \'" + getCurrentTableName() + "\' SET send = " + std::to_string(send) + " WHERE sn = \'" + SN + "-" + std::to_string(snCountIndex) + "\' ; "; - if (debugMode == true) - { - std::cout << query << endl; - qDebug() << "sql query:" << QString::fromStdString(query); - } - rc = sqlite3_exec(db, query.c_str(), nullptr, nullptr, nullptr); - } - - ////////////////////////////// - if (snCountIndex > 0) - query = "SELECT * FROM \'" + getCurrentTableName() + "\' WHERE sn =\'" + SN + "-" + std::to_string(snCountIndex) + "\' ; "; - else - query = "SELECT * FROM \'" + getCurrentTableName() + "\' WHERE sn =\'" + SN + "-0\' ; "; - - if (debugMode == true) - { - std::cout << query << endl; - qDebug() << "sql query:" << QString::fromStdString(query); - } - - std::vector rowData; - sqlDataStruct Respone; - rc = sqlite3_exec(db, query.c_str(), callback, &rowData, 0); - if (rc != SQLITE_OK) { - std::cerr << "Failed to execute query: " << sqlite3_errmsg(db) << std::endl; - } - else - { - Respone.SN = SN; - Respone.dataVec.swap(rowData); - Respone.tableName = getCurrentTableName(); - } - return Respone; -} -#endif \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/uiModule/uiModule_dumpToExcel.h b/HanddleAI/HandleAiUi-new/uiModule/uiModule_dumpToExcel.h index e98108c4..585ea2d9 100644 --- a/HanddleAI/HandleAiUi-new/uiModule/uiModule_dumpToExcel.h +++ b/HanddleAI/HandleAiUi-new/uiModule/uiModule_dumpToExcel.h @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/HanddleAI/HandleAiUi-new/uiModule/uiModule_imageView.h b/HanddleAI/HandleAiUi-new/uiModule/uiModule_imageView.h index 749514f4..35efe9d8 100644 --- a/HanddleAI/HandleAiUi-new/uiModule/uiModule_imageView.h +++ b/HanddleAI/HandleAiUi-new/uiModule/uiModule_imageView.h @@ -40,7 +40,8 @@ public: scene->clear(); scene->addWidget(imgLabel); imgLabel->setMaximumSize(9999, 9999); - this->setStyleSheet("QGraphicsView {" + this->setObjectName("SonGraphicsView"); + this->setStyleSheet("QGraphicsView#SonGraphicsView {" "background: transparent;" "background-image: url(:/topBar/icon/waitting.png);" "background-repeat: no-repeat;" @@ -63,6 +64,7 @@ public: void setImg(QPixmap& pixmap) { showImg(pixmap); + } void resetImage() { @@ -169,7 +171,9 @@ private: QRect rect = img.rect(); imageWidth = rect.width(); imageHeight = rect.height(); + imgLabel->setFixedSize(imageWidth, imageHeight); + imgLabel->setPixmap(img); setSceneRect(rect); this->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio); mutex.unlock(); diff --git a/lib/Hd_3DCameraLMI_module_PointLazer.exp b/lib/Hd_3DCameraLMI_module_PointLazer.exp index b0d66668d858f227d6754c2baf6d937a46482b7c..c128f721899e1a2fd5f5ffe10a0335da718ee8af 100644 GIT binary patch delta 125 zcmbQh*22b_(#FK_9|$xiaym1zO!U3a_k)3f!Ipth5J)k&Sxt6e^i)w}$ZBL@@Xbsv z$}i4OD^bu0(p2#A^z&xOX0R1xNG?wSDcsDcAzy4{U}O{%<{T4}pPy44;~NZQ8k*=C XTj&`Z8yXu-{>A9Tl+`%dj_DEr(lI08 delta 119 zcmZo+o504I(#FK_9|%k)ayl~#O!U1k!otYF;LN}%$N&T`Rx!^0F0R3otr$JE)EPcE zF);XMCKu%w=ckn@Xas30_;~txGZZq|3Nj>@ry!IsXVhQ}o_v8(oZV8-*x1z2a`HPy NC#KI$lZ}`z0RZ19A_)Kh diff --git a/lib/Hd_3DCameraLMI_module_PointLazer.lib b/lib/Hd_3DCameraLMI_module_PointLazer.lib index b04150d66d0bd6f8780c0ea27f1bb8d8c729edd8..b506c2adaff32453f920896da4a99bad9470fc31 100644 GIT binary patch delta 118 zcmaDN_(X8S0VWpXY46@lKEiaIMU5e=adJO%F%yuQ#V)m3j>UkH^Ptn_hnE-_7?>uX wWRjj-#99wirapNBI|o$hWCyl5&b6m&4}62FG@E>vtp}!38LD#gEOswO00)UE^Z)<= delta 118 zcmaDN_(X8S0VbAz%oEN}KEiaIMV;Yu)8u~UVkRIpi(P879E$-XXW8l7S1&OzFfdI% w$s|3wh_xQ3OnveMb`Gf0$qsCBoC?-nr@ui}noYjT)&o1_mPrMnNFO;AS=1jL}X-jUlU%fx$O3 zxhTIlKdnSTBS=%h$J5W7A)CQgkRiD|1*C8uqlSF3k%5s>Oqg>_NPd1!ag1*;kZEY5 YXKbNoY;0(3F!?E?6H`{>WKE_^0EXKoApigX delta 138 zcmaFQ`kR$ArHzTha6({12NR3#l2yki_b}~YQDewzob1D#&IF|7*`+q0XO?DU7G=zs{FY@ZOj3RF rT2>CIg2@+IV_DC4{(bR!@_QEf$!nOTC+D&?!c;0lRc@AN*JK0$_5&nj delta 108 zcmX>ha6({12NTP2)AOe%_b}~YQD^wvG}(taoe4U!8q3=t^)#)ifQlkYM*F##1SGF<`yB)uAn delta 138 zcmaFP`k9q8rHzT$S5YvIVL1OKc_gx eHyFq?G|@A*)H60VHME?3k+3PMg|6s$^2|)lQ%QfvZyg+HBOFWRi7NqY{LX(_OnWD-pnk_ w$nsyM=EdYwEE8ZV^dYk4EOPCyj!oub+X0hM=5k2R&n?i)Oo3|WWoKpt0HB~E>;M1& delta 113 zcmbOrFhO8L2@~f(^@6+dj0_AMllj@qCU0h{Wl?AN+%!3kRef?avkeoF+0QDqc{8&x wBa6wYtap=7u}pxe(1*yDvp75wyE2)JZ3j$3nad$LKes?HGX<)hmz|jr0D+b!iU0rr diff --git a/lib/Hd_MvCamera_module_GENTL.exp b/lib/Hd_MvCamera_module_GENTL.exp index 588ebc79337b83ef3ecbb3be1c634dd15f386be3..f0a89b553a1d128975c713a0fcafda275f8da276 100644 GIT binary patch delta 126 zcmZo*`@+hZ(#FK_9|$BSaym2pVVLN5jqd{k1A{38qacuCaI>0h!RV->#*o#>z~Gyi zT$Ep&pH`xv5u~Z$^$TT$3 YGq%t(Ha0XinEZ;-i7BgbvL4eV09LOg&;S4c delta 120 zcmeyu+Q7z{(#FK_9|%+?aym0{Fi!NlCh~`Yfx()AQ4mNmxLCzF`@6UXPc~w7)KX{o z+{D1(o0(jcU!0#-qM#9^so>-3=gm;aU@ORwT%LkZKAlm6F?jL;MsapaJ!4~2L(9qc O7@e3tH%(SzxNA|mMk diff --git a/lib/Hd_MvCamera_module_GENTL.lib b/lib/Hd_MvCamera_module_GENTL.lib index 578b535ee41c6c12f7e6ab81feeae0134eac1aaf..4010f0a3da11c6819056f7133313cf8a23370e79 100644 GIT binary patch delta 118 zcmew&@I_$53?`O;Zc(o%&tclnqQ;QbI60mc1_l!bMnNFO;AS=1g3&=mjUlU%fx$O3 zxhTIlKdnSTBS=%h$J5W7A)CQgkRiD|1*C8hqlSF3k%5s>Oqg>_NPd1!ag1*;kZEY5 YXKbNoY;0(3F!?2;6H`{>WL>690FnbGMF0Q* delta 120 zcmey&`k$3ErHzTW$$WANntjN OGCDDRZknvfbO`{Dsv}(h diff --git a/lib/Hd_MvCamera_module_GIGE.lib b/lib/Hd_MvCamera_module_GIGE.lib index f5ba12df64b2f2e149f3a1b7a1622e6c2dd11692..110ae8d714ae9a153c870b6ea7d31787466ae1f1 100644 GIT binary patch delta 108 zcmaDN@I+w4Bqo;p>l@!pp2oC~MU5e=aq=uy^~v?jPE0`NX;!JtcbVlGS)TPV-XJB3aIQ)aT5(x04xJn+a delta 108 zcmaDN@I+w4BqkQ4S+m|wp2oC~MV;Yu)8tvK>XYl4otS{k)2vdP?=s6XvY5Ryxjl(> s8ccycM6#SUOQrAa+sTZq@{`lp=D}o@xg3)7a|`q`Q=mrpvx_nU04H}TWB>pF diff --git a/lib/Hd_ResultsSummary_module.exp b/lib/Hd_ResultsSummary_module.exp index 59f77271cb443ce895a01c84da2ef9a0df05ac4b..72272a70ead1c7a3023873a763f290b25f1c8a31 100644 GIT binary patch delta 126 zcmZo*`@+hZ(#FK_9|$BSaym2pVVLN5jqd{k1A{38qacuCaI>0h!RV->#*o#>z~Gyi zT$Ep&pH`xv5u~Z$^$TT$3 YGq%t(Ha0XinEZ;-i7BgbvL4eV09LOg&;S4c delta 120 zcmeyu+Q7z{(#FK_9|%+?aym0{Fi!NlCh~`Yfx()AQ4mNmxLCzF`@6UXPc~w7)KX{o z+{D1(o0(jcU!0#-qM#9^so>-3=gm;aU@ORwT%LkZKAlm6F?jL;MsapaJ!4~2L(9qc O7@e3tH%(SzxNA|mMk diff --git a/lib/Hd_ResultsSummary_module.lib b/lib/Hd_ResultsSummary_module.lib index ff33633f3db52aec9c9ccb88fc9c624c2109a9d1..8baafc1c7adb77e35051dfe8ea37dc3b629b4297 100644 GIT binary patch delta 117 zcmew&@I_$53?^o+dy^*5W;(#4#*o!GIi5M2DXVew8D=X+&JQ+8e@-zlFfdJC$Rs^k xi?tl4M1ArZRt})D$!D0QCVya!<9s*6;o>`}O0&tmY%MUA$_SOxn`7C<83B{oC#(Pf delta 117 zcmew&@I_$53?}BnwZ|vVW;(#4&hWWuay)Z3)90qmXPB)RIsaXl@bDA^0|V3Kg-p_u ywOGqxO4KKxVdVfSn|y{@YVrrxI8L`KOHaRpsx+J2%hm!@sfQM!u=t^)#)ifQlm9b4W6EmW J{G6GI2>@mTAnyPG delta 139 zcmcc1{gRtArHzTrV$mz_ucBAiWMv;Y#3=B35jDie6;9?cy?C;_lJlT!ONlTsK za}xuDZ)S2)esO+UiGoIurh<>BpEpAxgRLM#a(N0u`5Gn-`CuahBcqrw=a`WE{G8$# g-(Voq&_vJJQqS1f)X;MBXQpRNpPM${W@cgn00B5E`v3p{ diff --git a/lib/Hd_SocketModule_ModbusTcp.lib b/lib/Hd_SocketModule_ModbusTcp.lib index 7d987e797c1925944487933e8b6ed09e14a3773c..b3ff8f19c2b7f22a232105edac9723e1a30fca2a 100644 GIT binary patch delta 108 zcmew+^-XHSI~LA!vnzkN7c@4(_u=wNxPHmXh?VS6W0bcJXg#Z8m