diff --git a/3rdparty/lib/LxCameraApi.lib b/3rdparty/lib/LxCameraApi.lib new file mode 100644 index 0000000..9964610 Binary files /dev/null and b/3rdparty/lib/LxCameraApi.lib differ diff --git a/doc/~$盘点客户端与web端通信协议(普洱,石家庄).docx b/doc/~$盘点客户端与web端通信协议(普洱,石家庄).docx deleted file mode 100644 index 50b6755..0000000 Binary files a/doc/~$盘点客户端与web端通信协议(普洱,石家庄).docx and /dev/null differ diff --git a/doc/视觉盘点客户端与web端通信协议(普洱,石家庄).docx b/doc/视觉盘点客户端与web端通信协议(普洱,石家庄).docx index 030e192..50600a4 100644 Binary files a/doc/视觉盘点客户端与web端通信协议(普洱,石家庄).docx and b/doc/视觉盘点客户端与web端通信协议(普洱,石家庄).docx differ diff --git a/runner17/Release/LxCameraApi.dll b/runner17/Release/LxCameraApi.dll new file mode 100644 index 0000000..462fefc Binary files /dev/null and b/runner17/Release/LxCameraApi.dll differ diff --git a/runner17/Release/LxDataProcess.dll b/runner17/Release/LxDataProcess.dll new file mode 100644 index 0000000..53fd396 Binary files /dev/null and b/runner17/Release/LxDataProcess.dll differ diff --git a/runner17/Release/config/camera.json b/runner17/Release/config/camera.json index 46aae93..8199b1c 100644 --- a/runner17/Release/config/camera.json +++ b/runner17/Release/config/camera.json @@ -18,7 +18,8 @@ "frame_rate": 9.3, "gain": 2, "height": 1200, - "id": 2, + "id": 1, + "location": 1, "loop": 1, "mac_address": "", "offset_x": 0, @@ -54,7 +55,8 @@ "frame_rate": 9.3, "gain": 2, "height": 3072, - "id": 1, + "id": 2, + "location": 2, "loop": 1, "mac_address": "", "offset_x": 0, @@ -71,14 +73,24 @@ "type": 140, "width": 2048, "zoom": 1 - } - }, - "top": { - "startID": 0, - "endID": 0 }, - "side": { - "startID": 1, - "endID": 2 + "Eagle-M4 F83A01121812": { + "id": 3, + "exposure": 10000, + "location": 1, + "save_img_suffix": ".BMP", + "basic_file": ".\\config\\right.ini", + "height": 3072, + "width": 2048, + "type": 210 } + }, + "top": { + "startID": 0, + "endID": 0 + }, + "side": { + "startID": 1, + "endID": 3 + } } diff --git a/runner17/Release/config/right.ini b/runner17/Release/config/right.ini new file mode 100644 index 0000000..2b736c5 --- /dev/null +++ b/runner17/Release/config/right.ini @@ -0,0 +1,4 @@ +0 -1276.05 270.764 +1 -416.796 261.033 +2 1288 2124.25 +0.402597 -0.00195196 0.915375 -1310.13 diff --git a/runner17/Release/smokeBox.exe b/runner17/Release/smokeBox.exe index 6911260..44a62bc 100644 Binary files a/runner17/Release/smokeBox.exe and b/runner17/Release/smokeBox.exe differ diff --git a/src/Camera.h b/src/Camera.h index 243c520..e244c7d 100644 --- a/src/Camera.h +++ b/src/Camera.h @@ -11,7 +11,8 @@ enum CameraType { Virtual = 100, // Hik = 140, - Basler = 190 // ˹ + Basler = 190, // ˹ + LXTof = 210 //оtof }; enum CameraTriggerMode { @@ -31,7 +32,7 @@ public: virtual bool startCamera() = 0; // ʼ virtual bool stopCamera() = 0; // ֹͣ virtual bool setTriggerSource(int) = 0; //ôԴ - virtual bool takeAPic(cv::Mat& imgMat) = 0; // ȡǰͼ + virtual bool takeAPic(cv::Mat& imgMat, cv::Mat&imgMat3D) = 0; // ȡǰͼ void start() { m_timer->start(); } void stop() { m_timer->stop(); } diff --git a/src/CameraControl.cpp b/src/CameraControl.cpp index bfb514f..f675cf6 100644 --- a/src/CameraControl.cpp +++ b/src/CameraControl.cpp @@ -1,559 +1,605 @@ -#pragma execution_character_set("utf-8") -#include "CameraControl.h" -#include - -CameraControl::CameraControl() -{ - m_calib = ILCalibNPointsPtr(__uuidof(LCalibNPoints)); - m_calib->FixImageMode = LPVFixImageMode::LPVFixImageUndistortAndUntilt; - - qRegisterMetaType >("QVector"); - m_pobjThread = new QThread; - moveToThread(m_pobjThread); - connect(m_pobjThread, &QThread::started, this, &CameraControl::onOpen); - connect(m_pobjThread, &QThread::finished, - this, &QObject::deleteLater); - m_pobjThread->start(); -} - -CameraControl::~CameraControl() -{ - if (m_pobjThread) - { - m_pobjThread->quit(); - m_pobjThread->wait(); - m_pobjThread = nullptr; - } - for each (Camera* pCamera in m_vecPCamera) - { - DELETE_POINTER(pCamera); - } - m_vecPCamera.clear(); -} - -Q_SLOT void CameraControl::onOpen() -{ - - QString filePath = QCoreApplication::applicationDirPath() + CAMERA_CONFIG; - if (readCameraConfig(filePath)) - { - m_bCamerasInit = initCamera(); - } -} - -bool CameraControl::readCameraConfig(QString filePath) -{ - m_mapIdCameraInfoSide.clear(); - m_mapIdCameraInfoTop.clear(); - m_mapSerialNumberIdSide.clear(); - m_mapSerialNumberIdTop.clear(); - - QFile file(filePath); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - qWarning() << "ļʧܣ"; - return false; - } - QByteArray arr = file.readAll(); - file.close(); - if (arr.isEmpty()) - { - qWarning() << "Ϊ"; - return false; - } - QJsonParseError err; - QJsonDocument doc = QJsonDocument::fromJson(arr, &err); - if (doc.isEmpty()) - { - qWarning() <<"[QJsonDocument]: "<< err.errorString(); //ӡʧϢ - return false; - } - - QJsonObject jsonObj = doc.object(); - auto getCameraType = [](int type)-> CameraType - { - CameraType cameraType; - switch (type) - { - case 100: - cameraType = CameraType::Virtual; - break; - case 140: - cameraType = CameraType::Hik; - break; - case 190: - cameraType = CameraType::Basler; - break; - default: - break; - } - return cameraType; - }; - - QJsonObject topObj = jsonObj.value("top").toObject(); - int topStartId, topEndId; - if (!topObj.isEmpty()) - { - topStartId = topObj.value("startID").toInt(); - topEndId = topObj.value("endID").toInt(); - } - else - { - qWarning() << "top id error"; - return false; - } - - QJsonObject sideObj = jsonObj.value("side").toObject(); - int sideStartId, sideEndId; - if (!sideObj.isEmpty()) - { - sideStartId = sideObj.value("startID").toInt(); - sideEndId = sideObj.value("endID").toInt(); - } - else - { - qWarning() << "side id error"; - return false; - } - - QJsonObject devicesObj = jsonObj.value("devices").toObject(); - if (!devicesObj.isEmpty()) { - QStringList devicesLabelList = devicesObj.keys(); - for each (QString deviceLabel in devicesLabelList) - { - CameraInfo cameraInfo; - cameraInfo.cameraLabel = deviceLabel; - QStringList strList = deviceLabel.split(' '); - if (strList.length() != 2) - { - qWarning() << "Device label: " << deviceLabel << " syntax error!"; - continue; - } - cameraInfo.modelName = strList.at(0); - cameraInfo.serialNumber = strList.at(1); - QJsonObject deviceObj = devicesObj.value(deviceLabel).toObject(); - if (!deviceObj.isEmpty()) - { - cameraInfo.cameraType = getCameraType(deviceObj.value("type").toInt()); - cameraInfo.exposure = deviceObj.value("exposure").toDouble(); - cameraInfo.imageHeight = deviceObj.value("height").toInt(); - cameraInfo.imageWidth = deviceObj.value("width").toInt(); - cameraInfo.calibFile = deviceObj.value("calib_file").toString(); - m_calib->Load(cameraInfo.calibFile.toStdString().c_str()); - cameraInfo.saveImgSuffix = deviceObj.value("save_img_suffix").toString(); - int id = deviceObj.value("id").toInt(); - if (deviceObj.contains("rotation_angle")) - { - cameraInfo.rotationAngle = deviceObj.value("rotation_angle").toInt(); - } - if (id >= topStartId && id <= topEndId) - { - m_mapIdCameraInfoTop[id] = cameraInfo; - m_mapSerialNumberIdTop[cameraInfo.serialNumber] = id; - } - else if (id >= sideStartId && id <= sideEndId) - { - m_mapIdCameraInfoSide[id] = cameraInfo; - m_mapSerialNumberIdSide[cameraInfo.serialNumber] = id; - qInfo() << "m_mapSerialNumberIdSide[" << cameraInfo.serialNumber << "]: " << id; - } - - } - } - } - return true; -} - -bool CameraControl::initCamera() -{ - qInfo() << "initCamera"; - QList cameraInfoList = m_mapIdCameraInfoSide.values(); - qInfo() << "cameraInfoList.len = "<< cameraInfoList.length(); - cameraInfoList.append(m_mapIdCameraInfoTop.values()); - if (!loadCamera(cameraInfoList)) - { - qWarning() << "Load camera failed"; - return false; - } - else - { - QStringList serialNumberList = m_mapSNIndex.keys(); - for each (const QString& serialNumber in serialNumberList) - { - if (!openCamera(serialNumber)) - { - qWarning() << "Open camera: " << serialNumber << " failed"; - continue; - } - else - { - qDebug() << "Open camera: " << serialNumber << " successed"; - if (!startCamera(serialNumber)) - { - qWarning() << "Start camera: " << serialNumber << " failed"; - continue; - } - else - { - qDebug() << "Start camera: " << serialNumber << " successed"; - if (!setSoftwareTrigger(serialNumber)) - { - qWarning() << "Set camera: " << serialNumber << " software trigger failed"; - } - else - { - qDebug() << "Set camera: " << serialNumber << " software trigger successed"; - } - } - } - } - } - return true; -} - -bool CameraControl::loadCamera(const QList& cameraInfoList) -{ - bool flag = true; - for each (Camera* pCamera in m_vecPCamera) - { - DELETE_POINTER(pCamera); - } - m_vecPCamera.clear(); - m_mapSNIndex.clear(); - for each(CameraInfo cameraInfo in cameraInfoList) - { - QString serialNumber = cameraInfo.serialNumber; - CameraType cameraType = cameraInfo.cameraType; - if (cameraType == CameraType::Hik) - { - Camera* pHikCamera = new HikCamera(); - if (pHikCamera->initCamera(serialNumber)) - { - m_vecPCamera.push_back(pHikCamera); - m_mapSNIndex[serialNumber] = m_vecPCamera.size() - 1; - } - else - { - qWarning() << "SerialNumber: " << serialNumber << " init failed"; - DELETE_POINTER(pHikCamera); - //flag = false; - } - } - } - qDebug() << "m_vecPCamera size: " << m_vecPCamera.size(); - return flag; -} -bool CameraControl::openCamera(const QStringList& serialNumberList) -{ - bool flag = true; - for each (QString serialNumber in serialNumberList) - { - if (!openCamera(serialNumber)) - { - qWarning() << "Open " << serialNumber << "failed!"; - flag = false; - } - else - { - qDebug() << "Open " << serialNumber << " successed"; - } - } - return flag; -} -bool CameraControl::closeCamera(const QStringList& serialNumberList) -{ - bool flag = true; - for each (QString serialNumber in serialNumberList) - { - if (!closeCamera(serialNumber)) - { - qWarning() << "Close " << serialNumber << "failed!"; - flag = false; - } - else - { - qDebug() << "Close " << serialNumber << " successed"; - } - } - return flag; -} -bool CameraControl::startCamera(const QStringList& serialNumberList) -{ - bool flag = true; - for each (QString serialNumber in serialNumberList) - { - if (!startCamera(serialNumber)) - { - qWarning() << "Start " << serialNumber << "failed!"; - flag = false; - } - else - { - qDebug() << "Start " << serialNumber << " successed"; - } - } - return flag; -} - -bool CameraControl::stopCamera(const QStringList& serialNumberList) -{ - bool flag = true; - for each (QString serialNumber in serialNumberList) - { - if (!stopCamera(serialNumber)) - { - qWarning() << "Stop " << serialNumber << "failed!"; - flag = false; - } - else - { - qDebug() << "Stop " << serialNumber << " successed"; - } - } - return flag; -} - -bool CameraControl::setSoftwareTrigger(const QStringList& serialNumberList) -{ - bool flag = true; - for each (QString serialNumber in serialNumberList) - { - if (!setSoftwareTrigger(serialNumber)) - { - qWarning() << "Set " << serialNumber << " software trigger failed!"; - flag = false; - } - else - { - qDebug() << "Set " << serialNumber << " software trigger successed"; - } - } - return flag; -} - -bool CameraControl::openCamera(const QString& serialNumber) -{ - QMap::iterator iter = m_mapSNIndex.find(serialNumber); - if (iter == m_mapSNIndex.end()) - { - qWarning() << "Do not find " << serialNumber; - return false; - } - int index = iter.value(); - return m_vecPCamera[index]->openCamera(); -} - -bool CameraControl::closeCamera(const QString& serialNumber) -{ - QMap::iterator iter = m_mapSNIndex.find(serialNumber); - if (iter == m_mapSNIndex.end()) - { - qWarning() << "Do not find " << serialNumber; - return false; - } - int index = iter.value(); - return m_vecPCamera[index]->closeCamera(); -} - -bool CameraControl::startCamera(const QString& serialNumber) -{ - QMap::iterator iter = m_mapSNIndex.find(serialNumber); - if (iter == m_mapSNIndex.end()) - { - qWarning() << "Do not find " << serialNumber; - return false; - } - int index = iter.value(); - return m_vecPCamera[index]->startCamera(); -} - -bool CameraControl::stopCamera(const QString& serialNumber) -{ - QMap::iterator iter = m_mapSNIndex.find(serialNumber); - if (iter == m_mapSNIndex.end()) - { - qWarning() << "Do not find " << serialNumber; - return false; - } - int index = iter.value(); - return m_vecPCamera[index]->stopCamera(); -} - -bool CameraControl::setSoftwareTrigger(const QString& serialNumber) -{ - QMap::iterator iter = m_mapSNIndex.find(serialNumber); - if (iter == m_mapSNIndex.end()) - { - qWarning() << "Do not find " << serialNumber; - return false; - } - int index = iter.value(); - return m_vecPCamera[index]->setTriggerSource(SOFTWARE); -} - -cv::Mat CameraControl::capture(const QString& serialNumber) -{ - QMap::iterator iter = m_mapSNIndex.find(serialNumber); - if (iter == m_mapSNIndex.end()) - { - qWarning() << "Do not find " << serialNumber; - return cv::Mat(); - } - int index = iter.value(); - cv::Mat imgMat; - m_vecPCamera[index]->takeAPic(imgMat); - if (imgMat.empty()) - { - qWarning() << serialNumber << " capture empty"; - } - return imgMat; -} - -bool CameraControl::getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo) -{ - QString imgSaveBaseName; - auto iter = m_mapSerialNumberIdSide.find(serialNumber); - if (iter == m_mapSerialNumberIdSide.end()) - { - iter = m_mapSerialNumberIdTop.find(serialNumber); - if (iter != m_mapSerialNumberIdTop.end()) - { - int id = iter.value(); - QString suffix = m_mapIdCameraInfoTop.value(id).saveImgSuffix; - fileInfo.suffix = suffix; - fileInfo.strId = QString::number(id); - fileInfo.name = fileInfo.strId + suffix; - } - else - { - qWarning() << "Can not find " << serialNumber; - return false; - } - } - else - { - int id = iter.value(); - QString suffix = m_mapIdCameraInfoSide.value(id).saveImgSuffix; - fileInfo.suffix = suffix; - fileInfo.strId = QString::number(id); - fileInfo.name = fileInfo.strId + suffix; - } - return true; -} - -Q_SLOT void CameraControl::onCapture(int cameraLocation,int cameraID) -{ - qInfo() << "[onCapture]: Enter"; - qInfo() << "[onCapture]: cameraLocation = "<< cameraLocation; - qInfo() << "[onCapture]: cameraID = " << cameraID; - QStringList serialNumList; - switch (cameraLocation) - { - case eCameraLocation::emTop: - m_eCameraLocation = emTop; - serialNumList = m_mapSerialNumberIdTop.keys(); - break; - case eCameraLocation::emSide: - m_eCameraLocation = emSide; -#if IMAGEDRAWING == LPV - for (auto iter = m_mapSerialNumberIdSide.begin(); iter != m_mapSerialNumberIdSide.end(); iter++) - { - if (iter.value() == cameraID) - { - serialNumList << iter.key(); - } - } - - qInfo() << serialNumList; -#elif IMAGEDRAWING == OPENCV - serialNumList = m_mapSerialNumberIdSide.keys(); -#endif // IMAGEDRAWING == LPV - - - break; - default: - break; - } - qInfo() << "[onCapture]: Out"; - if (serialNumList.length() != 0) - { - capture(serialNumList); - } -} - -void CameraControl::capture(const QStringList& serialNumberList) -{ - int len = serialNumberList.length(); - //qDebug() << "start capture, length: " << len; - QVector vecImageInfo; - for (int i = 0; i < len; ++i) - { - QString serialNumber = serialNumberList.at(i); - if (!m_mapSNIndex.contains(serialNumber)) - { - qWarning() << "m_vecPCamera does not have camera: " << serialNumber; - continue; - } - ImageInfo imgInfo; - FileInfo saveImgInfo; - getSaveImgNameInfo(serialNumber, saveImgInfo); - imgInfo.saveImgInfo = saveImgInfo; - int id = saveImgInfo.strId.toInt(); - int rotationAngle = 0; - if (m_mapIdCameraInfoTop.contains(id)) - { - rotationAngle = m_mapIdCameraInfoTop.value(id).rotationAngle; - } - else if (m_mapIdCameraInfoSide.contains(id)) - { - rotationAngle = m_mapIdCameraInfoSide.value(id).rotationAngle; - } - flipImg(capture(serialNumber), imgInfo.image, rotationAngle); - imgInfo.cameraSn = serialNumber; - if (imgInfo.imageOrigin == nullptr) - { - imgInfo.imageOrigin = ILImagePtr(__uuidof(LImage)); - imgInfo.imageFixed = ILImagePtr(__uuidof(LImage)); - } - - imgInfo.imageOrigin->SetImageData(imgInfo.image.cols, imgInfo.image.rows, (void*)imgInfo.image.data, imgInfo.image.step, 0); - - if (m_calib->IsCalibrated()) - { - m_calib->FixImage(imgInfo.imageOrigin, imgInfo.imageFixed); - } - vecImageInfo.push_back(imgInfo); - } - - emit sgCapturedImage(vecImageInfo, m_eCameraLocation); -} - -void CameraControl::flipImg(const cv::Mat& imgSrc, cv::Mat& imgDst, int rotationAngle) -{ - if (imgSrc.empty()) - { - qWarning() << "imgSrc is empty"; - return; - } - switch (rotationAngle) - { - case 90: - cv::transpose(imgSrc, imgDst); - cv::flip(imgDst, imgDst, 1); - qDebug() << " ת90"; - break; - case 180: - cv::flip(imgSrc, imgDst, -1); - qDebug() << " ת180"; - break; - case 270: - cv::transpose(imgSrc, imgDst); - cv::flip(imgDst, imgDst, 0); - qDebug() << " ת270"; - break; - default: - imgDst = imgSrc; - qDebug() << " ת"; - break; - } -} +#pragma execution_character_set("utf-8") +#include "CameraControl.h" +#include + +CameraControl::CameraControl() +{ + m_calib = ILCalibNPointsPtr(__uuidof(LCalibNPoints)); + m_calib->FixImageMode = LPVFixImageMode::LPVFixImageUndistortAndUntilt; + + qRegisterMetaType >("QVector"); + m_pobjThread = new QThread; + moveToThread(m_pobjThread); + connect(m_pobjThread, &QThread::started, this, &CameraControl::onOpen); + connect(m_pobjThread, &QThread::finished, + this, &QObject::deleteLater); + m_pobjThread->start(); +} + +CameraControl::~CameraControl() +{ + if (m_pobjThread) + { + m_pobjThread->quit(); + m_pobjThread->wait(); + m_pobjThread = nullptr; + } + for each (Camera* pCamera in m_vecPCamera) + { + DELETE_POINTER(pCamera); + } + m_vecPCamera.clear(); +} + +Q_SLOT void CameraControl::onOpen() +{ + QString filePath = QCoreApplication::applicationDirPath() + CAMERA_CONFIG; + if (readCameraConfig(filePath)) + { + m_bCamerasInit = initCamera(); + } +} + +bool CameraControl::readCameraConfig(QString filePath) +{ + m_mapIdCameraInfoSide.clear(); + m_mapIdCameraInfoTop.clear(); + m_mapSerialNumberIdSide.clear(); + m_mapSerialNumberIdTop.clear(); + + QFile file(filePath); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qWarning() << "ļʧܣ"; + return false; + } + QByteArray arr = file.readAll(); + file.close(); + if (arr.isEmpty()) + { + qWarning() << "Ϊ"; + return false; + } + QJsonParseError err; + QJsonDocument doc = QJsonDocument::fromJson(arr, &err); + if (doc.isEmpty()) + { + qWarning() <<"[QJsonDocument]: "<< err.errorString(); //ӡʧϢ + return false; + } + + QJsonObject jsonObj = doc.object(); + auto getCameraType = [](int type)-> CameraType + { + CameraType cameraType; + switch (type) + { + case 100: + cameraType = CameraType::Virtual; + break; + case 140: + cameraType = CameraType::Hik; + break; + case 190: + cameraType = CameraType::Basler; + break; + case 210: + cameraType = CameraType::LXTof; + break; + default: + break; + } + return cameraType; + }; + + QJsonObject topObj = jsonObj.value("top").toObject(); + int topStartId, topEndId; + if (!topObj.isEmpty()) + { + topStartId = topObj.value("startID").toInt(); + topEndId = topObj.value("endID").toInt(); + } + else + { + qWarning() << "top id error"; + return false; + } + + QJsonObject sideObj = jsonObj.value("side").toObject(); + int sideStartId, sideEndId; + if (!sideObj.isEmpty()) + { + sideStartId = sideObj.value("startID").toInt(); + sideEndId = sideObj.value("endID").toInt(); + } + else + { + qWarning() << "side id error"; + return false; + } + + QJsonObject devicesObj = jsonObj.value("devices").toObject(); + if (!devicesObj.isEmpty()) { + QStringList devicesLabelList = devicesObj.keys(); + for each (QString deviceLabel in devicesLabelList) + { + CameraInfo cameraInfo; + cameraInfo.cameraLabel = deviceLabel; + QStringList strList = deviceLabel.split(' '); + if (strList.length() != 2) + { + qWarning() << "Device label: " << deviceLabel << " syntax error!"; + continue; + } + cameraInfo.modelName = strList.at(0); + cameraInfo.serialNumber = strList.at(1); + QJsonObject deviceObj = devicesObj.value(deviceLabel).toObject(); + if (!deviceObj.isEmpty()) + { + cameraInfo.cameraType = getCameraType(deviceObj.value("type").toInt()); + cameraInfo.exposure = deviceObj.value("exposure").toDouble(); + cameraInfo.imageHeight = deviceObj.value("height").toInt(); + cameraInfo.imageWidth = deviceObj.value("width").toInt(); + cameraInfo.location = deviceObj.value("location").toInt(); + m_cameraStockLocation.insert(cameraInfo.serialNumber, cameraInfo.location); + if (deviceObj.contains("calib_file")) + { + cameraInfo.calibFile = deviceObj.value("calib_file").toString(); + m_calib->Load(cameraInfo.calibFile.toStdString().c_str()); + } + if (deviceObj.contains("basic_file")) + { + cameraInfo.basicFile = deviceObj.value("basic_file").toString(); + } + + cameraInfo.saveImgSuffix = deviceObj.value("save_img_suffix").toString(); + int id = deviceObj.value("id").toInt(); + if (deviceObj.contains("rotation_angle")) + { + cameraInfo.rotationAngle = deviceObj.value("rotation_angle").toInt(); + } + if (id >= topStartId && id <= topEndId) + { + m_mapIdCameraInfoTop[id] = cameraInfo; + m_mapSerialNumberIdTop[cameraInfo.serialNumber] = id; + } + else if (id >= sideStartId && id <= sideEndId) + { + m_mapIdCameraInfoSide[id] = cameraInfo; + m_mapSerialNumberIdSide[cameraInfo.serialNumber] = id; + } + + } + } + } + return true; +} + +bool CameraControl::initCamera() +{ + QList cameraInfoList = m_mapIdCameraInfoSide.values(); + cameraInfoList.append(m_mapIdCameraInfoTop.values()); + if (!loadCamera(cameraInfoList)) + { + qWarning() << "Load camera failed"; + return false; + } + else + { + QStringList serialNumberList = m_mapSNIndex.keys(); + for each (const QString& serialNumber in serialNumberList) + { + if (!openCamera(serialNumber)) + { + qWarning() << "Open camera: " << serialNumber << " failed"; + continue; + } + else + { + qDebug() << "Open camera: " << serialNumber << " successed"; + if (!startCamera(serialNumber)) + { + qWarning() << "Start camera: " << serialNumber << " failed"; + continue; + } + else + { + qDebug() << "Start camera: " << serialNumber << " successed"; + if (!setSoftwareTrigger(serialNumber)) + { + qWarning() << "Set camera: " << serialNumber << " software trigger failed"; + } + else + { + qDebug() << "Set camera: " << serialNumber << " software trigger successed"; + } + } + } + } + } + return true; +} + +bool CameraControl::loadCamera(const QList& cameraInfoList) +{ + bool flag = false; + for each (Camera* pCamera in m_vecPCamera) + { + DELETE_POINTER(pCamera); + } + m_vecPCamera.clear(); + m_mapSNIndex.clear(); + + for each(CameraInfo cameraInfo in cameraInfoList) + { + qDebug() << "serialNumber[" << cameraInfo.serialNumber << "]:" << cameraInfo.cameraType; + + QString serialNumber = cameraInfo.serialNumber; + CameraType cameraType = cameraInfo.cameraType; + if (cameraType == CameraType::Hik) + { + Camera* pHikCamera = new HikCamera(); + if (pHikCamera->initCamera(serialNumber)) + { + m_vecPCamera.push_back(pHikCamera); + m_mapSNIndex[serialNumber] = m_vecPCamera.size() - 1; + flag = true; + } + else + { + qWarning() << "SerialNumber: " << serialNumber << " init failed"; + DELETE_POINTER(pHikCamera); + //flag = false; + } + } + else if (cameraType == CameraType::LXTof) + { + Camera* pLXCamera = new LXCamera(); + if (pLXCamera->initCamera(serialNumber)) + { + m_vecPCamera.push_back(pLXCamera); + m_mapSNIndex[serialNumber] = m_vecPCamera.size() - 1; + flag = true; + } + else + { + qWarning() << "SerialNumber: " << serialNumber << " init failed"; + DELETE_POINTER(pLXCamera); + //flag = false; + } + } + } + qDebug() << "m_vecPCamera size: " << m_vecPCamera.size(); + return flag; +} +bool CameraControl::openCamera(const QStringList& serialNumberList) +{ + bool flag = true; + for each (QString serialNumber in serialNumberList) + { + if (!openCamera(serialNumber)) + { + qWarning() << "Open " << serialNumber << "failed!"; + flag = false; + } + else + { + qDebug() << "Open " << serialNumber << " successed"; + } + } + return flag; +} +bool CameraControl::closeCamera(const QStringList& serialNumberList) +{ + bool flag = true; + for each (QString serialNumber in serialNumberList) + { + if (!closeCamera(serialNumber)) + { + qWarning() << "Close " << serialNumber << "failed!"; + flag = false; + } + else + { + qDebug() << "Close " << serialNumber << " successed"; + } + } + return flag; +} +bool CameraControl::startCamera(const QStringList& serialNumberList) +{ + bool flag = true; + for each (QString serialNumber in serialNumberList) + { + if (!startCamera(serialNumber)) + { + qWarning() << "Start " << serialNumber << "failed!"; + flag = false; + } + else + { + qDebug() << "Start " << serialNumber << " successed"; + } + } + return flag; +} + +bool CameraControl::stopCamera(const QStringList& serialNumberList) +{ + bool flag = true; + for each (QString serialNumber in serialNumberList) + { + if (!stopCamera(serialNumber)) + { + qWarning() << "Stop " << serialNumber << "failed!"; + flag = false; + } + else + { + qDebug() << "Stop " << serialNumber << " successed"; + } + } + return flag; +} + +bool CameraControl::setSoftwareTrigger(const QStringList& serialNumberList) +{ + bool flag = true; + for each (QString serialNumber in serialNumberList) + { + if (!setSoftwareTrigger(serialNumber)) + { + qWarning() << "Set " << serialNumber << " software trigger failed!"; + flag = false; + } + else + { + qDebug() << "Set " << serialNumber << " software trigger successed"; + } + } + return flag; +} + +bool CameraControl::openCamera(const QString& serialNumber) +{ + QMap::iterator iter = m_mapSNIndex.find(serialNumber); + if (iter == m_mapSNIndex.end()) + { + qWarning() << "Do not find " << serialNumber; + return false; + } + int index = iter.value(); + return m_vecPCamera[index]->openCamera(); +} + +bool CameraControl::closeCamera(const QString& serialNumber) +{ + QMap::iterator iter = m_mapSNIndex.find(serialNumber); + if (iter == m_mapSNIndex.end()) + { + qWarning() << "Do not find " << serialNumber; + return false; + } + int index = iter.value(); + return m_vecPCamera[index]->closeCamera(); +} + +bool CameraControl::startCamera(const QString& serialNumber) +{ + QMap::iterator iter = m_mapSNIndex.find(serialNumber); + if (iter == m_mapSNIndex.end()) + { + qWarning() << "Do not find " << serialNumber; + return false; + } + int index = iter.value(); + return m_vecPCamera[index]->startCamera(); +} + +bool CameraControl::stopCamera(const QString& serialNumber) +{ + QMap::iterator iter = m_mapSNIndex.find(serialNumber); + if (iter == m_mapSNIndex.end()) + { + qWarning() << "Do not find " << serialNumber; + return false; + } + int index = iter.value(); + return m_vecPCamera[index]->stopCamera(); +} + +bool CameraControl::setSoftwareTrigger(const QString& serialNumber) +{ + QMap::iterator iter = m_mapSNIndex.find(serialNumber); + if (iter == m_mapSNIndex.end()) + { + qWarning() << "Do not find " << serialNumber; + return false; + } + int index = iter.value(); + return m_vecPCamera[index]->setTriggerSource(SOFTWARE); +} + +bool CameraControl::capture(const QString& serialNumber, cv::Mat& img, cv::Mat& img3D) +{ + QMap::iterator iter = m_mapSNIndex.find(serialNumber); + if (iter == m_mapSNIndex.end()) + { + qWarning() << "Do not find " << serialNumber; + return false; + } + int index = iter.value(); + m_vecPCamera[index]->takeAPic(img, img3D); + if (img.empty()) + { + qWarning() << serialNumber << " capture empty"; + } + return true; +} + +bool CameraControl::getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo) +{ + QString imgSaveBaseName; + auto iter = m_mapSerialNumberIdSide.find(serialNumber); + if (iter == m_mapSerialNumberIdSide.end()) + { + iter = m_mapSerialNumberIdTop.find(serialNumber); + if (iter != m_mapSerialNumberIdTop.end()) + { + int id = iter.value(); + QString suffix = m_mapIdCameraInfoTop.value(id).saveImgSuffix; + fileInfo.suffix = suffix; + fileInfo.strId = QString::number(id); + fileInfo.name = fileInfo.strId + suffix; + } + else + { + qWarning() << "Can not find " << serialNumber; + return false; + } + } + else + { + int id = iter.value(); + QString suffix = m_mapIdCameraInfoSide.value(id).saveImgSuffix; + fileInfo.suffix = suffix; + fileInfo.strId = QString::number(id); + fileInfo.name = fileInfo.strId + suffix; + } + return true; +} + +Q_SLOT void CameraControl::onCapture(int cameraLocation,int location) +{ + QStringList serialNumList; + switch (cameraLocation) + { + case eCameraLocation::emTop: + m_eCameraLocation = emTop; +#if IMAGEDRAWING == LPV + for (auto iter = m_mapSerialNumberIdTop.begin(); iter != m_mapSerialNumberIdTop.end(); iter++) + { + if (m_cameraStockLocation.contains(iter.key())) + { + serialNumList << iter.key(); + } + } +#elif IMAGEDRAWING == OPENCV + serialNumList = m_mapSerialNumberIdTop.keys(); +#endif + break; + case eCameraLocation::emSide: + m_eCameraLocation = emSide; +#if IMAGEDRAWING == LPV + for (auto iter = m_mapSerialNumberIdSide.begin(); iter != m_mapSerialNumberIdSide.end(); iter++) + { + if (m_cameraStockLocation.contains(iter.key())) + { + serialNumList << iter.key(); + } + } +#elif IMAGEDRAWING == OPENCV + serialNumList = m_mapSerialNumberIdSide.keys(); +#endif // IMAGEDRAWING == LPV + + + break; + default: + break; + } + + if (serialNumList.length() != 0) + { + capture(serialNumList); + } +} + +void CameraControl::capture(const QStringList& serialNumberList) +{ + int len = serialNumberList.length(); + //qDebug() << "start capture, length: " << len; + QVector vecImageInfo; + for (int i = 0; i < len; ++i) + { + QString serialNumber = serialNumberList.at(i); + if (!m_mapSNIndex.contains(serialNumber)) + { + qWarning() << "m_vecPCamera does not have camera: " << serialNumber; + continue; + } + ImageInfo imgInfo; + FileInfo saveImgInfo; + getSaveImgNameInfo(serialNumber, saveImgInfo); + imgInfo.saveImgInfo = saveImgInfo; + int id = saveImgInfo.strId.toInt(); + int rotationAngle = 0; + if (m_mapIdCameraInfoTop.contains(id)) + { + rotationAngle = m_mapIdCameraInfoTop.value(id).rotationAngle; + } + else if (m_mapIdCameraInfoSide.contains(id)) + { + rotationAngle = m_mapIdCameraInfoSide.value(id).rotationAngle; + } + if (!capture(serialNumber, imgInfo.image, imgInfo.image3D)) + { + vecImageInfo.push_back(imgInfo); + continue; + } + flipImg(imgInfo.image, imgInfo.image, rotationAngle); + imgInfo.cameraSn = serialNumber; + + // 2D + if (imgInfo.imageOrigin == nullptr) + { + imgInfo.imageOrigin = ILImagePtr(__uuidof(LImage)); + imgInfo.imageFixed = ILImagePtr(__uuidof(LImage)); + } + //imgInfo.imageOrigin->SetImageData(imgInfo.image.cols, imgInfo.image.rows, (void*)imgInfo.image.data, imgInfo.image.step, 0); + + if (serialNumber == "00787720450") { imgInfo.imageOrigin->Load("C:/Users/LENOVO/Downloads/0108/310102.bmp"); } else if (serialNumber == "00J49540865") { imgInfo.imageOrigin->Load("C:/Users/LENOVO/Downloads/0108/320111.bmp"); } + else + { + imgInfo.imageOrigin->SetImageData(imgInfo.image.cols, imgInfo.image.rows, (void*)imgInfo.image.data, imgInfo.image.step, 0); + } + + if (m_calib->IsCalibrated()) + { + m_calib->FixImage(imgInfo.imageOrigin, imgInfo.imageFixed); + } + + vecImageInfo.push_back(imgInfo); + } + + emit sgCapturedImage(vecImageInfo, m_eCameraLocation); +} + +void CameraControl::flipImg(const cv::Mat& imgSrc, cv::Mat& imgDst, int rotationAngle) +{ + if (imgSrc.empty()) + { + qWarning() << "imgSrc is empty"; + return; + } + switch (rotationAngle) + { + case 90: + cv::transpose(imgSrc, imgDst); + cv::flip(imgDst, imgDst, 1); + qDebug() << " ת90"; + break; + case 180: + cv::flip(imgSrc, imgDst, -1); + qDebug() << " ת180"; + break; + case 270: + cv::transpose(imgSrc, imgDst); + cv::flip(imgDst, imgDst, 0); + qDebug() << " ת270"; + break; + default: + imgDst = imgSrc; + qDebug() << " ת"; + break; + } +} diff --git a/src/CameraControl.h b/src/CameraControl.h index 53dffad..6f7517e 100644 --- a/src/CameraControl.h +++ b/src/CameraControl.h @@ -3,6 +3,7 @@ #include #include "HikCamera.h" +#include "LXCamera.h" #include "commonDefine.h" struct CameraInfo @@ -16,8 +17,10 @@ struct CameraInfo int imageWidth; // int imageHeight; //߶ int rotationAngle{ 0 }; //DǶ + int location = 0; //װλ(ӦڶѶλ), 12, 0Ϊ֮ǰ QString calibFile = ""; //궨ļַ + QString basicFile = ""; //3DĻ׼ļַ QString saveImgSuffix = ".bmp" ; //ͼʽ }; @@ -32,6 +35,7 @@ struct FileInfo struct ImageInfo { cv::Mat image; + cv::Mat image3D; ILImagePtr imageOrigin; ILImagePtr imageFixed; QString cameraSn; @@ -62,7 +66,7 @@ public: bool setSoftwareTrigger(const QString& serialNumber); - Q_SLOT void onCapture(int cameraLocation,int cameraID); + Q_SLOT void onCapture(int cameraLocation,int location); signals: void sgCapturedImage(const QVector& vecImageInfo, int cameraLocation); private: @@ -70,13 +74,14 @@ private: bool getSaveImgNameInfo(QString serialNumber, FileInfo& fileInfo); void capture(const QStringList& serialNumberList); - cv::Mat capture(const QString& serialNumber); + bool capture(const QString& serialNumber, cv::Mat& img, cv::Mat& img3D); void flipImg(const cv::Mat& imgSrc, cv::Mat& imgDst, int rotationAngle); - QMap m_mapIdCameraInfoTop; + QMap m_mapIdCameraInfoTop; QMap m_mapIdCameraInfoSide; QMap m_mapSerialNumberIdTop; - QMap m_mapSerialNumberIdSide; + QMap m_mapSerialNumberIdSide; // QString:SN룬int:ID + QMap m_cameraStockLocation; // QString:SN, int:ԻLocation QVector m_vecPCamera; QMap m_mapSNIndex; bool m_bCamerasInit{ false }; diff --git a/src/HikCamera.cpp b/src/HikCamera.cpp index 52c8080..09cbb0a 100644 --- a/src/HikCamera.cpp +++ b/src/HikCamera.cpp @@ -238,7 +238,7 @@ bool HikCamera::setTriggerSource(int mode) return setCameraProperty(TriggerMode, mode); } -bool HikCamera::takeAPic(cv::Mat& imgMat) +bool HikCamera::takeAPic(cv::Mat& imgMat, cv::Mat&imgMat3D) { if (m_pDevHandle == NULL) { diff --git a/src/HikCamera.h b/src/HikCamera.h index cf63851..42cc61c 100644 --- a/src/HikCamera.h +++ b/src/HikCamera.h @@ -28,7 +28,7 @@ public: virtual bool closeCamera() override; virtual bool startCamera() override; virtual bool stopCamera() override; - virtual bool takeAPic(cv::Mat& imgMat) override; + virtual bool takeAPic(cv::Mat& imgMat, cv::Mat&imgMat3D) override; virtual bool setTriggerSource(int mode) override; static int EnumDevices(unsigned int nTLayerType, MV_CC_DEVICE_INFO_LIST* pstDevList); diff --git a/src/LXCamera.cpp b/src/LXCamera.cpp new file mode 100644 index 0000000..9190dbd --- /dev/null +++ b/src/LXCamera.cpp @@ -0,0 +1,157 @@ +#include "LXCamera.h" + +#include +#include +#include +#include "lxCamera/lx_camera_api.h" + +#pragma comment(lib,"LxCameraApi.lib") + + +static char wait_key = '0'; +static DcHandle handle = 0; +#define checkTC(state) {LX_STATE val=state; \ + if(val != LX_SUCCESS){ \ + if(val == LX_E_RECONNECTING){ \ + qDebug()<< " device reconnecting";} \ + else if(val == LX_E_NOT_SUPPORT){ \ + qDebug()<< " not support";} \ + else{ \ + qDebug()<< DcGetErrorString(val); \ + DcCloseDevice(handle); \ + } \ + } \ +} + + +LXCamera::~LXCamera() +{ + destroyCamera(); +} + +bool LXCamera::initCamera(const QString& serialNumber) +{ + int device_num = 0; + LxDeviceInfo* p_device_list = NULL; + checkTC(DcGetDeviceList(&p_device_list, &device_num)); + if (device_num <= 0) + { + qDebug() << "Not found any tof device."; + return false; + } + m_handle = serialNumber.toStdString(); + qDebug() << "Find tof device: " << p_device_list; + return true; +} + +void LXCamera::destroyCamera() +{ + stopCamera(); + closeCamera(); +} + +bool LXCamera::openCamera() +{ + LxDeviceInfo device_info; + LX_STATE lx_state = DcOpenDevice(LX_OPEN_MODE::OPEN_BY_ID, m_handle.c_str(), &handle, &device_info); + if (LX_SUCCESS != lx_state) { + QString str = QString("open device failed, open_param: %1").arg(m_handle.c_str()); + qDebug() << str; + return false; + } + return true; +} + +bool LXCamera::closeCamera() +{ + return DcCloseDevice(handle); +} + +bool LXCamera::startCamera() +{ + // + bool test_depth = false, test_rgb = false; + checkTC(DcGetBoolValue(handle, LX_BOOL_ENABLE_3D_DEPTH_STREAM, &test_depth)); + checkTC(DcGetBoolValue(handle, LX_BOOL_ENABLE_2D_STREAM, &test_rgb)); + + // + checkTC(DcStartStream(handle)); + + std::thread pthread = std::thread(); + //pthread.detach(); + + //auto _time = std::chrono::system_clock::now(); + + // + auto ret = DcSetCmd(handle, LX_CMD_GET_NEW_FRAME); + + if (LX_SUCCESS != ret) + { + if (LX_E_RECONNECTING == ret) { + std::cout << "device reconnecting" << std::endl; + } + std::this_thread::sleep_for(std::chrono::seconds(1)); + qDebug() << "TofCamera Open Failed!"; + return false; + } + + qDebug() << "TofCamera Open Succeed!"; + return true; +} + +bool LXCamera::stopCamera() +{ + return DcStopStream(handle); +} + +bool LXCamera::setTriggerSource(int mode) +{ + return true; +} + +bool LXCamera::takeAPic(cv::Mat& imgMat, cv::Mat&imgMat3D) +{ + // + auto ret = DcSetCmd(handle, LX_CMD_GET_NEW_FRAME); + if (LX_SUCCESS != ret) + { + if (LX_E_RECONNECTING == ret) { + qDebug() << "device reconnecting"; + } + std::this_thread::sleep_for(std::chrono::seconds(1)); + //continue; + } + + FrameInfo* frame_ptr = nullptr; + checkTC(DcGetPtrValue(handle, LX_PTR_FRAME_DATA, (void**)&frame_ptr)); + if (!frame_ptr || frame_ptr->frame_state != LX_SUCCESS) { + qDebug() << "new frame not correct"; + return false; + } + + //Depth + if (frame_ptr->depth_data.frame_data != nullptr) + { + auto depth_data = frame_ptr->depth_data; + cv::Mat depth_image = cv::Mat(depth_data.frame_height, depth_data.frame_width, + CV_MAKETYPE(depth_data.frame_data_type, depth_data.frame_channel), depth_data.frame_data); + //cv::Mat show; + depth_image.convertTo(imgMat, CV_8U, 1.0 / 16); + //applyColorMap(show, show, COLORMAP_JET); + //cv::namedWindow("depth", 0); + //cv::resizeWindow("depth", 640, 480); + //cv::imshow("depth", show); + } + + //RGB + if (frame_ptr->rgb_data.frame_data != nullptr) + { + auto rgb_data = frame_ptr->rgb_data; + imgMat3D = cv::Mat(rgb_data.frame_height, rgb_data.frame_width, + CV_MAKETYPE(rgb_data.frame_data_type, rgb_data.frame_channel), rgb_data.frame_data); + + //cv::namedWindow("rgb", 0); + //cv::resizeWindow("rgb", 640, 480); + //cv::imshow("rgb", rgb_image); + } +} diff --git a/src/LXCamera.h b/src/LXCamera.h new file mode 100644 index 0000000..fa73cf9 --- /dev/null +++ b/src/LXCamera.h @@ -0,0 +1,28 @@ +#pragma once + +#include "camera.h" +#include "commonDefine.h" + +class LXCamera : public Camera +{ + Q_OBJECT + +public: + ~LXCamera(); + + virtual bool initCamera(const QString& serialNumber) override; + virtual void destroyCamera() override; + virtual bool openCamera() override; + virtual bool closeCamera() override; + virtual bool startCamera() override; + virtual bool stopCamera() override; + virtual bool takeAPic(cv::Mat& imgMat, cv::Mat&imgMat3D) override; + + virtual bool setTriggerSource(int mode) override; + + CameraType getCameraType() { return m_type; } + +private: + CameraType m_type = CameraType::LXTof; + std::string m_handle; +}; diff --git a/src/SmokeBoxIdentification.cpp b/src/SmokeBoxIdentification.cpp index 14965cf..365123d 100644 --- a/src/SmokeBoxIdentification.cpp +++ b/src/SmokeBoxIdentification.cpp @@ -19,8 +19,8 @@ SmokeBoxIdentification::SmokeBoxIdentification(QWidget *parent) QString applicationDirPath = QCoreApplication::applicationDirPath(); QtConcurrent::run([=]() { - if (decodeSmokeInfoCsv(applicationDirPath + SMOKEINFO_XLSX_CONFIG)) - matchSmokeNameAndTemplateFolderName(applicationDirPath + NUM_TEMPLATE_PATH); + //if (decodeSmokeInfoCsv(applicationDirPath + SMOKEINFO_XLSX_CONFIG)) + // matchSmokeNameAndTemplateFolderName(applicationDirPath + NUM_TEMPLATE_PATH); m_pDataProcess = std::make_shared(); if (m_pDataProcess) @@ -151,7 +151,7 @@ void SmokeBoxIdentification::saveImage(const cv::Mat& imgMat, const QString& fil qDebug() << "Save image: " << filePath; } -void SmokeBoxIdentification::saveImage(ILImagePtr image, const QString& filePath) +void SmokeBoxIdentification::saveImage(ILImagePtr image, const cv::Mat& imgMat3D, const QString& filePath) { if (image->Void()) { @@ -161,6 +161,15 @@ void SmokeBoxIdentification::saveImage(ILImagePtr image, const QString& filePath std::wstring path = filePath.toStdWString(); image->Save(path.c_str(), nullptr); qDebug() << "Save image: " << filePath; + + if (!imgMat3D.empty()) + { + int lastPos = filePath.lastIndexOf('.'); + QString pclPath = filePath.left(lastPos); + pclPath.append(".pcd"); + cv::imwrite(filePath.toStdString(), imgMat3D); + qDebug() << "Save PointCould: " << filePath; + } } void SmokeBoxIdentification::saveImage(const QVector& vecImageInfo, int workMode) @@ -207,7 +216,7 @@ void SmokeBoxIdentification::saveImage(const QVector& vecImageInfo, i QString filePath = QString("%1\\%2").arg(dataSaveFolderPath).arg(fileInfo.name); #if IMAGEDRAWING == LPV - saveImage(vecImageInfo.at(i).imageOrigin, filePath); + saveImage(vecImageInfo.at(i).imageOrigin, vecImageInfo.at(i).image3D, filePath); #elif IMAGEDRAWING == OPENCV if (workMode == WorkMode::IntoStock) @@ -224,6 +233,10 @@ void SmokeBoxIdentification::saveImage(const QVector& vecImageInfo, i Q_SLOT void SmokeBoxIdentification::onCapturedImage(const QVector& vecImageInfo, int cameraLocation) { + if (vecImageInfo.length() <= 0) + { + return; + } QString serialNumber = vecImageInfo.last().cameraSn; if (cameraLocation == eCameraLocation::emTop) { @@ -404,9 +417,7 @@ void SmokeBoxIdentification::calculate(int stocketID) FileInfo fileInfo = imgInfo.saveImgInfo; QString fileName = QString("%1_%2_rlt%3").arg(fileInfo.strId) .arg(m_currtStockCheckInfo.smokeTypeNum).arg(fileInfo.suffix); - qInfo() << "fileName" << fileName; QString filePath = QString("%1\\%2").arg(dataSaveFolder).arg(fileName); - qInfo() << "filePath" << filePath; m_pCategoryMatcher->saveResultsImage(filePath); break; } diff --git a/src/SmokeBoxIdentification.h b/src/SmokeBoxIdentification.h index 0f15d0c..d142afd 100644 --- a/src/SmokeBoxIdentification.h +++ b/src/SmokeBoxIdentification.h @@ -97,7 +97,7 @@ private: void captureSide(int cameraID); void saveImage(const QVector& vecImageInfo, int workMode); void saveImage(const cv::Mat& imgMat, const QString& filePath); - void saveImage(ILImagePtr image, const QString& filePath); + void saveImage(ILImagePtr image, const cv::Mat& imgMat3D, const QString& filePath); bool decodeSmokeInfoCsv(const QString& filePath); bool matchSmokeNameAndTemplateFolderName(const QString& folderPath); diff --git a/src/TofCamera.cpp b/src/TofCamera.cpp new file mode 100644 index 0000000..e5c3382 --- /dev/null +++ b/src/TofCamera.cpp @@ -0,0 +1,8 @@ +#include "TofCamera.h" + +TofCamera::TofCamera(QObject *parent) + : QObject(parent) +{} + +TofCamera::~TofCamera() +{} diff --git a/src/TofCamera.h b/src/TofCamera.h new file mode 100644 index 0000000..32bc10f --- /dev/null +++ b/src/TofCamera.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +class TofCamera : public QObject +{ + Q_OBJECT + +public: + TofCamera(QObject *parent); + ~TofCamera(); +}; diff --git a/src/common/commonDefine.h b/src/common/commonDefine.h index 658f527..13aac24 100644 --- a/src/common/commonDefine.h +++ b/src/common/commonDefine.h @@ -9,6 +9,7 @@ #include #include #include +#include #include "QZkJsonParser.h" #include "lp_singleton.h" diff --git a/src/lxCamera/lx_camera_api.h b/src/lxCamera/lx_camera_api.h new file mode 100644 index 0000000..5bf1675 --- /dev/null +++ b/src/lxCamera/lx_camera_api.h @@ -0,0 +1,172 @@ + +#ifndef _LX_CAMERA_API_H_ +#define _LX_CAMERA_API_H_ + +#include "lx_camera_define.h" + +//功能: 获取API版本号 +//参数:[out]version API版本号,无需外部分配内存 +LX_API_STR DcGetApiVersion(); + +//功能: 设置打印信息等级 +//参数:[in]print_level 0:info 所有调试信息 +// 1:warn 重要及警告类调试信息 +// 2:error 仅输出错误信息 +// [in]enable_screen_print 是否在窗口打印 +// [in]log_path log文件保存路径(不包含日志文件名),默认为程序执行路径 +LX_API DcSetInfoOutput(int print_level, bool enable_screen_print, const char* log_path); + +//功能: 允许用户输出调试信息到log文件 +//参数:[in]str 要输出的字符串,'\0'结尾 +LX_API DcLog(const char* str); + + +//功能:查找eagle系列所有网口相机,不包含usb相机 +//参数 [out]devlist 查找到的相机列表 +//参数 [out]devnum 查找到的相机数量 +//参数 [in]is_local_loop 是否本地回环, 一般情况下为false, 当SDK也运行在相机内部情况下为true +//内部维护内存,外部无须分配内存, 但因每次搜索前会清空原内容,故需外部保证线程安全 +//当SDK与相机端程序运行在同一主机的情况下此接口无需调用, 若依然调用将返回0条 +LX_API DcGetDeviceList(LxDeviceInfo** devlist, int* devnum); + + +//功能:连接设备 +//参数:[in]open_mode 打开方式, 具体说明见LX_OPEN_MODE +// [in]param 不同的打开方式,填写不同的参数(当sdk与相机端程序运行在同一主机情况下,此处填写"127.0.0.1") +// [out]handle 连接成功后返回的设备句柄,后续所有接口访问都依赖该handle字段 +// [out]info 连接成功后返回的相机详细信息 +LX_API DcOpenDevice(LX_OPEN_MODE open_mode, const char* param, DcHandle* handle, LxDeviceInfo* info); + + +//功能: 关闭设备 +//参数:[in]handle 设备句柄 +LX_API DcCloseDevice(DcHandle handle); + +//功能: 打开数据流 +//参数:[in]handle 设备句柄 +LX_API DcStartStream(DcHandle handle); + +//功能: 关闭数据流 +//参数:[in]handle 设备句柄 +LX_API DcStopStream(DcHandle handle); + +//功能: 保存点云,可直接调用 +//参数:[in]handle 设备句柄 +// [in]filename 文件名,支持txt,ply和pcd格式。txt格式按图像顺序保存所有数据,ply和pcd仅保存非零数据 +LX_API DcSaveXYZ(DcHandle handle, const char* filename); + +//功能: 设置相机IP和端口,如DcSetCameraIp(index,"192.168.100.18") 或DcSetCameraIp(index,"192.168.100.18", 3956); +// 修改完之后设备列表会变化,需重新调用DcGetDeviceList接口重新获取新的设备列表 +//参数:[in]handle 设备句柄, (当未连接上设备情况下,需先通过搜索获取) +// [in]ip 设备IP +// [in]netmask 子网掩码(若传空则内部默认"255.255.0.0") +// [in]gateway 网关ip(若传空则内部默认将ip最后网段置为"1"后作为网关) +LX_API DcSetCameraIp(DcHandle handle, const char* ip, const char* netmask, const char* gateway); + + +//功能:设置int类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [in]value 设置参数值 +LX_API DcSetIntValue(DcHandle handle, int cmd, int value); + +//功能:获取int类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [out]value 返回参数结构体 +LX_API DcGetIntValue(DcHandle handle, int cmd, LxIntValueInfo* value); + +//功能:设置float类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [in]value 设置参数值 +LX_API DcSetFloatValue(DcHandle handle, int cmd, float value); + +//功能:获取float类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [out]value 返回参数结构体 +LX_API DcGetFloatValue(DcHandle handle, int cmd, LxFloatValueInfo* value); + +//功能:设置bool类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [in]value 设置参数值 +LX_API DcSetBoolValue(DcHandle handle, int cmd, bool value); + +//功能:获取bool类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [out]value 返回参数 +LX_API DcGetBoolValue(DcHandle handle, int cmd, bool* value); + +//功能:设置string类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [in]value 设置参数值 +LX_API DcSetStringValue(DcHandle handle, int cmd, const char* value); + +//功能:获取string类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [out]value 返回参数,无需外部分配内存 +LX_API DcGetStringValue(DcHandle handle, int cmd, char** value); + +//功能:获取指针类型参数 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +// [out]value 返回参数,无需外部分配内存 +LX_API DcGetPtrValue(DcHandle handle, int cmd, void** value); + + +//功能:执行对应CMD类型指令操作 +//参数:[in]handle 设备句柄 +// [in]cmd 参考LX_CAMERA_FEATURE +LX_API DcSetCmd(DcHandle handle, int cmd); + + +//功能:LX_CAMERA_FEATURE定义之外的特殊操作,具体功能和参数由字符串command确定 +//参数:[in]handle 设备句柄 +// [in]command 指令 +// [in][out]value 设置时为对应入参,获取时为对应出参,无需外部分配内存 +LX_API DcSpecialControl(DcHandle handle, const char* command, void* value); + +//功能:设置ROI区域 +//参数:[in]handle 设备句柄 +// [in]x_offset 起始点水平偏移像素 +// [in]value 起始点垂直偏移参数 +// [in]type 0-3D图像 1-2D图像 +LX_API DcSetROI(DcHandle handle, int offsetx, int offsety, int width, int height, int img_type); + + +//功能: 注册数据帧回调函数,收到新的数据时自动调用 +//参数:[in]handle 设备句柄 +// [in]func 回调函数指针 +// [in]usr_data 用户自定义参数 +LX_API DcRegisterFrameCallback(DcHandle handle, LX_FRAME_CALLBACK func, void* usr_data); + +//功能: 取消数据帧注册回调函数 +//参数:[in]handle 设备句柄 +LX_API DcUnregisterFrameCallback(DcHandle handle); + + +//功能: 注册相机状态回调函数,相机状态变化时自动调用 +//参数:[in]handle 设备句柄 +// [in]func 回调函数指针 +// [in]usr_data 用户自定义参数 +LX_API DcRegisterCameraStatusCallback(DcHandle handle, LX_CAMERA_STATUS_CALLBACK func, void* usr_data); + +//功能: 取消相机状态注册回调函数 +//参数:[in]handle 设备句柄 +LX_API DcUnregisterCameraStatusCallback(DcHandle handle); + +//功能:设置参数路径 +//参数:[in]handle 设备句柄 +// [in]filepath 参数文件路径,不包含文件名(大部分情况不需要调用,仅部分相型号机打开时需要参数,如M3,I2等) +LX_API DcSetParamPath(DcHandle handle, const char* filepath); + +//功能: 获取函数返回状态对应的说明 +//参数:[in]state 函数接口返回的状态 +LX_API_STR DcGetErrorString(LX_STATE state); + +#endif diff --git a/src/lxCamera/lx_camera_application.h b/src/lxCamera/lx_camera_application.h new file mode 100644 index 0000000..7b82080 --- /dev/null +++ b/src/lxCamera/lx_camera_application.h @@ -0,0 +1,109 @@ + +#ifndef _LX_CAMERA_APPLICATION_H_ +#define _LX_CAMERA_APPLICATION_H_ + +#include +//! 地面平面,满足 ax + by + cz + d = 0 +typedef struct { + float a, b, c, d; +} LxGroundPlane; + +//2D 点 +typedef struct { + float x, y; +} LxPoint2d; + +//! 3D 点 +typedef struct { + float x, y, z; + uint8_t r, g, b; +} LxPoint3dWithRGB; + +//! 6自由度速度 +typedef struct { + float linear[3]; //!< 线速度 + float angular[3]; //!< 角速度 +} LxVelocity; + +typedef float LxRotation[9]; //!< 旋转矩阵 +typedef float LxTranslation[3]; //!< 平移向量 +typedef struct { + LxRotation R; //!< 旋转矩阵 + LxTranslation T; //!< 平移向量 + uint64_t timestamp; //!< unix时间戳 +} LxPose; + +//! 障碍物信息 +typedef struct { + LxPose pose; //!< 障碍物 Box 中心和旋转矩阵 + float width, height, depth; //!< 障碍物 Box 宽、高、深 + LxTranslation center; //!< 障碍物质心 + int32_t type; //!< 障碍物语义,暂未实现 + int64_t id; //!< 障碍物序号,暂未实现 + LxVelocity velocity; //!< 障碍物速度,暂未实现 +} LxObstacleBox; + + +typedef enum { + //! 执行成功 + LxAvSuccess = 0, + //! 未设置地面先验,请调用 LxAvSetGroundPriorPlane + LxAvGroundPriorNotSet = -1, + //! 未设置输入,请调用 LxAvSetInput_1 或 LxAvSetInput_2 + LxAvInputNotSet = -2, + //! 设置的范围内无点云,如需更改检测范围,请调用 LxAvSetRange + LxAvNoPointInRange = -3, + //! 过滤地面后点云为空 + LxAvNoPointAfterFilterGround = -4, + /*! 半径滤波后点云为空,通过调用 LxAvSetNoiseSituation 来设置合适的 + 参数可能会改善这个问题 */ + LxAvNoPointAfterRadiusFilter = -5, + //! 语义功能已开启,但未得到分割结果 + LxAvObstaclesNotSegmented = -6, + //! 未定义的错误 + LxAvUndefinedError = -99, +} LxAvState; + +//! 避障输出结构体 +typedef struct { + LxAvState state; //!< 返回状态 + LxGroundPlane groundPlane; //!< 检测到的距离最近的地面 + uint32_t number_3d; //!< 输出点个数 + LxPoint3dWithRGB* cloud_output; //!< 输出点云(已过滤地面与噪声) + uint32_t number_box; //!< 障碍物个数 + LxObstacleBox* obstacleBoxs; //!< 障碍物 Box +} LxAvoidanceOutput; + + +//! 托盘定位结构体 +//@Update Since 0.1.2: add return value and a float-array +// extents: 可扩展数据,总长度128 +// 当前数组置0,待扩展// x: 托盘中心距离相机光心距离,负值(叉车插臂方向为后退方向) +// y: 托盘中心距离相机光心右侧偏移距离,一般在(-500, 500)范围 +// yaw: 托盘倾斜角度,水平为0,单位为角度 +// extents: 扩展信息(int类型,长度为8192) +typedef struct { + int return_val; + float x, y, yaw; + int extents[8192]; +} LxPalletPose; + +typedef struct { + double x, y, theta; +}LxRelocPose; + +typedef struct { + int64_t timestamp; + double x, y, theta; +}LxOdomData; + +typedef struct { + int64_t timestamp; //时间戳 + int32_t status; //算法返回值:正在加载地图,加载地图错误,正在重定位,重定位错误,初始化错误,参数异常,图像异常,识别异常等 + float x, y, theta; + int32_t extents[8192]; //自定义内容,扩展信息 +}LxLocation; + + + +#endif diff --git a/src/lxCamera/lx_camera_define.h b/src/lxCamera/lx_camera_define.h new file mode 100644 index 0000000..6ed7cbb --- /dev/null +++ b/src/lxCamera/lx_camera_define.h @@ -0,0 +1,377 @@ +#ifndef _LX_CAMERA_DEFINE_H_ +#define _LX_CAMERA_DEFINE_H_ + +#ifdef WIN32 + #ifndef _WIN32 + #define _WIN32 + #endif +#endif + +#ifndef LX_EXPORT + #ifdef _WIN32 + #ifdef LX_DC_EXPORTS + #define LX_EXPORT __declspec(dllexport) + #else + #define LX_EXPORT __declspec(dllimport) + #endif + + #define LX_STDC __stdcall + + #else + #define LX_EXPORT + + #if defined(__i386__) + #define LX_STDC __attribute__((stdcall)) + #else + #define LX_STDC + #endif + #endif +#endif + +#ifndef LX_EXTC + #if defined(__cplusplus) + #define LX_EXTC extern "C" + #else + #define LX_EXTC + #endif +#endif + +typedef enum LX_STATE +{ + LX_SUCCESS = 0, //成功 + LX_ERROR = -1, //未知错误 + LX_E_NOT_SUPPORT = -2, //功能不支持 + LX_E_NETWORK_ERROR = -3, //网络通讯错误 + LX_E_INPUT_ILLEGAL = -4, //入参非法 + LX_E_RECONNECTING = -5, //设备重连中 + LX_E_DEVICE_ERROR = -6, //设备故障 + LX_E_DEVICE_NEED_UPDATE = -7, //设备版本过低,需升级 + LX_E_API_NEED_UPDATE = -8, //API版本过低 + LX_E_CTRL_PERMISS_ERROR = -9, //独占控制权限失败 + LX_E_GET_DEVICEINFO_ERROR = -10,//获取设备信息失败 + LX_E_IMAGE_SIZE_ERROR = -11, //图像尺寸不匹配,需重新打开 + LX_E_IMAGE_PARTITION_ERROR = -12, //图像解析失败(pixformat不正确),需尝试重新打开 + LX_E_DEVICE_NOT_CONNECTED = -13, //相机未连接 + LX_E_DEVICE_INIT_FAILED = -14, //相机初始化失败 + LX_E_DEVICE_NOT_FOUND = -15, //未找到相机(或未找到匹配的相机) + LX_E_FILE_INVALID = -16, //文件错误(文件名或类型或格式不正确或文件打开失败) + LX_E_CRC_CHECK_FAILED = -17, //文件crc或md5校验失败 + LX_E_TIME_OUT = -18, //超时 + LX_E_FRAME_LOSS = -19, //漏帧 + LX_E_ENABLE_ANYSTREAM_FAILED = -20, //开启任意流失败 + LX_E_NOT_RECEIVE_STREAM = -21, //未收到流数据 + LX_E_PARSE_STREAM_FAILED = -22, //启流成功但解析流数据失败 + LX_E_PROCESS_IMAGE_FAILED = -23, //图像计算处理失败 + LX_E_SETTING_NOT_ALLOWED = -24, //常开模式下不允许设置 + LX_E_LOAD_DATAPROCESSLIB_ERROR = -25, //加载图像处理算法库错误 + LX_E_FUNCTION_CALL_LOGIC_ERROR = -26, //函数调用逻辑错误 + LX_E_IPAPPDR_UNREACHABLE_ERROR = -27, //IP不可达或网络配置错误 +}LX_STATE; + +#define LX_API LX_EXTC LX_EXPORT LX_STATE LX_STDC +#define LX_API_STR LX_EXTC LX_EXPORT const char* LX_STDC + +typedef unsigned long long DcHandle; + +typedef enum LX_DEVICE_TYPE { + LX_DEVICE_M2 = 1001, + LX_DEVICE_M3, + LX_DEVICE_M4Pro, + LX_DEVICE_M4_MEGA, + LX_DEVICE_M4, + LX_DEVICE_S1 = 2001, + LX_DEVICE_S2, + LX_DEVICE_I1 = 3001, + LX_DEVICE_I2, + LX_DEVICE_T1 = 4001, + LX_DEVICE_T2, + LX_DEVICE_WK = 5001, + LX_DEVICE_V1Pro = 6001, + + LX_DEVICE_NULL = 0 +}LX_DEVICE_TYPE; + +typedef struct LxDeviceInfo +{ + DcHandle handle; //设备唯一标识 + LX_DEVICE_TYPE dev_type; //设备类型 + char id[32]; //设备id + char ip[32]; //设备ip:port + char sn[32]; //设备序列号 + char mac[32]; //设备mac地址 + char firmware_ver[32]; //设备软件版本号 + char algor_ver[32]; //设备算法版本号 + char name[32]; //设备名称,如:camera_M3_192.168.11.13_9803 + char reserve[32]; //预留字段, 子网掩码 //add at 20231120 + char reserve2[32]; //预留字段2, 网关ip //add at 20231120 + char reserve3[64]; //预留字段3 + char reserve4[128]; //预留字段4 +}LxDeviceInfo; + +typedef struct LxIntValueInfo +{ + bool set_available; //当前值是否可设置, true-可设置,false-不可设置 + int cur_value; //当前值 + int max_value; //最大值 + int min_value; //最小值 + int reserve[4]; //预留字段 +}LxIntValueInfo; + +typedef struct LxFloatValueInfo +{ + bool set_available; //当前值是否可设置, true-可设置,false-不可设置 + float cur_value; //当前值 + float max_value; //最大值 + float min_value; //最小值 + float reserve[4]; //预留字段 +}LxFloatValueInfo; + +typedef enum LX_OPEN_MODE +{ + OPEN_BY_INDEX = 0, //按搜索列表中索引下标方式打开,对应的参数为索引号,当搜索到的设备列表发生变化时,选择打开的设备也会不一样 + OPEN_BY_IP = 1, //按搜索列表中对应ip方式打开,对应的参数为设备ip或ip:port + OPEN_BY_SN = 2, //按搜索列表中对应sn方式打开,对应的参数为设备sn + OPEN_BY_ID = 3, //按搜索列表中对应id方式打开,对应的参数为设备id +}LX_OPEN_MODE; + +//数据格式。3D强度图和深度图有不同的数据格式,获取数据指针需要使用对应的feature +typedef enum LX_DATA_TYPE +{ + LX_DATA_UNSIGNED_CHAR = 0, + LX_DATA_UNSIGNED_SHORT = 2, + LX_DATA_FLOAT = 5, + LX_DATA_OBSTACLE = 16, + LX_DATA_PALLET = 17, + LX_DATA_LOCATION =18, +}LX_DATA_TYPE; + +//2D数据流支持不同的压缩格式 +typedef enum LX_STREAM_ENCODE_MODE +{ + LX_STREAM_RAW = 0, + LX_STREAM_H264 = 1, + LX_STREAM_H265 = 2, + LX_STREAM_MJPEG = 3, + LX_STREAM_JPEG = 4, + +}LX_STREAM_ENCODE_MODE; + +typedef enum LX_BINNING_MODE +{ + LX_BINNING_1X1 = 0, + LX_BINNING_2X2 = 1, + LX_BINNING_4X4 = 2 +}LX_BINNING_MODE; + +typedef enum LX_STRUCT_LIGHT_CODE_MODE +{ + LX_CODE_NORMAL = 1,//常规 + LX_CODE_STATBLE = 2,//稳定 + LX_CODE_ENHANCE = 3, //高精度加强 +}LX_STRUCT_LIGHT_CODE_MODE; + +typedef enum LX_GET_AMPLITUDE_MODE +{ + FLASH = 1, //采用投影时的图像 + MANUAL_EXPOSURE = 2, //采集环境光图像,需设置固定的曝光时间 + AUTO_EXPOSURE = 3, //采集环境光图像,自动曝光,可设置目标亮度 +}LX_GET_AMPLITUDE_MODE; + + +//闪光灯开启模式,部分型号支持 +typedef enum LX_STROBE_MODE +{ + STROBE_MODE_IN_CLOSE_OUT_CLOSE = 0, //关闭内外部补光灯 + STROBE_MODE_IN_FLASH_OUT_CLOSE = 1, //开启内部补光灯闪亮,关闭外部补光灯 + STROBE_MODE_IN_OPEN_OUT_CLOSE = 2, //开启内部补光灯常亮,关闭外部补光灯 + STROBE_MODE_IN_CLOSE_OUT_FLASH = 3, //关闭内部补光灯,开启外部补光灯闪亮 + STROBE_MODE_IN_CLOSE_OUT_OPEN = 4, //关闭内部补光灯,开启外部补光灯常亮 + STROBE_MODE_IN_FLASH_OUT_FLASH = 5, //同时开启内外部补光灯闪亮 + STROBE_MODE_IN_FLASH_OUT_OPEN = 6, //开启内部补光灯闪亮,开启外部补光灯常亮 + STROBE_MODE_IN_OPEN_OUT_FLASH = 7, //开启内部补光灯常亮,开启外部补光灯闪亮 + STROBE_MODE_IN_OPEN_OUT_OPEN = 8, //同时开启内外部补光灯常亮 +}LX_STROBE_MODE; + +typedef enum LX_ALGORITHM_MODE +{ + MODE_ALL_OFF = 0, //关闭内置避障算法 + MODE_AVOID_OBSTACLE = 1, //内置避障算法 + MODE_PALLET_LOCATE = 2, //内置托盘对接算法 + MODE_VISION_LOCATION = 3, //内置视觉定位算法 +}LX_ALGORITHM_MODE; + +typedef enum LX_CAMERA_WORK_MODE +{ + MODE_ONLY_GIGE = 0, //正常模式,按需采图,默认为该状态 + MODE_COLLECT_FOREVER = 1, //始终采图 +}LX_CAMERA_WORK_MODE; + + +typedef enum LX_TRIGGER_MODE +{ + LX_TRIGGER_MODE_OFF, //关闭触发模式,流模式,默认 + LX_TRIGGER_SOFTWARE, //软触发模式 + LX_TRIGGER_HARDWARE, //硬触发模式 +}LX_TRIGGER_MODE; + +//图像显示相关信息 +typedef struct FrameDataInfo +{ + LX_DATA_TYPE frame_data_type; + int frame_width; + int frame_height; + int frame_channel; + void* frame_data; + unsigned long long sensor_timestamp; //sensor出图时间戳 + unsigned long long recv_timestamp; //接收完帧数据时的时间戳 +}FrameDataInfo; + + +//数据帧具体信息 +typedef struct FrameInfo { + LX_STATE frame_state; + DcHandle handle; + + FrameDataInfo depth_data; //深度图 + FrameDataInfo amp_data; //强度图 + FrameDataInfo rgb_data; //rgb图 + FrameDataInfo app_data; //算法输出结果 + void* reserve_data; //扩展预留字段 +}FrameInfo; + +typedef enum LX_CAMERA_STATUS +{ + STATUS_CLOSED, //相机未打开或关闭状态 + STATUS_OPENED_UNSTARTED, //相机已打开但未启流状态 + STATUS_STARTED, //相机打开且已启流状态 + STATUS_CONNECTING, //相机断线正在重连状态 + STATUS_CONNECT_SUCCESS //相机重连成功 +}LX_CAMERA_STATUS; + +//相机状态回调信息 +typedef struct CameraStatus { + LX_CAMERA_STATUS camera_state; + unsigned long long status_time; + void* reserve_data; //扩展预留字段 +}CameraStatus; + +//数据帧回调 +typedef void(*LX_FRAME_CALLBACK)(FrameInfo*, void*); + +//相机状态回调 +typedef void(*LX_CAMERA_STATUS_CALLBACK)(CameraStatus*, void*); + +typedef enum LX_CAMERA_FEATURE +{ + /*int feature*/ + LX_INT_FIRST_EXPOSURE = 1001, //默认高积分曝光值,单位us, 针对多积分情况为第一个积分的曝光时间 + LX_INT_SECOND_EXPOSURE = 1002, //默认低积分曝光值,单位us, 针对多积分情况为第二个积分的曝光时间 + LX_INT_THIRD_EXPOSURE = 1003, //默认中积分曝光值,单位us, 针对多积分情况为第三个积分的曝光时间 + LX_INT_FOURTH_EXPOSURE = 1004, //针对多积分情况为第四个积分的曝光时间 + LX_INT_GAIN = 1005, //增益,与曝光效果等价。会引入噪声,可适当调节增益防止曝光参数过大 + + LX_INT_MIN_DEPTH = 1011, //最小深度值 + LX_INT_MAX_DEPTH = 1012, //最大深度值 + LX_INT_MIN_AMPLITUDE = 1013, //有效信号最小强度值 + LX_INT_MAX_AMPLITUDE = 1014, //有效信号最大强度值 + LX_INT_CODE_MODE = 1016, //结构光相机编码模式,参考LX_STRUCT_LIGHT_CODE_MODE + LX_INT_WORK_MODE = 1018, //工作模式,0-按需采图,默认为该状态 1-始终采图 + LX_INT_LINK_SPEED = 1019, //协商的网卡网速 100-百兆,1000-千兆, 只支持获取,不可设置 + + //3D图像参数 + LX_INT_3D_IMAGE_WIDTH = 1021, //3D图像分辨率宽度,(ROI/Binning/2D对齐后会变化,需重新获取) + LX_INT_3D_IMAGE_HEIGHT = 1022, //3D图像分辨率高度,(ROI/Binning/2D对齐后会变化,需重新获取) + LX_INT_3D_IMAGE_OFFSET_X = 1023, //ROI水平偏移像素,ROI设置中WIDTH HEIGHT OFFSET_X OFFSET_Y一起设置, 设置参数请用DcSetROI + LX_INT_3D_IMAGE_OFFSET_Y = 1024, //ROI垂直偏移像素,ROI设置中WIDTH HEIGHT OFFSET_X OFFSET_Y一起设置, 设置参数请用DcSetROI + LX_INT_3D_BINNING_MODE = 1025, //3D图像binning,参考LX_BINNING_MODE + LX_INT_3D_DEPTH_DATA_TYPE = 1026, //深度图像数据格式,只能获取,对应的值参考LX_DATA_TYPE + + //3D强度图像,尺寸与3D深度图一致 + LX_INT_3D_AMPLITUDE_CHANNEL = 1031, //3D强度图像通道数,单色为1,彩色为3 + LX_INT_3D_AMPLITUDE_GET_TYPE = 1032, //获取强度图像的方式,参考LX_GET_AMPLITUDE_MODE(部分型号支持) + LX_INT_3D_AMPLITUDE_EXPOSURE = 1033, //LX_INT_3D_AMPLITUDE_GET_TYPE为MANUAL_EXPOSURE时的曝光值 + LX_INT_3D_AMPLITUDE_INTENSITY = 1034,//LX_INT_3D_AMPLITUDE_GET_TYPE为AUTO_EXPOSURE时的目标亮度 + LX_INT_3D_AMPLITUDE_DATA_TYPE = 1035,//强度图像数据格式,只能获取,对应的值参考LX_DATA_TYPE + LX_INT_3D_AUTO_EXPOSURE_LEVEL = 1036,//3D自动曝光开启时的曝光等级,期间不允许设置曝光值与增益 + + //2D图像 + LX_INT_2D_IMAGE_WIDTH = 1041, //2D图像分辨率宽度,(ROI或Binning后会变化) + LX_INT_2D_IMAGE_HEIGHT = 1042, //2D图像分辨率高度,(ROI或Binning后会变化) + LX_INT_2D_IMAGE_OFFSET_X = 1043, //2D图像ROI水平偏移像素,ROI设置中WIDTH HEIGHT OFFSET_X OFFSET_Y一起设置, 设置参数请用DcSetROI + LX_INT_2D_IMAGE_OFFSET_Y = 1044, //2D图像ROI垂直偏移像素,ROI设置中WIDTH HEIGHT OFFSET_X OFFSET_Y一起设置, 设置参数请用DcSetROI + LX_INT_2D_BINNING_MODE = 1045, //2D图像binning,参考LX_BINNING_MODE + LX_INT_2D_IMAGE_CHANNEL = 1046, //2D图像通道数,单色为1,彩色为3 + LX_INT_2D_IMAGE_DATA_TYPE = 1047, //2D图像数据格式,只能获取,对应的值参考LX_DATA_TYPE + + LX_INT_2D_MANUAL_EXPOSURE = 1051, //2D手动曝光时的曝光值 + LX_INT_2D_MANUAL_GAIN = 1052, //2D手动曝光时的增益值 + LX_INT_2D_ENCODE_TYPE = 1053, //2D图像压缩格式,对应的值参考LX_STREAM_ENCODE_MODE + LX_INT_2D_AUTO_EXPOSURE_LEVEL = 1054,//2D图像自动曝光时曝光等级[0-100], 0-整体更暗, 100-整体更亮 + + LX_INT_TOF_GLOBAL_OFFSET = 1061, //TOF深度数据偏移 + LX_INT_3D_UNDISTORT_SCALE = 1062, //TOF图像反畸变系数 + LX_INT_STROBE_EXPOSURE = 1063, //闪光灯曝光时间,部分型号支持 + LX_INT_STROBE_MODE = 1064, //闪光灯开启模式,部分型号支持,对应的值参考LX_STROBE_MODE + LX_INT_ALGORITHM_MODE = 1065, //内置算法开启模式, 部分型号支持,对应的值参考LX_ALGORITHM_MODE + LX_INT_MODBUS_ADDR = 1066, //modbus地址,部分型号支持MODBUS协议通过串口输出 + LX_INT_HEART_TIME = 1067, //与设备间心跳时间,单位ms + LX_INT_GVSP_PACKET_SIZE = 1068, //GVSP单包数据分包大小, 单位字节 + LX_INT_TRIGGER_MODE = 1069, //触发模式,对应的值参考LX_TRIGGER_MODE + + /*float feature*/ + LX_FLOAT_FILTER_LEVEL = 2001, //滤波等级,[0, 1],值越大,滤波越强,等于0表示关闭滤波,//更详细滤波配置参考LX_STRING_FILTER_PARAMS + LX_FLOAT_EST_OUT_EXPOSURE = 2002, //是否评估过曝数据,[0, 1],为1则过曝数据无效 + LX_FLOAT_LIGHT_INTENSITY = 2003, //光强度,[0, 1],部分型号支持 + LX_FLOAT_3D_DEPTH_FPS = 2004, //深度图当前帧率,只可获取 + LX_FLOAT_3D_AMPLITUDE_FPS = 2005, //强度图当前帧率,只可获取 + LX_FLOAT_2D_IMAGE_FPS = 2006, //RGB图当前帧率,只可获取 + LX_FLOAT_DEVICE_TEMPERATURE = 2007,//相机当前温度, 只可获取 + + /*bool feature*/ + LX_BOOL_CONNECT_STATE = 3001, //当前连接状态 + LX_BOOL_ENABLE_3D_DEPTH_STREAM = 3002, //开启/关闭深度数据流(部分相机支持) + LX_BOOL_ENABLE_3D_AMP_STREAM = 3003, //开启/关闭强度数据流(部分相机支持) + LX_BOOL_ENABLE_3D_AUTO_EXPOSURE = 3006, //3D自动曝光使能 + LX_BOOL_ENABLE_3D_UNDISTORT = 3007, //3D反畸变使能 + LX_BOOL_ENABLE_ANTI_FLICKER = 3008, //抗频闪使能,LED环境照明可能导致数据存在明显波纹,部分型号支持 + + LX_BOOL_ENABLE_2D_STREAM = 3011, //开启/关闭2D数据流 + LX_BOOL_ENABLE_2D_AUTO_EXPOSURE = 3012, //2D自动曝光使能 + LX_BOOL_ENABLE_2D_UNDISTORT = 3015, //2D图像反畸变使能 + LX_BOOL_ENABLE_2D_TO_DEPTH = 3016, //2D3D图像对齐使能,3D图像分辨率会改变 + LX_BOOL_ENABLE_BACKGROUND_AMP = 3017, //强度背景光使能 + LX_BOOL_ENABLE_MULTI_MACHINE = 3018, //多机模式使能 + + /*string feature*/ + LX_STRING_DEVICE_VERSION = 4001, //设备版本号 + LX_STRING_DEVICE_LOG_NAME = 4002, //日志文件名,用于获取设备日志 + LX_STRING_FIRMWARE_NAME = 4003, //固件文件名,用于升级设备版本,部分型号需要重新打开相机 + LX_STRING_FILTER_PARAMS = 4004, //滤波算法参数,json格式的字符串,//关闭滤波或配置简单的滤波参考LX_FLOAT_FILTER_LEVEL + LX_STRING_ALGORITHM_PARAMS = 4005, //内置算法参数,不同的开启模式,对应不同的json格式字符串,前提需要设置过LX_ALGORITHM_MODE + LX_STRING_ALGORITHM_VERSION = 4006, //内置算法版本号,不同的开启模式,返回对应的版本号,只能获取,前提需要设置过LX_ALGORITHM_MODE + LX_STRING_DEVICE_OS_VERSION = 4007, //设备系统镜像版本号 + + + /*command feature*/ + LX_CMD_GET_NEW_FRAME = 5001, //更新当前最新数据,调用之后才可以获取相关数据指针 + LX_CMD_RETURN_VERSION = 5002, //回退上一版本 + LX_CMD_RESTART_DEVICE = 5003, //重启相机,部分型号需要重新打开相机 + LX_CMD_WHITE_BALANCE = 5004, //自动白平衡 + LX_CMD_RESET_PARAM = 5007, //恢复默认参数 + + /*ptr feature*/ + LX_PTR_2D_IMAGE_DATA = 6001, //获取2D图像数据指针,数据长度由2D图像尺寸、通道数和数据格式(LX_INT_2D_IMAGE_DATA_TYPE)确定 + LX_PTR_3D_AMP_DATA = 6002, //获取3D强度图数据指针,数据长度由3D图像尺寸、通道数和数据格式(LX_INT_3D_AMPLITUDE_DATA_TYPE)确定 + LX_PTR_3D_DEPTH_DATA = 6003, //获取3D深度图数据指针,数据长度由3D图像尺寸、通道数和数据格式(LX_INT_3D_DEPTH_DATA_TYPE)确定 + LX_PTR_XYZ_DATA = 6004, //获取点云数据指针,float*类型三通道(x, y, z为一组数据,依次循环) + //数据长度为LX_INT_3D_IMAGE_WIDTH*LX_INT_3D_IMAGE_HEIGHT*sizeof(float)*3 + LX_PTR_2D_INTRIC_PARAM = 6005, //获取2D图像内参,float*类型指针,长度固定为9*sizeof(float)(fx,fy,cx,cy,k1,k2,p1,p2,k3) + LX_PTR_3D_INTRIC_PARAM = 6006, //获取3D图像内参, float*类型指针,长度固定为9*sizeof(float)(fx,fy,cx,cy,k1,k2,p1,p2,k3) + LX_PTR_3D_EXTRIC_PARAM = 6007, //获取3D图像外参,float*类型指针 ,长度固定为12*sizeof(float)(前9个表示旋转矩阵,后3个表示平移向量) + LX_PTR_ALGORITHM_OUTPUT = 6008, //获取内置算法输出 + //当开启模式为MODE_AVOID_OBSTACLE,输出结果为LxAvoidanceOutput指针,参考struct LxAvoidanceOutput, + //当开启模式为MODE_PALLET_LOCATE,输出结果为LxPalletPose指针,参考struct LxPalletPose + LX_PTR_FRAME_DATA = 6009, //获取完整一帧数据,输出结果参考结构体FrameInfo +}LX_CAMERA_FEATURE; + +#endif diff --git a/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_CameraControl.cpp b/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_CameraControl.cpp index 4796206..98f34eb 100644 --- a/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_CameraControl.cpp +++ b/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_CameraControl.cpp @@ -39,13 +39,13 @@ QT_MOC_LITERAL(3, 31, 18), // "QVector" QT_MOC_LITERAL(4, 50, 12), // "vecImageInfo" QT_MOC_LITERAL(5, 63, 14), // "cameraLocation" QT_MOC_LITERAL(6, 78, 9), // "onCapture" -QT_MOC_LITERAL(7, 88, 8), // "cameraID" +QT_MOC_LITERAL(7, 88, 8), // "location" QT_MOC_LITERAL(8, 97, 6) // "onOpen" }, "CameraControl\0sgCapturedImage\0\0" "QVector\0vecImageInfo\0" - "cameraLocation\0onCapture\0cameraID\0" + "cameraLocation\0onCapture\0location\0" "onOpen" }; #undef QT_MOC_LITERAL diff --git a/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_LXCamera.cpp b/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_LXCamera.cpp new file mode 100644 index 0000000..767bbed --- /dev/null +++ b/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_LXCamera.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'LXCamera.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.9.4) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../../../../src/LXCamera.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'LXCamera.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.9.4. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_LXCamera_t { + QByteArrayData data[1]; + char stringdata0[9]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_LXCamera_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_LXCamera_t qt_meta_stringdata_LXCamera = { + { +QT_MOC_LITERAL(0, 0, 8) // "LXCamera" + + }, + "LXCamera" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_LXCamera[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 0, 0, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + 0 // eod +}; + +void LXCamera::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + Q_UNUSED(_o); + Q_UNUSED(_id); + Q_UNUSED(_c); + Q_UNUSED(_a); +} + +const QMetaObject LXCamera::staticMetaObject = { + { &Camera::staticMetaObject, qt_meta_stringdata_LXCamera.data, + qt_meta_data_LXCamera, qt_static_metacall, nullptr, nullptr} +}; + + +const QMetaObject *LXCamera::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *LXCamera::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_LXCamera.stringdata0)) + return static_cast(this); + return Camera::qt_metacast(_clname); +} + +int LXCamera::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = Camera::qt_metacall(_c, _id, _a); + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_TofCamera.cpp b/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_TofCamera.cpp new file mode 100644 index 0000000..344bde4 --- /dev/null +++ b/tpvs17/SmokeBoxIdentification/GeneratedFiles/Release/moc_TofCamera.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'TofCamera.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.9.4) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../../../../src/TofCamera.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'TofCamera.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.9.4. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_TofCamera_t { + QByteArrayData data[1]; + char stringdata0[10]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_TofCamera_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_TofCamera_t qt_meta_stringdata_TofCamera = { + { +QT_MOC_LITERAL(0, 0, 9) // "TofCamera" + + }, + "TofCamera" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_TofCamera[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 0, 0, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + 0 // eod +}; + +void TofCamera::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + Q_UNUSED(_o); + Q_UNUSED(_id); + Q_UNUSED(_c); + Q_UNUSED(_a); +} + +const QMetaObject TofCamera::staticMetaObject = { + { &QObject::staticMetaObject, qt_meta_stringdata_TofCamera.data, + qt_meta_data_TofCamera, qt_static_metacall, nullptr, nullptr} +}; + + +const QMetaObject *TofCamera::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *TofCamera::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_TofCamera.stringdata0)) + return static_cast(this); + return QObject::qt_metacast(_clname); +} + +int TofCamera::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QObject::qt_metacall(_c, _id, _a); + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj index bb5efe0..ccff8ae 100644 --- a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj +++ b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj @@ -67,7 +67,7 @@ $(OutDir)smokeBoxd.exe $(QTDIR)\lib;$(MVCAM_COMMON_RUNENV)\Libraries\win64;$(SolutionDir)..\3rdparty\lib;$(SolutionDir)$(Platform)\$(Configuration)\;$(SolutionDir)..\3rdparty\opencv\lib;%(AdditionalLibraryDirectories) true - qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Networkd.lib;Qt5QuickWidgetsd.lib;Qt5SerialPortd.lib;Qt5WebSocketsd.lib;Qt5Widgetsd.lib;Qt5Xlsxd.lib;opencv_world341d.lib;MvCameraControl.lib;numStatisticAlgod.lib;lpSeriald.lib;libzkqd.lib;%(AdditionalDependencies) + qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Networkd.lib;Qt5QuickWidgetsd.lib;Qt5SerialPortd.lib;Qt5WebSocketsd.lib;Qt5Widgetsd.lib;Qt5Xlsxd.lib;opencv_world341d.lib;MvCameraControl.lib;numStatisticAlgod.lib;lpSeriald.lib;libzkqd.lib;LxCameraApi.lib;%(AdditionalDependencies) .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -97,7 +97,7 @@ $(OutDir)smokeBox.exe $(QTDIR)\lib;$(MVCAM_COMMON_RUNENV)\Libraries\win64;$(SolutionDir)..\3rdparty\lib;$(SolutionDir)$(Platform)\$(Configuration)\;$(SolutionDir)..\3rdparty\opencv\lib;$(SolutionDir)..\3rdparty\qxlsx\lib;$(SolutionDir)..\tpvs17\x64\Release;%(AdditionalLibraryDirectories) false - qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Network.lib;Qt5QuickWidgets.lib;Qt5SerialPort.lib;Qt5WebSockets.lib;Qt5Widgets.lib;Qt5Xlsx.lib;opencv_world341.lib;MvCameraControl.lib;numStatisticAlgo.lib;lpSerial.lib;libzkq.lib;%(AdditionalDependencies) + qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Network.lib;Qt5QuickWidgets.lib;Qt5SerialPort.lib;Qt5WebSockets.lib;Qt5Widgets.lib;Qt5Xlsx.lib;opencv_world341.lib;MvCameraControl.lib;numStatisticAlgo.lib;lpSerial.lib;libzkq.lib;LxCameraApi.lib;%(AdditionalDependencies) .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -129,10 +129,12 @@ + + @@ -147,6 +149,10 @@ + + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx @@ -158,6 +164,13 @@ + + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx + .\GeneratedFiles;.;.\..\..\src;.\..\..\src\libzkq;.\..\..\src\lpSerial;.\..\..\src\lpSerial\include;.\..\..\src\numStatisticAlgo;.\..\..\src\MVCameraDriver;.\..\..\src\common;.\..\..\src\lpv;.\..\..\3rdparty\opencv\include;.\..\..\3rdparty\opencv\include\opencv;.\..\..\3rdparty\opencv\include\opencv2;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtNetwork;$(QTDIR)\include\QtSerialPort;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtWinExtras;$(QTDIR)\include\QtXlsx + + + + diff --git a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.filters b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.filters index 2948583..3a4c2ae 100644 --- a/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.filters +++ b/tpvs17/SmokeBoxIdentification/SmokeBoxIdentification.vcxproj.filters @@ -40,6 +40,9 @@ {fc09094f-8b70-4ea8-a059-83a93bf5ec55} + + {71ef3486-4cd9-42b1-818a-a8ce9294861e} + @@ -88,6 +91,12 @@ Source Files + + Source Files + + + Source Files + @@ -120,6 +129,12 @@ Header Files + + Header Files + + + Header Files + @@ -167,5 +182,14 @@ Header Files\common + + Header Files\lxCamera + + + Header Files\lxCamera + + + Header Files\lxCamera + \ No newline at end of file