#include "IrisCameraController.h" IrisCameraController::IrisCameraController(QObject *parent) : QObject(parent) { this->irisCamHandler = new IrisCameraCapEventHandler(this); } IrisCameraController::~IrisCameraController() { this->closeIrisCamera(); } void IrisCameraController::initIrisCamera() { IGXFactory::GetInstance().Init(); //枚举设备 IGXFactory::GetInstance().UpdateDeviceList(1000, irisCamList); this->OpenDevice(); } void IrisCameraController::openIrisCamera() { //设置Buffer处理模式 irisStreamFeaturePtr->GetEnumFeature("StreamBufferHandlingMode")->SetValue("OldestFirst"); //注册回调函数 irisStreamPtr->RegisterCaptureCallback(irisCamHandler, &irisCamPtr); //开启流层通道 irisStreamPtr->StartGrab(); //发送开采命令 irisFeaturePtr->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(); // LOG_DEBUG(QString("[IrisCameraController][startCapture]虹膜相机拍图").toStdString()); } void IrisCameraController::stopCapture() { // 获取定时器, 绑定定时函数 disconnect(TimeCounterUtil::getInstance().irisCapCounter, &QTimer::timeout, this, &IrisCameraController::getOneFaceFrm); // LOG(DEBUG) << QString("[IrisCameraController][stopCapture]虹膜相机停止拍图").toStdString(); // LOG_DEBUG(QString("[IrisCameraController][stopCapture]虹膜相机停止拍图").toStdString()); } void IrisCameraController::getOneFaceFrm() { // 发送软触发命令(在触发模式开启时有效) irisFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute(); } void IrisCameraController::getLeftAndRightEyeFrame() { irisFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute(); } void IrisCameraController::OpenDevice() { auto device = irisCamList.at(0); irisCamPtr = IGXFactory::GetInstance().OpenDeviceByUserID(device.GetUserID(), GX_ACCESS_EXCLUSIVE); irisFeaturePtr = irisCamPtr->GetRemoteFeatureControl(); // 判断设备流是否大于零, 如果大于零则打开流 int nStreamCount = irisCamPtr->GetStreamCount(); if (nStreamCount > 0) { irisStreamPtr = irisCamPtr->OpenStream(0); irisStreamFeaturePtr = irisStreamPtr->GetFeatureControl(); } // 建议用户在打开网络相机之后, 根据当前网络环境设置相机的流通道包长值, // 以提高网络相机的采集性能, 设置方法参考以下代码。 GX_DEVICE_CLASS_LIST objDeviceClass = irisCamPtr->GetDeviceInfo().GetDeviceClass(); if(GX_DEVICE_CLASS_GEV == objDeviceClass) { // 判断设备是否支持流通道数据包功能 if(true == irisFeaturePtr->IsImplemented("GevSCPSPacketSize")) { // 获取当前网络环境的最优包长值 int nPacketSize = irisStreamPtr->GetOptimalPacketSize(); // 将最优包长值设置为当前设备的流通道包长值 irisFeaturePtr->GetIntFeature("GevSCPSPacketSize")->SetValue(nPacketSize); } } //设置采集模式为连续采集模式 irisFeaturePtr->GetEnumFeature("AcquisitionMode")->SetValue("Continuous"); //设置触发模式关 irisFeaturePtr->GetEnumFeature("TriggerMode")->SetValue("On"); irisFeaturePtr->GetEnumFeature("TriggerSource")->SetValue("Software"); }