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

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

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

 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一个信号,出现如下结果:

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Qt是一款跨平台的应用程序开发框架,它提供了丰富的功能和工具,用于开发图形化用户界面和应用程序功能。Qt具有良好的可移植性,可以在多个操作系统上运行,并且具有完善的文档和社区支持。 海康SDK是指海康威视公司提供的软件开发工具包。海康SDK包含了海康威视公司的摄像头、监控设备等产品的相关API,可以帮助开发者快速集成和使用这些产品。海康SDK提供了丰富的功能和接口,包括视频流播放、图像处理、事件处理等,可以满足不同应用场景的需求。 Halcon是一款功能强大的机器视觉库,由德国MVTec公司开发。Halcon提供了丰富的图像处理和分析功能,包括图像采集、图像预处理、图像匹配等。Halcon支持多种编程语言和操作系统,并且具有优秀的性能和可靠性。Halcon在机器视觉领域被广泛应用于工业自动化、质量检测、医疗影像等领域。 Qt海康SDK和Halcon可以结合起来使用,实现更加强大的功能和应用。Qt提供了友好的界面和交互方式,可以方便地集成和调用海康SDK和Halcon的功能。例如,可以使用Qt开发监控系统的图形界面,通过调用海康SDK获取监控视频流,并使用Halcon对图像进行处理和分析。这样的组合可以为用户提供更加灵活和便捷的使用体验,满足各种应用需求。 综上所述,Qt海康SDK和Halcon是三个不同的软件开发工具,它们各自具有特定的功能和用途。通过结合使用,可以实现更加强大和丰富的应用程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值