#include "IrisCameraController.h" static qint8 IRIS_CAMERA_SWITCHER = 0; // 用于切换左右两个相机工作的奇偶变量 IrisCameraController::IrisCameraController(QObject *parent) : QObject(parent) { this->leftHandler = new IrisCameraCapEventHandler(this); this->rightHandler = new IrisCameraCapEventHandler(this); } IrisCameraController::~IrisCameraController() { this->closeIrisCamera(); } void IrisCameraController::initIrisCamera() { IGXFactory::GetInstance().Init(); //枚举设备 IGXFactory::GetInstance().UpdateDeviceList(1000, irisCamList); this->OpenDevice(); } void IrisCameraController::openIrisCamera() { //设置Buffer处理模式 leftStreamFeaturePtr->GetEnumFeature("StreamBufferHandlingMode")->SetValue("OldestFirst"); rightStreamFeaturePtr->GetEnumFeature("StreamBufferHandlingMode")->SetValue("OldestFirst"); //注册回调函数 leftStreamPtr->RegisterCaptureCallback(leftHandler, &leftCamPtr); rightStreamPtr->RegisterCaptureCallback(rightHandler, &rightCamPtr); //开启流层通道 leftStreamPtr->StartGrab(); rightStreamPtr->StartGrab(); //发送开采命令 leftFeaturePtr->GetCommandFeature("AcquisitionStart")->Execute(); rightFeaturePtr->GetCommandFeature("AcquisitionStart")->Execute(); // 启动定时器 TimeCounterUtil::getInstance().irisCapCounter->start(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); // 50ms执行一次定时器 } void IrisCameraController::closeIrisCamera() { } void IrisCameraController::startCapture() { // 获取定时器, 绑定定时函数 connect(TimeCounterUtil::getInstance().irisCapCounter, &QTimer::timeout, this, &IrisCameraController::getOneFaceFrm); // LOG(DEBUG) << QString("[IrisCameraController][startCapture]虹膜相机拍图").toStdString(); } void IrisCameraController::stopCapture() { // 获取定时器, 绑定定时函数 disconnect(TimeCounterUtil::getInstance().irisCapCounter, &QTimer::timeout, this, &IrisCameraController::getOneFaceFrm); // LOG(DEBUG) << QString("[IrisCameraController][stopCapture]虹膜相机停止拍图").toStdString(); } void IrisCameraController::getOneFaceFrm() { // 发送软触发命令(在触发模式开启时有效) if (IRIS_CAMERA_SWITCHER % 2 == 0) { leftFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute(); } else { rightFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute(); } IRIS_CAMERA_SWITCHER++; } void IrisCameraController::getLeftAndRightEyeFrame() { leftFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute(); QThread::msleep(100); rightFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute(); } void IrisCameraController::OpenDevice() { for(size_t i = 0; i < this->irisCamList.size(); i++) { auto device = irisCamList.at(i); size_t leftKeyIndex = device.GetUserID().find("left"); size_t rightKeyIndex = device.GetUserID().find("right"); if (leftKeyIndex >= 0 && leftKeyIndex < 32) { leftCamPtr = IGXFactory::GetInstance().OpenDeviceByUserID(device.GetUserID(), GX_ACCESS_EXCLUSIVE); leftFeaturePtr = leftCamPtr->GetRemoteFeatureControl(); // 判断设备流是否大于零, 如果大于零则打开流 int nStreamCount = leftCamPtr->GetStreamCount(); if (nStreamCount > 0) { leftStreamPtr = leftCamPtr->OpenStream(0); leftStreamFeaturePtr = leftStreamPtr->GetFeatureControl(); } // 建议用户在打开网络相机之后, 根据当前网络环境设置相机的流通道包长值, // 以提高网络相机的采集性能, 设置方法参考以下代码。 GX_DEVICE_CLASS_LIST objDeviceClass = leftCamPtr->GetDeviceInfo().GetDeviceClass(); if(GX_DEVICE_CLASS_GEV == objDeviceClass) { // 判断设备是否支持流通道数据包功能 if(true == leftFeaturePtr->IsImplemented("GevSCPSPacketSize")) { // 获取当前网络环境的最优包长值 int nPacketSize = leftStreamPtr->GetOptimalPacketSize(); // 将最优包长值设置为当前设备的流通道包长值 leftFeaturePtr->GetIntFeature("GevSCPSPacketSize")->SetValue(nPacketSize); } } //设置采集模式为连续采集模式 leftFeaturePtr->GetEnumFeature("AcquisitionMode")->SetValue("Continuous"); //设置触发模式关 leftFeaturePtr->GetEnumFeature("TriggerMode")->SetValue("On"); leftFeaturePtr->GetEnumFeature("TriggerSource")->SetValue("Software"); } else if (rightKeyIndex >= 0 && rightKeyIndex < 32) { rightCamPtr = IGXFactory::GetInstance().OpenDeviceByUserID(device.GetUserID(), GX_ACCESS_EXCLUSIVE); rightFeaturePtr = rightCamPtr->GetRemoteFeatureControl(); //判断设备流是否大于零, 如果大于零则打开流 int nStreamCount = rightCamPtr->GetStreamCount(); if (nStreamCount > 0) { rightStreamPtr = rightCamPtr->OpenStream(0); rightStreamFeaturePtr = rightStreamPtr->GetFeatureControl(); } // 建议用户在打开网络相机之后, 根据当前网络环境设置相机的流通道包长值, // 以提高网络相机的采集性能, 设置方法参考以下代码。 GX_DEVICE_CLASS_LIST objDeviceClass = rightCamPtr->GetDeviceInfo().GetDeviceClass(); if(GX_DEVICE_CLASS_GEV == objDeviceClass) { // 判断设备是否支持流通道数据包功能 if(true == rightFeaturePtr->IsImplemented("GevSCPSPacketSize")) { // 获取当前网络环境的最优包长值 int nPacketSize = rightStreamPtr->GetOptimalPacketSize(); // 将最优包长值设置为当前设备的流通道包长值 rightFeaturePtr->GetIntFeature("GevSCPSPacketSize")->SetValue(nPacketSize); } } //设置采集模式为连续采集模式 rightFeaturePtr->GetEnumFeature("AcquisitionMode")->SetValue("Continuous"); //设置触发模式关 rightFeaturePtr->GetEnumFeature("TriggerMode")->SetValue("On"); rightFeaturePtr->GetEnumFeature("TriggerSource")->SetValue("Software"); } } }