Files
ds-628/BaseModules/Hd_25DCameraVJ_module/Hd_25DCameraVJ_module.cpp
T
2024-09-27 14:31:22 +08:00

1270 lines
35 KiB
C++

#include "Hd_25DCameraVJ_module.h"
#include <QDebug>
#include <QQueue>
#include <QTextCodec>
//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<vector<cv::Mat>> queuePic;
QMutex* n_mutex = new QMutex();
std::vector<std::string> 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<std::string> GetEnableImageType(std::string sImageType)
{
std::vector<std::string> 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<cv::Mat>& 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<cv::Mat> matVecs;
std::string sImageType1 = "2";
std::vector<std::string> 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"<<stop-start << " 2.5D getImg, index"<<imgIndex++ ;
queuePic.append(matVecs);
n_mutex->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<cv::Mat>& mat, QByteArray& data)
{
Q_UNUSED(data);
if (queuePic.empty())
{
qCritical() << " [ error] " << __FUNCTION__ << " line:" << __LINE__ << " srcImage is null";
return false;
}
n_mutex->lock();
vector<cv::Mat> 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<cv::Mat>& 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" <<QString::fromStdString(Username);
try
{
workThread->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;
}
}