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的使用。
感谢你的观看!