QT通过MVS的SDK实现注册回调函数读取海康工业相机画面信息并显示

1.环境介绍

编程软件:Qt 5.13.2 ;编译环境:MSVC 2017 64位;MVS版本:V3.3.0;SDK版本:V3.4.1.0

注:若实在找不到MVS资源可私信,若看到可分享。

2.导入SDK

安装好MVS后找到安装路径,如图:

 Qt导入SDK需要其中的Includes和Libraries中选自己系统对应位数的MvCameraControl.lib。将这两个文件复制到Qt项目目录下,如图:

 此处为了统一格式将MvCameraControl.lib复制到lib,Includes重命名为include。

将需要导入的静态库MvCameraControl.lib和引用头文件路径配置到Qt项目中的pro文件中:

INCLUDEPATH += $$PWD/include/ \

LIBS += -L$$PWD/lib/ -lMvCameraControl

到此为止,SDK导入完成。

3.代码实现

新建一个Camera类继承QObject,Camera类用于实现海康相机的启动、配置、停止。相机获取画面,小编是使用了注册回调函数实现的。

camera.h

#ifndef CAMERA_H
#define CAMERA_H

#include <iostream>
#include <QObject>
#include <QImage>
#include "MvCameraControl.h"


#define STATUS_OK               0
#define STATUS_ERROR            -1

class Camera : public QObject
{
    Q_OBJECT
public:
    Camera(QObject *parent = nullptr);
    ~Camera();

    static void FrameCallBack(unsigned char* pData, MV_FRAME_OUT_INFO_EX *pstFrameInfo, void *pUser);
    void ImageProcess(QImage image);

private:
    //设备相关
    void *m_hHandle;
    MV_CC_DEVICE_INFO_LIST m_stDevList;  //设备信息列表结构体变量,用来存储设备列表

signals:
    void SendImage(QImage image);

public slots:
    //初始化相机操作
    void OpenDevice();  //打开相机
    void CloseDevice();  //关闭相机
};

#endif // CAMERA_H

camera.cpp

#include "camera.h"

Camera::Camera(QObject *parent) : QObject(parent)
{

}

Camera::~Camera()
{

}

void Camera::OpenDevice()
{
    //枚举子网内所有设备
    int nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE, &m_stDevList);

    //创建设备句柄
    nRet = MV_CC_CreateHandle(&m_hHandle, m_stDevList.pDeviceInfo[0]);

    //打开设备
    nRet = MV_CC_OpenDevice(m_hHandle);

    //检测网络最优包装尺寸(它只适用于GigE摄像头)
    if (m_stDevList.pDeviceInfo[0]->nTLayerType == MV_GIGE_DEVICE)
    {
        int nPacketSize = MV_CC_GetOptimalPacketSize(m_hHandle);
        if (nPacketSize > 0)
        {
            nRet = MV_CC_SetIntValue(m_hHandle,"GevSCPSPacketSize",nPacketSize);
        }
    }

    //设置关闭触发模式
    nRet = MV_CC_SetEnumValue(m_hHandle, "TriggerMode", MV_TRIGGER_MODE_OFF);

    //注册回调函数
    nRet = MV_CC_RegisterImageCallBackForRGB(m_hHandle, Camera::FrameCallBack, this);

    //开始抓图
    nRet = MV_CC_StartGrabbing(m_hHandle);
}

void Camera::CloseDevice()
{
    // 停止取图
    int nRet = MV_CC_StopGrabbing(m_hHandle);

    // 注销回调
    nRet = MV_CC_RegisterImageCallBackEx(m_hHandle, NULL, NULL);

    // 关闭相机
    nRet = MV_CC_CloseDevice(m_hHandle);

    // 释放句柄
    nRet = MV_CC_DestroyHandle(m_hHandle);

    m_hHandle = NULL;
}

void Camera::FrameCallBack(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pstFrameInfo, void *pUser)
{
    if (pData)
    {
        QImage image(pData,pstFrameInfo->nWidth, pstFrameInfo->nHeight, QImage::Format_RGB888);
        Camera* cameraUser = static_cast<Camera*>(pUser);
        cameraUser->ImageProcess(image);
    }

}

void Camera::ImageProcess(QImage image)
{
    if(!image.isNull())
    {
        emit SendImage(image);
    }
}


mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <iostream>
#include <QImage>
#include <QPixmap>
#include <QThread>

class Camera;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void InitCamera();

private:
    Camera *camera = nullptr;
    QThread *cameraThread = nullptr;

public slots:
    void ShowImage(QImage image);

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "camera.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    InitCamera();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::InitCamera()
{

    if(!camera)
        camera = new Camera;
    if(!cameraThread)
        cameraThread = new QThread;
    camera->moveToThread(cameraThread);

    connect(camera, SIGNAL(SendImage(QImage)), this, SLOT(ShowImage(QImage)));
    connect(ui->Start, SIGNAL(clicked()), camera, SLOT(OpenDevice()));
    connect(ui->Stop, SIGNAL(clicked()), camera, SLOT(CloseDevice()));
    cameraThread->start();
}

void MainWindow::ShowImage(QImage image)
{
    ui->label->setPixmap(QPixmap::fromImage(image));
}

mainwindow.ui

 里面只添加了三个控件,一个Qlabel,两个QButton。

到这里你应该就已经连上摄像头并显示出来了!

4.小提示

如果你想定制自己的海康工业相机Qt代码,建议参考MVS提供的《工业相机SDK开发指南(C)》

该文件位于MVS安装目录下,如图:

 小编就是参考其中示例部分的Grab_Callback.cpp连接并显示相机的,你可以通过此文件查看功能接口或示例代码了解SDK的使用。

感谢你的观看!

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt环境下使用海康工业相机和OpenCV进行开发是可行的。根据引用\[1\],海康工业相机相机软件是MVS_SDK_V3_2_0_VC90_Runtime_190626和MVS_STD_3.1.0_181229,软件版本是Qt 5.12.10和Qt Creator 4.13.1。根据引用\[2\],可以通过Qt+OpenCV调用海康工业相机SDK进行开发,并且可以实现图像实时采集和图像采集+算法检测+OpenGLWidget实时显示。根据引用\[3\],在Qt环境下进行海康工业相机的使用开发,可以基于海康提供的示例进行Qt调用HIK工业相机SDK开发。 因此,你可以在Qt环境下使用海康工业相机和OpenCV进行开发,通过调用海康工业相机SDK实现图像采集和处理。 #### 引用[.reference_title] - *1* [QT+opencv【应用篇】Qt调用工业相机海康威视相机SDK配置(完整版)](https://blog.csdn.net/qq_43445867/article/details/126288032)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [(二)Qt多线程实现海康工业相机图像实时采集](https://blog.csdn.net/XCJandLL/article/details/128483035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [(一)Qt+OpenCV调用海康工业相机SDK示例开发](https://blog.csdn.net/XCJandLL/article/details/127126555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值