QT+海康SDK实现相机硬件触发拍照

1、导入相机SDK(将海康SDK库复制粘贴到项目的根目录)

QT+海康SDK实现相机硬件触发拍照

 

 2、在CameraWidget.h头文件中声明如下变量和函数

QT+海康SDK实现相机硬件触发拍照

 

 3、在CameraWidget.cpp文件中写入如下代码

#include "camerawidget.h"
#include "ui_camerawidget.h"

#include <QDebug>

CameraWidget::CameraWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CameraWidget),
    handle(NULL),
    m_isColor(false)
{
    ui->setupUi(this);

    //step 1: 初始化相机
    initCamera();

    //step2: 注册取图回调函数
    if(m_isColor)
    {
        int ret = MV_CC_RegisterImageCallBackForRGB(handle,
                                                    CameraWidget::getCameraImageCallback,
                                                    this);
        if(MV_OK != ret)
            qDebug() << "=======faild =======" ;
    }

    else
        MV_CC_RegisterImageCallBackEx(handle,
                                      CameraWidget::getCameraImageCallback,
                                      this);

    //step 3: 开始取图
    MV_CC_StartGrabbing(handle);
}

CameraWidget::~CameraWidget()
{
    MV_CC_StopGrabbing(handle);  //停止取图
    int nRet = -1;

    //关闭设备,释放资源
    nRet = MV_CC_CloseDevice(handle);
    if (MV_OK != nRet)
    {
        qDebug() << "error: CloseDevice fail";
    }

    //销毁句柄,释放资源
    nRet = MV_CC_DestroyHandle(handle);
    if (MV_OK != nRet)
    {
        qDebug() << "error: DestroyHandle fail";
    }

    delete ui;
}

void CameraWidget::getCameraImageCallback(unsigned char *pData, MV_FRAME_OUT_INFO_EX *stImageInfo, void *arg)
{
    (void)(stImageInfo);

    CameraWidget *tmp = (CameraWidget *)arg;
    memcpy(tmp->mpData,pData,tmp->nDataSize);

    tmp->displayCameraImage();     //刷新图像

}

int CameraWidget::initCamera()
{
    int nRet = -1;

    MV_CC_DEVICE_INFO_LIST stDeviceList;
    memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));

    // step 1 : enum device
    nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);
    if (MV_OK != nRet)
    {
        qDebug()<<"MV_CC_EnumDevices fail!";
        return -1;
    }

    unsigned int nIndex = 0;
    MV_CC_DEVICE_INFO* pDeviceInfo;
    if (stDeviceList.nDeviceNum > 0)
    {
        for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++)
        {
            qDebug() <<QString("[device %1]").arg(i);
            pDeviceInfo = stDeviceList.pDeviceInfo[i];
            if (NULL == pDeviceInfo)
            {
                break;
            }
        }
    }
    else
    {
        qDebug()<<"Find No Devices!";
        return -1;
    }

    pDeviceInfo = stDeviceList.pDeviceInfo[0];
    //打印相机型号及序列号
    qDebug() << QString::fromLocal8Bit(reinterpret_cast<char*>(pDeviceInfo->SpecialInfo.stGigEInfo.chModelName));
    qDebug() << QString::fromLocal8Bit(reinterpret_cast<char*>(pDeviceInfo->SpecialInfo.stGigEInfo.chSerialNumber));

    //彩色相机判别
    if('C' == pDeviceInfo->SpecialInfo.stGigEInfo.chModelName[12])
    {
        m_isColor = true;
        qDebug() << "==============color=================";
    }

    // step2 :select device and create handle
    nRet = MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);
    if (MV_OK != nRet)
    {
        qDebug()<<"MV_CC_CreateHandle fail!";
        return -1;
    }

    // step3 : open device
    nRet = MV_CC_OpenDevice(handle);
    if (MV_OK != nRet)
    {
        qDebug()<<"MV_CC_OpenDevice fail!";
        return -1;
    }

    //step 4: get camera image width and height
    MVCC_INTVALUE ptValue;
//    int w,h;
    MV_CC_GetWidth(handle, &ptValue);
    m_imageWidth = ptValue.nCurValue;
    MV_CC_GetHeight(handle, &ptValue);
    m_imageHeight = ptValue.nCurValue;

    if(m_isColor)
        nDataSize = m_imageWidth * m_imageHeight * 3;
    else
        nDataSize = m_imageWidth * m_imageHeight;

    //step 5:  set trigger mode as on
    nRet = MV_CC_SetEnumValue(handle, "TriggerMode", 1);

    nRet = MV_CC_SetEnumValue(handle, "TriggerSource", 0);
    mpData = (unsigned char *)malloc(nDataSize);

    return 1;
}

int CameraWidget::displayCameraImage()
{
    QImage image;

    if(m_isColor)
        image = QImage((uchar*)mpData,m_imageWidth,m_imageHeight,QImage::Format_RGB888);
    else
        image = QImage((uchar*)mpData,m_imageWidth,m_imageHeight,QImage::Format_Indexed8);

    ui->lb_image->setPixmap(QPixmap::fromImage(image).scaled(560,420));

    return 1;
}

4、运行结果:

使用12v的电压给相机的输入line0一个信号,出现如下结果:

QT+海康SDK实现相机硬件触发拍照

 

上一篇:SQLSERVER 自增列跳ID 1W-1K问题


下一篇:nginx_gzip