Newer
Older
CasicIrisIdentify / device / IrisCameraController.cpp
#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");
}