#include "Hd_25DCameraVJ_module.h" #include #include #include //data == "rest_newProductIn"时要结束run;机台报警,取图超时,复位后重新拍的情况。 bool ifBreak = false; //ifRunning减少ifBreak的判断;"rest_newProductIn"时,Logic_camera_thread框架会结束未处理完的相相机取图 bool ifRunning = false; int imgIndex = 0; QString byteArrayToUnicode(const QByteArray array) { // state用于保存转换状态,它的成员invalidChars,可用来判断是否转换成功 // 如果转换成功,则值为0,如果值大于0,则说明转换失败 QTextCodec::ConverterState state; // 先尝试使用utf-8的方式把QByteArray转换成QString QString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state); // 如果转换时无效字符数量大于0,说明编码格式不对 if (state.invalidChars > 0) { // 再尝试使用GBK的方式进行转换,一般就能转换正确(当然也可能是其它格式,但比较少见了) text = QTextCodec::codecForName("GBK")->toUnicode(array); } return text; } KglDevice* kglDevice; KglStream* kglStream; KglGenParameterArray* kgllFeatureNodes; KglGenParameterArray* kgllStreamFeatureNodes; LocalKglDeviceEventSink* ab; KglBuffer* kglBuffer; std::string sModelName; // Camera type #define CameraTypeArea 1 #define CameraTypeLine 2 #define CameraTypeXT 3 #define CameraTypeRB 4 int iCameraType; QQueue> queuePic; QMutex* n_mutex = new QMutex(); std::vector sImageType; static int imgNum = 1; //是否为标准通信流程: //标准通信流程,run函数设置曝光/增益;非标准通信流程(简单通信流程),回调函数设置曝光/增益 bool ifStandard = false; //相机取图超时时间 int getImageTimeOut = 1000; bool moduleStatus = false; #pragma region Device control bool Connect(int index) { KglSystem kglSystem; const KglDeviceInfo* deviceInfo; std::string inputkey; if (KGL_SUCCESS != kglSystem.find()) { qDebug() << "Failed to find camera device."; return false; } uint32_t count = kglSystem.getDeviceCount(); if (count == 0) { qDebug() << ("No camera device can be found.\n"); return false; } /*else { qDebug() <<("Select the camera device number.\n\n"); for (uint32_t i = 0; i < count; ++i) { deviceInfo = kglSystem.getDeviceInfo(i); sModelName = deviceInfo->getModelName(); std::string sMACAddress = (std::string)deviceInfo->getMACAddress(); qDebug() <<("%d : %s_KEYENCE CORPORATION_%s\n", i + 1, sMACAddress.c_str(), sModelName.c_str()); } std::cin >> inputkey; qDebug() <<("------------------------------\n"); }*/ //uint32_t selectNum = atoi(inputkey.c_str()) - 1; if ((index < 0) || (count <= index)) { qDebug() << ("The entry is invalid.\n"); return false; } kglDevice = new KglDevice(); kglStream = new KglStream(); deviceInfo = kglSystem.getDeviceInfo(index); sModelName = deviceInfo->getModelName(); if ((sModelName == ("CA-HL02MX")) || (sModelName == ("CA-HL04MX")) || (sModelName == ("CA-HL08MX"))) { iCameraType = CameraTypeLine; } else if ((sModelName == ("XT-024")) || (sModelName == ("XT-060"))) { iCameraType = CameraTypeXT; } else if ((sModelName == ("RB-500")) || (sModelName == ("RB-800")) || (sModelName == ("RB-1200"))) { iCameraType = CameraTypeRB; } else { iCameraType = CameraTypeArea; } if (KGL_SUCCESS != kglDevice->connect(deviceInfo->getIPAddress())) { qDebug() << ("Cannot connect to the camera device.\n"); return false; } if (KGL_SUCCESS != kglStream->open(*kglDevice)) { qDebug() << ("Cannot connect to the stream.\n"); return false; } // Get FeatureNode of camera device kgllFeatureNodes = kglDevice->getDeviceParameters(); kgllStreamFeatureNodes = kglStream->getStreamParameters(); moduleStatus = true; return true; } void Disconnect() { moduleStatus = false; if ((kglStream != NULL) && (kglStream->isOpen())) { KglResult result = kglStream->close(*kglDevice); if (KGL_SUCCESS != result) { qDebug() << ("Cannot disconnect from the stream.\n"); return; } } if ((kglDevice != NULL) && (kglDevice->isConnected())) { if (KGL_SUCCESS != kglDevice->disconnect()) { qDebug() << ("Cannot disconnect from the camera device.\n"); return; } } } #pragma endregion #pragma region Feature access void setFeatureNodes(const std::string sFeatureName, const int64_t value) { KglResult result; KglString sConfigurationLastFailureCause; qDebug() << "(2.5Dmodel) " << "[setFeatureNodes] " << sFeatureName.c_str() << value; result = kgllStreamFeatureNodes->setIntegerValue(sFeatureName.c_str(), value); if (KGL_SUCCESS != result) { qDebug() << "(2.5Dmodel) " << ("Error : setParam\n"); return; } } void setIntegerValue(const std::string sFeatureName, const int64_t value) { KglResult result; KglString sConfigurationLastFailureCause; qDebug() << "(2.5Dmodel) " << "[setIntegerValue] " << sFeatureName.c_str() << value; result = kgllFeatureNodes->setIntegerValue(sFeatureName.c_str(), value); if (KGL_SUCCESS != result) { qDebug() << "(2.5Dmodel) " << ("Error : setParam\n"); return; } } void setFloatValue(const std::string sFeatureName, const double value) { KglResult result; KglString sConfigurationLastFailureCause; qDebug() << "(2.5Dmodel) " << "[setFloatValue] " << sFeatureName.c_str() << value; result = kgllFeatureNodes->setFloatValue(sFeatureName.c_str(), value); if (KGL_SUCCESS != result) { if (KGL_SUCCESS != result) { qDebug() << "(2.5Dmodel) " << ("Error : setParam\n"); return; } } } void setBooleanValue(const std::string sFeatureName, const bool value) { KglResult result; KglString sConfigurationLastFailureCause; qDebug() << "(2.5Dmodel) " << "[setBooleanValue] " << sFeatureName.c_str() << value; result = kgllFeatureNodes->setBooleanValue(sFeatureName.c_str(), value); if (KGL_SUCCESS != result) { if (KGL_SUCCESS != result) { qDebug() << "(2.5Dmodel) " << ("Error : setParam\n"); return; } } } void setEnumValue(const std::string sFeatureName, std::string value) { KglResult result; KglString sConfigurationLastFailureCause; qDebug() << "(2.5Dmodel) " << "[setEnumValue] " << sFeatureName.c_str() << value.c_str(); result = kgllFeatureNodes->setEnumValue(sFeatureName.c_str(), value.c_str()); if (KGL_SUCCESS != result) { qDebug() << "(2.5Dmodel) " << ("Error : setParam\n"); return; } } void setStringValue(const std::string sFeatureName, const std::string value) { KglResult result; KglString sConfigurationLastFailureCause; qDebug() << "(2.5Dmodel) " << "[setStringValue] " << sFeatureName.c_str() << value.c_str(); result = kgllFeatureNodes->setStringValue(sFeatureName.c_str(), value.c_str()); if (KGL_SUCCESS != result) { qDebug() << "(2.5Dmodel) " << ("Error : setParam\n"); return; } } void executeCommand(const std::string sFeatureName) { KglResult result; qDebug() << "(2.5Dmodel) " << "[executeCommand] " << sFeatureName.c_str(); result = kgllFeatureNodes->executeCommand(sFeatureName.c_str()); if (KGL_SUCCESS != result) { qDebug() << "(2.5Dmodel) " << ("Error : execCommand\n"); return; } } void getIntegerValue(const std::string sFeatureName, int64_t& value) { KglResult result; result = kgllFeatureNodes->getIntegerValue(sFeatureName.c_str(), value); if (KGL_SUCCESS != result) { qDebug() << ("Error : getParam\n"); return; } } void getFloatValue(const std::string sFeatureName, double& value) { KglResult result; result = kgllFeatureNodes->getFloatValue(sFeatureName.c_str(), value); if (KGL_SUCCESS != result) { qDebug() << ("Error : getParam\n"); return; } } void getBooleanValue(const std::string sFeatureName, bool& value) { KglResult result; result = kgllFeatureNodes->getBooleanValue(sFeatureName.c_str(), value); if (KGL_SUCCESS != result) { qDebug() << ("Error : getParam\n"); return; } } void getEnumValue(const std::string sFeatureName, std::string& value) { KglResult result; KglString featurevalue; result = kgllFeatureNodes->getEnumValue(sFeatureName.c_str(), featurevalue); value = featurevalue; if (KGL_SUCCESS != result) { qDebug() << ("Error : getParam\n"); return; } } void getStringValue(const std::string sFeatureName, std::string& value) { KglResult result; KglString featurevalue; result = kgllFeatureNodes->getStringValue(sFeatureName.c_str(), featurevalue); value = featurevalue; if (KGL_SUCCESS != result) { qDebug() << ("Error : getParam\n"); return; } } // //bool setSystemFeatureValue(const std::string sFeatureName, const int64_t value) //{ // KglResult result; // KglString sConfigurationLastFailureCause; // // qDebug() << ("2.5Dmodel\t") << "[setSystemFeatureValue] " << sFeatureName.c_str() << value; // result = kgllFeatureNodes->setIntegerValue(sFeatureName.c_str(), value); // if (KGL_SUCCESS != result) // { // qDebug() << ("2.5Dmodel\t") << ("Error : setParam\n"); // QString str = QString::fromStdString(sFeatureName) + "_" + QString::number(result, 16); // throw exception(str.toStdString().c_str()); // return; // } //} #pragma endregion #pragma region Import XML void ImportDeviceParameters(std::string sFilePath) { setEnumValue("OperationMode", "SetupMode"); if (!sFilePath.empty()) { KglTargetDataSet target = (KglTargetDataSet)(KglTargetData::CameraParameters) | (KglTargetDataSet)(KglTargetData::ParameterSetOfCameraParameter) | (KglTargetDataSet)(KglTargetData::ModelImageOfCameraParameter) | (KglTargetDataSet)(KglTargetData::CameraParametersOfEnvironmentSettings) | (KglTargetDataSet)(KglTargetData::CommonParametersOfEnvironmentSettings) | (KglTargetDataSet)(KglTargetData::CommonCameraParameters) | (KglTargetDataSet)(KglTargetData::CalibrationOfCameraParameter); KglImportDeviceParamOption option = KglImportDeviceParamOption(); option.bOverwriteModelImage = true; option.bOverwriteCalibration = true; KglString failFeature; KglResult ret = kglDevice->importDeviceParameters(sFilePath.c_str(), failFeature, target, option); if (ret != KGL_SUCCESS) { qDebug() << ("Failed to load a Feature List file.\n"); return; } } setEnumValue("OperationMode", "RunMode"); } #pragma endregion #pragma region Optional Functions std::vector GetEnableImageType(std::string sImageType) { std::vector EnableImageType; std::string StdImageTypeTable[1][2] = { { "StdNormalImageEnable", "StdNormalImage" } }; std::string LtrxNmlImageTypeTable[15][2] = { { "LtrxNormalImageEnable", "LtrxNormalImage" }, { "LtrxUpperImageEnable", "LtrxUpperImage" }, { "LtrxUpperRightImageEnable", "LtrxUpperRightImage" }, { "LtrxRightImageEnable", "LtrxRightImage" }, { "LtrxLowerRightImageEnable", "LtrxLowerRightImage" }, { "LtrxLowerImageEnable", "LtrxLowerImage" }, { "LtrxLowerLeftImageEnable", "LtrxLowerLeftImage" }, { "LtrxLeftImageEnable", "LtrxLeftImage" }, { "LtrxUpperLeftImageEnable", "LtrxUpperLeftImage" }, { "LtrxShapeImage1Enable", "LtrxShapeImage1" }, { "LtrxShapeImage2Enable", "LtrxShapeImage2" }, { "LtrxShapeImage3Enable", "LtrxShapeImage3" }, { "LtrxTextureImageEnable", "LtrxTextureImage" }, { "LtrxGradientXImageEnable", "LtrxGradientXImage" }, { "LtrxGradientYImageEnable", "LtrxGradientYImage" }, }; std::string MlspImageTypeTable[11][2] = { { "MlspUVImageEnable", "MlspUVImage" }, { "MlspBlueImageEnable", "MlspBlueImage" }, { "MlspGreenImageEnable", "MlspGreenImage" }, { "MlspAmberImageEnable", "MlspAmberImage" }, { "MlspRedImageEnable", "MlspRedImage" }, { "MlspFarRedImageEnable", "MlspFarRedImage" }, { "MlspIRImageEnable", "MlspIRImage" }, { "MlspWhiteImageEnable", "MlspWhiteImage" }, { "MlspAverageGrayscaleImageEnable", "MlspAverageGrayscaleImage" }, { "MlspColorImageEnable", "MlspColorImage" }, { "MlspColorDifferenceImageEnable", "MlspColorDifferenceImage" } }; std::string SprfImageTypeTable[16][2] = { { "SprfX1ImageEnable", "SprfX1Image" }, { "SprfX2ImageEnable", "SprfX2Image" }, { "SprfX3ImageEnable", "SprfX3Image" }, { "SprfX4ImageEnable", "SprfX4Image" }, { "SprfY1ImageEnable", "SprfY1Image" }, { "SprfY2ImageEnable", "SprfY2Image" }, { "SprfY3ImageEnable", "SprfY3Image" }, { "SprfY4ImageEnable", "SprfY4Image" }, { "SprfSpecularReflectionImageEnable", "SprfSpecularReflectionImage" }, { "SprfDiffuseReflectionImageEnable", "SprfDiffuseReflectionImage" }, { "SprfShapeImage1Enable", "SprfShapeImage1" }, { "SprfShapeImage2Enable", "SprfShapeImage2" }, { "SprfPhaseXImageEnable", "SprfPhaseXImage" }, { "SprfPhaseYImageEnable", "SprfPhaseYImage" }, { "SprfGlossRatioImageEnable", "SprfGlossRatioImage" }, { "SprfNormalImageEnable", "SprfNormalImage" } }; std::string Cap3DImageTypeTable[2][2] = { { "Cap3DAreascan3DImageEnable", "Areascan3DImage" }, { "Cap3DAreascan2DImageEnable", "Areascan2DImage" }, }; std::string RBImageTypeTable[2][2] = { { "Areascan3DImageEnable", "Areascan3DImage" }, { "Areascan2DGrayscaleImageEnable", "Areascan2DGrayscaleImage" }, }; std::string XTImageTypeTable[3][2] = { { "Areascan3DImageEnable", "Areascan3DImage" }, { "Areascan2DColorImageEnable", "Areascan2DColorImage" }, { "Areascan2DGrayscaleImageEnable", "Areascan2DGrayscaleImage" } }; std::string FilteredImageTable[8][2] = { { "FilteredImageEnable", "FilteredImage1" }, { "FilteredImageEnable", "FilteredImage2" }, { "FilteredImageEnable", "FilteredImage3" }, { "FilteredImageEnable", "FilteredImage4" }, { "FilteredImageEnable", "FilteredImage5" }, { "FilteredImageEnable", "FilteredImage6" }, { "FilteredImageEnable", "FilteredImage7" }, { "FilteredImageEnable", "FilteredImage8" } }; int64_t sTargetParameterSet; getIntegerValue("TargetParameterSet", sTargetParameterSet); setIntegerValue("ParameterSetSelector", sTargetParameterSet); if (iCameraType == CameraTypeLine) { std::string sCaptureMode; getEnumValue("CaptureMode", sCaptureMode); if (sCaptureMode == "Fixed_MultipleImages") { bool sEnable; getBooleanValue("IndividualFilterPerFixedCaptureNoEnable", sEnable); if (sEnable) { int64_t sTargetCaptureCount; getIntegerValue("TargetFixedCaptureNo", sTargetCaptureCount); setIntegerValue("FixedCaptureNoSelector", sTargetCaptureCount); } } } bool sEnable; if (iCameraType == CameraTypeRB) { for (UINT i = 0; i < 2; i++) { std::string sFeatureName = RBImageTypeTable[i][0]; std::string sImageName = RBImageTypeTable[i][1]; getBooleanValue(sFeatureName, sEnable); if (sEnable) { EnableImageType.push_back(sImageName); } } } else if (iCameraType == CameraTypeXT) { for (UINT i = 0; i < 3; i++) { std::string sFeatureName = XTImageTypeTable[i][0]; std::string sImageName = XTImageTypeTable[i][1]; getBooleanValue(sFeatureName, sEnable); if (sEnable) { EnableImageType.push_back(sImageName); } } } else { std::string sLightingMode = ""; getEnumValue("ImagingMode", sLightingMode); if (sLightingMode == "StandardLighting") { for (UINT i = 0; i < 1; i++) { std::string sFeatureName = StdImageTypeTable[i][0]; std::string sImageName = StdImageTypeTable[i][1]; getBooleanValue(sFeatureName, sEnable); if (sEnable) { EnableImageType.push_back(sImageName); } } } else if (sLightingMode == "LumiTrax") { for (UINT i = 0; i < 15; i++) { std::string sFeatureName = LtrxNmlImageTypeTable[i][0]; std::string sImageName = LtrxNmlImageTypeTable[i][1]; getBooleanValue(sFeatureName, sEnable); if (sEnable) { EnableImageType.push_back(sImageName); } } } else if (sLightingMode == "MultiSpectrum") { for (UINT i = 0; i < 11; i++) { std::string sFeatureName = MlspImageTypeTable[i][0]; std::string sImageName = MlspImageTypeTable[i][1]; getBooleanValue(sFeatureName, sEnable); if (sEnable) { EnableImageType.push_back(sImageName); } } } else if (sLightingMode == "LumiTraxSpecularReflection") { for (UINT i = 0; i < 16; i++) { std::string sFeatureName = SprfImageTypeTable[i][0]; std::string sImageName = SprfImageTypeTable[i][1]; getBooleanValue(sFeatureName, sEnable); if (sEnable) { EnableImageType.push_back(sImageName); } } } else if (sLightingMode == "Capture3D") { for (UINT i = 0; i < 2; i++) { std::string sFeatureName = Cap3DImageTypeTable[i][0]; std::string sImageName = Cap3DImageTypeTable[i][1]; getBooleanValue(sFeatureName, sEnable); if (sEnable) { EnableImageType.push_back(sImageName); } } } } for (UINT i = 0; i < 8; i++) { setIntegerValue("FilteredImageSelector", (i + 1)); std::string sFeatureName = FilteredImageTable[i][0]; std::string sImageName = FilteredImageTable[i][1]; getBooleanValue(sFeatureName, sEnable); if (sEnable) { EnableImageType.push_back(sImageName); } } UINT ImageTypeSize = (UINT)EnableImageType.size(); if (ImageTypeSize < 5) { for (int i = ImageTypeSize; i < 5; i++) { EnableImageType.push_back(""); } } qDebug() << ("Select an image type.\n\n"); for (UINT i = 0; i < ImageTypeSize; ++i) { qDebug() << ((std::to_string(i + 1) + " :" + EnableImageType[i] + "\n").c_str()); } uint32_t iSelected = atoi(sImageType.c_str()); if ((iSelected == 0) || (iSelected > ImageTypeSize)) { qDebug() << ("The entry is invalid.\n"); return EnableImageType; } return EnableImageType; } void ConvertRGBA8toBGRA8(void* buffer, int pixelSize) { byte dataR; byte dataB; for (int i = 0; i < pixelSize; i++) { dataR = *((byte*)(buffer)+(i * 4)); dataB = *((byte*)(buffer)+(i * 4) + 2); *((byte*)(buffer)+(i * 4)) = dataB; *((byte*)(buffer)+(i * 4) + 2) = dataR; } } #pragma endregion #pragma region Acquisition control bool AcquisitionStart() { KglResult result; result = kglStream->startAcquisition(*kglDevice); if (KGL_SUCCESS != result) { qDebug() << ("Error : acquisitionStart\n"); return false; } qDebug() << "[AcquisitionStart] " << result; return true; } void AcquisitionStop() { KglResult result; result = kglStream->stopAcquisition(*kglDevice); if (KGL_SUCCESS != result) { qDebug() << ("Error : acquisitionStop\n"); return; } } bool QueueBuffer() { KglResult result; KglResult operationResult; uint32_t payloadsize = kglDevice->getPayloadSize(); if (payloadsize == 0) { qDebug() << ("Error : getPayloadSize\n"); return false; } kglBuffer = new KglBuffer(); result = kglBuffer->allocate(payloadsize); if (KGL_SUCCESS != result) { qDebug() << ("Error : allocate\n"); return false; } result = kglStream->queueBuffer(kglBuffer); if ((KGL_SUCCESS != result) && (KGL_PENDING != result)) { qDebug() << ("Error : queueBuffer\n"); return false; } } cv::Mat RetrieveBuffer() { KglResult result; KglResult operationResult; result = kglStream->retrieveBuffer(&kglBuffer, operationResult); if ((KGL_SUCCESS != result) || (KGL_SUCCESS != operationResult)) { qDebug() << "[retrieveBuffer] " << "result:" << result; qDebug() << "[retrieveBuffer] " << "operationResult:" << operationResult; if (kglBuffer != NULL) { kglBuffer->free();//设置成只执行一次 delete(kglBuffer); kglBuffer = NULL; } qDebug() << ("Error : retrieveBuffer\n"); return Mat(); } UINT bmpSize = kglBuffer->getAcquiredSize(); char* data = (char*)malloc(bmpSize); CopyMemory((void*)data, kglBuffer->getDataPointer(), bmpSize); cv::Mat mat; int64_t width; int64_t height; std::string sPixelFormat; getIntegerValue("Width", width); getIntegerValue("Height", height); getEnumValue("PixelFormat", sPixelFormat); if (sPixelFormat == "Mono8") { mat = cv::Mat(height, width, CV_8UC1, data); } else if (sPixelFormat == "Mono16") { mat = cv::Mat(height, width, CV_16UC1, data); } else if (sPixelFormat == "BGR8Packed") { mat = cv::Mat(height, width, CV_8UC3, data); } else if (sPixelFormat == "RGB8Packed") { mat = cv::Mat(height, width, CV_8UC3, data); cv::cvtColor(mat, mat, COLOR_BGR2RGB); } else if (sPixelFormat == "BGRA8Packed") { mat = cv::Mat(height, width, CV_8UC4, data); } else if (sPixelFormat == "RGBA8Packed") { mat = cv::Mat(height, width, CV_8UC3, data); cv::cvtColor(mat, mat, COLOR_BGRA2RGBA); } //kglBuffer->free(); if (kglBuffer != NULL) { kglBuffer->free(); delete(kglBuffer); kglBuffer = NULL; } cv::Mat bmpMat; mat.copyTo(bmpMat); if (data) { free(data); } //imwrite("C:\\pic\\Img" + to_string(imgNum) + ".bmp", bmpMat); //imgNum++; return bmpMat; } void SaveBMP(cv::Mat bmp) { std::string inputkey; std::string sFilePath; qDebug() << ("Do you want to save the image as a BMP file?\n\n"); qDebug() << ("1 :Yes\n"); qDebug() << ("2 : No\n"); std::cin >> inputkey; qDebug() << ("------------------------------\n"); switch (atoi(inputkey.c_str())) { case 1: qDebug() << ("Enter the full path of the BMP file.\n\n"); std::cin >> sFilePath; qDebug() << ("------------------------------\n"); break; case 2: return; break; default: qDebug() << ("The entry is invalid.\n"); return; break; } try { /*System::String^ FilePath = gcnew System::String(sFilePath.c_str()); FileStream^ stream = gcnew FileStream(FilePath, FileMode::Create, FileAccess::Write); TiffBitmapEncoder^ encoder = gcnew TiffBitmapEncoder(); encoder->Compression = TiffCompressOption::None; encoder->Frames->Add(BitmapFrame::Create(bmp)); encoder->Save(stream);*/ //cv::imwrite(sFilePath, bmp); } catch (char) { qDebug() << ("Failed to save the BMP file.\n"); qDebug() << ("------------------------------"); } } void TriggerSoftware() { Sleep(5000); kgllFeatureNodes->executeCommand("TriggerSoftware"); } bool AcquisitionStartEx_SingleFrame(bool bMultiCaptureUpdateImage, std::string sMultiCaptureImageType, std::vector& matVec) { std::string sPixelFormat; setBooleanValue("MultiCaptureUpdateImage", bMultiCaptureUpdateImage); setEnumValue("MultiCaptureImageType", sMultiCaptureImageType); //cv::Mat bmp; //bmp = QueueBuffer(); cv::Mat bmp; if (!QueueBuffer()) return false; AcquisitionStart(); bmp = RetrieveBuffer(); if (!bmp.empty()) { matVec.push_back(bmp); return true; } else { return false; } //if (sPixelFormat == "RGBA8Packed") //{ // ConvertRGBA8toBGRA8(BitmapImage->BackBuffer.ToPointer(), (BitmapImage->PixelWidth * BitmapImage->PixelHeight)); //} //SaveBMP(bmp); AcquisitionStop(); bmp.release(); } #pragma endregion void MyThread::run() { clock_t start, stop; start = clock(); while (m_flag) { std::vector matVecs; std::string sImageType1 = "2"; std::vector sImageType = GetEnableImageType(sImageType1); //获取图像类别 6张 //qDebug() << __FUNCTION__ << __LINE__ << "sImageType:" << QString::fromStdString(sImageType[0]) << ";" << QString::fromStdString(sImageType[1]); if (AcquisitionStartEx_SingleFrame(TRUE, sImageType[0], matVecs) == true) { for (int i = 1; i < sImageType.size(); ++i) { if (sImageType[i] != "" && sImageType[i] != sImageType[i - 1]) { AcquisitionStartEx_SingleFrame(FALSE, sImageType[i], matVecs); } } }//为true的话就是重新获取一组图片中的一张sImageType类型的图片 false就是在同一组图片获取sImageType类型的图片 //AcquisitionStartEx_SingleFrame(FALSE, sImageType[1], matVecs);//为true的话就是重新获取一组图片中的一张sImageType类型的图片 false就是在同一组图片获取sImageType类型的图片 if (matVecs.size() > 0) { n_mutex->lock(); stop = clock(); qCritical() << " [info] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg getImg time"<unlock(); break; } if (ifBreak) break; //qDebug() << "[2.5D run] "; QThread::msleep(5); } } Hd_25DCameraVJ_module* create() { qDebug() << "[info]" << __FUNCTION__ << "line:" << __LINE__ << "Hd_MvCamera_module create success!"; return new Hd_25DCameraVJ_module; } void destory(Hd_25DCameraVJ_module* ptr) { if (ptr) { delete ptr; ptr = nullptr; } qDebug() << "[info] " << __FUNCTION__ << " line:" << __LINE__ << "Hd_MvCamera_module destory success!"; } Hd_25DCameraVJ_module::Hd_25DCameraVJ_module() { //m_thread = new MyThread; //m_mutex = new QMutex(); workThread = new MyThread(); } Hd_25DCameraVJ_module::~Hd_25DCameraVJ_module() { if (workThread) { workThread->setFlag(false); workThread->wait(); workThread->quit(); workThread->deleteLater(); workThread = nullptr; } Disconnect(); if (n_mutex) { delete n_mutex; n_mutex = nullptr; } qDebug() << "[info]" << __FUNCTION__ << "line:" << __LINE__ << " delete success!"; } bool Hd_25DCameraVJ_module::readData(std::vector& mat, QByteArray& data) { Q_UNUSED(data); if (queuePic.empty()) { qCritical() << " [ error] " << __FUNCTION__ << " line:" << __LINE__ << " srcImage is null"; return false; } n_mutex->lock(); vector dstMat = queuePic.dequeue(); for (int i = 0; i < dstMat.size(); i++) { cv::Mat img = cv::Mat(); dstMat[i].copyTo(img); mat.push_back(img.clone()); } n_mutex->unlock(); //mat.assign(dstMat.begin(), dstMat.end()); qCritical() << " [info] " << __FUNCTION__ << " line:" << __LINE__ <<" checkImg readData,2.5D ,imgIndex"<< imgIndex; return true; } bool Hd_25DCameraVJ_module::writeData(std::vector& mat, QByteArray& data) { Q_UNUSED(mat); //2024.02.18更新,相机对应的读SN信号时,表示新产品进入,设置初始值 if (data == "rest_newProductIn") { //根据实际项目,设置初始值:曝光、增益,ROI区域等 /*{ if (expourseTimeList.size() > 0) SetExposureTime(expourseTimeList[0]); if (gainList.size() > 0) SetGain(gainList[0]); } getImageNum = 0;*/ if (queuePic.size() > 0) { n_mutex->lock(); queuePic.clear(); n_mutex->unlock(); std::cout << "rest_newProductIn , queuePic.size() > 0 ,signal maybe too fast " << xmlPath << std::endl; qWarning() << __FUNCTION__ << " line: " << __LINE__ << "rest_newProductIn , queuePic.size() > 0 ,signal maybe too fast " << QString::fromStdString(xmlPath); } if (ifRunning == true) { ifBreak = true; Sleep(10); } imgIndex = 0; return true; } //else //{ // m_flag = false; // expourseTimeList.clear(); // gainList.clear(); //} // xmlPath = data.toStdString(); return true; } //传入initParas函数,格式为:相机key+参数名1#参数值1#参数值2+参数名2#参数值1... bool Hd_25DCameraVJ_module::initParas(QByteArray& initData) { QByteArrayList valueList = initData.split('+'); xmlPath = valueList[0].toStdString(); if (valueList.size() > 1) for (int i = 1; i < valueList.size(); i++) { QString valuei = byteArrayToUnicode(valueList[i]); if (valuei.contains("是否为标准通信流程")) { if (valuei.contains("true")) ifStandard = true; } if (valuei.contains("取图超时")) { QStringList gainL = valuei.split('#'); if (gainL.size() > 1) getImageTimeOut = gainL[1].toInt(); if (getImageTimeOut < 50) getImageTimeOut = 1000; } } KglSystem::initialize(); bool connectSuccess = Connect(0); if (connectSuccess == false) return false; ab = new LocalKglDeviceEventSink(); kglDevice->registerEventSink(ab); setBooleanValue("GevGVCPPendingAck", TRUE); //不同相机修改为对应路径 ImportDeviceParameters("C:\\Users\\DS0904\\Desktop\\CA-HL04MX_8E2200761008_Features.xml"); //C#使用SetFeatureValue setEnumValue("AcquisitionMode", "SingleFrame"); setFeatureNodes("MaximumPendingResends", 0); setFeatureNodes("MaximumResendGroupSize", 0);//解决缺图问题26 setFeatureNodes("ResetOnIdle", 0); setFeatureNodes("RequestTimeout", 0); setFeatureNodes("MaximumResendRequestRetryByPacket", 0); //setSystemFeatureValue("MaximumPendingResends", 0); //setSystemFeatureValue("MaximumResendGroupSize", 0);//解决缺图问题26 //setSystemFeatureValue("ResetOnIdle", 0); //setSystemFeatureValue("RequestTimeout", 0); //setSystemFeatureValue("MaximumResendRequestRetryByPacket", 0); //setIntegerValue("GevSCPSPacketsize", 7716);//解决图像横纹问题,减小cpu使用率 //setIntegerValue("GevSCPD", 344);//减小延迟 bool bBGEnable; getBooleanValue("ImageCaptureBufferEnable", bBGEnable); if (bBGEnable) { executeCommand("ImageCaptureBufferClear"); executeCommand("BufferCaptureAcquisitionStart"); } std::string sImageType1 = "1"; sImageType = GetEnableImageType(sImageType1); //获取图像类别 6张 std::string sTriggerMode; getEnumValue("TriggerMode", sTriggerMode); std::string sTriggerSource = ""; if (sTriggerMode == "On") { getEnumValue("TriggerSource", sTriggerSource); qDebug() << __FUNCTION__ << __LINE__ << "sTriggerSource:" << QString::fromStdString(sTriggerSource); } else qDebug() << __FUNCTION__ << __LINE__ << "hardTrigger"; return true; } //注意,实际为软触发,应当每张图要有通信信号 bool Hd_25DCameraVJ_module::run() { ifRunning = true; ifBreak = false; bool result = false; //qDebug() << "[info]" << __FUNCTION__ << " line:" << __LINE__ << " run start" <setFlag(true); workThread->run(); //start()线程运行,频率高时有低概率无响应; int mytime = 0; while (true) { if (moduleStatus == false || mytime++ > getImageTimeOut || ifBreak == true) { result = false; break; } n_mutex->lock(); if (queuePic.size() > 0) result = true; n_mutex->unlock(); if (result == true) break; Sleep(1); } workThread->setFlag(false); } catch (QString ev) { qDebug() << "[info] FUNCTION:" << __FUNCTION__ << " line:" << __LINE__ << " ev:" << ev; } //qDebug() << "[info]"<< __FUNCTION__ << " line:" << __LINE__ << " run end" ; return result; } LocalKglDeviceEventSink::LocalKglDeviceEventSink() { } LocalKglDeviceEventSink::~LocalKglDeviceEventSink() { } void LocalKglDeviceEventSink::onLinkDisconnected(const KglDevice* pDevice) { //it is required to write action when event received. int a = 3; a = a + 3; return; } void LocalKglDeviceEventSink::onEventGenICam(const KglDevice* pDevice, const uint16_t eventID, const uint16_t channel, const uint64_t blockID, const uint64_t timestamp, const uint32_t nodenum, const KglGenParameter** pNode) { //string sEventMessage = ""; //string sDevicePAddress = pDevice.getiPAdaress() // sEventMessage += "eventID: Ox" + eventID.ToString("X2"); switch (eventID) { case 0x9000: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 触发已输入", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9000" << "(Trigger entered,触发已输入 )";//触发已输入 break; case 0x9001: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessage + " 未接收到触发信号", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9001" << "(No trigger signal received,未接收到触发信号 )";//未接收到触发信号 break; case 0x9002: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 允许触发开始", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9002" << "(Allow the trigger to start,允许触发开始 )";//允许触发开始 break; case 0x9003: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 允许触发结束", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9003" << "(Allow the trigger to end,允许触发结束 )";//允许触发结束 break; case 0x9004: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 相机曝光", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9004" << "(Camera exposure,相机曝光 )";//相机曝光 break; case 0x9005: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 相机未曝光", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9005" << "(Camera not exposure,相机未曝光 )";//相机未曝光 break; case 0x9006: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 开始图像传输", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9006" << "(Start the image transfer,开始图像传输 )";//开始图像传输 break; case 0x9007: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 结束图像传输", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9007" << "(End the image transfer,结束图像传输 )";//结束图像传输 break; case 0x9008: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 图像输出完成", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x9008" << "(Image output complete,图像输出完成 )";//图像输出完成 break; case 0x900A: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 后台缓存已满", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x900A" << "(The background cache is full,后台缓存已满 )";//后台缓存已满 break; case 0x900B: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 后台缓存溢出", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x900B" << "(Background cache overflow,后台缓存溢出 )";//后台缓存溢出 break; case 0x900C: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 历史图像缓存=1后台缓存=0", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x900C" << "(Historical image cache = 1 background cache = 0)";//历史图像缓存=1后台缓存=0 break; case 0x900D: /*for (int i = 0; i < pNode.size(); i++) { KglGenParameter node = pNode->ElementAt(i); } Log.LogFileAndUI("IP:" + sDevicePAddress + " " + sEventMessagee + " 线扫相机触发通过", Color.Black);*/ qDebug() << "(2.5Dmodel) " << "0x900D" << "(The line scan camera triggers pass,线扫相机触发通过 )";//线扫相机触发通过 break; default: /*Log.LogFileAndUl("IP:" + sDevicePAddress + "" + sEventMessage, Color.Black); gonDeviceEventGenICam(sDevicePAddress, sEventMessage);*/ qDebug() << "(2.5Dmodel) " << "(Other events,其他事件 )";//其他事件 break; } }