QT + C++ + 海康威视工业相机二次开发 2021-05-12

本文介绍了如何在QT环境中利用C++进行海康威视工业相机的二次开发,包括从下载SDK到配置VS和QT环境,以及在QT中配置相机SDK和OpenCV库的过程。通过参考相关博客,成功实现了相机的基本功能,如显示图像、保存图片等。

1.了解海康威视工业相机

本人学习参考的是:boss_dog的博客,里面有详细的分析相机的数据,各种相机的区别,在VS中部署SDK的环境变量以及官方例程.

1.1.下载SDK

海康威视的工业相机二次开发首先是需要在官方下载相机的SDK,下载地址_官方下载地址,根据自身的环境区下载需要的SDK,本人下载的是(机器视觉工业相机客户端MVS V3.3.1(Windows)).

下载后打开下图中的文件,是VS+C++的Demo,本人用到的是第一个demo,打开相机保存图片.

 

1.2.环境配置

PS:不管运行海康威视的哪个例程,都需要先配置下环境
在VS项目中配置opencv和mvs的动态链接库等(用到Opencv的话)
①在VS中配置Opencv
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
②在VS中配置MVS
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

环境配置完成后,将官方的demo导入到VS中基本上就能运行了.

下图就是实现基本功能的代码,在BasicDemoDlg.cpp中就是自己写的代码根据调用官方的SDK来实现基本功能.

2.在QT中实现官方demo中的功能

2.1.首先我们需要在qt中配置好实现功能的环境:

2.1.1 配置好相机SDK的环境,参考博客:大樱桃的博客_大_樱_桃_优快云博客-Halcon,工业相机,Halcon_C#l联合编程领域博主.

先在QT中创建一个项目,将海康的MVS文件下Development文件里面的Includes以及Libraries文件复制到qt的项目文件下.

复制完成后在QT中右击项目文件,点击添加库,选择外部库,点击下一步,选择库文件,选择平台和静态链接,点下一步就行了.

             

导入库后生成的代码片段:

生成代码片段后再加入Include,相机的头文件,相机的SDK和环境就配置完成了.

INCLUDEPATH += $$PWD/Includes
DEPENDPATH += $$PWD/Includes

2.1.2 配置opencv的环境变量:在配置opencv的路上我也是经历了很多坎坷,,,查阅无数文档,大部分都是使用MinGV,可以参考博客:拜小白教你Qt5.8.0+OpenCV3.2.0配置教程(详细版)_拜小白的成长之路,告别小白-优快云博客,但是我是先使用的VS的运行环境,然后QT在VS的运行环境下建立的,可以参考Qt5.9.6+opencv+VS2017的安装及配置_我内疚的博客-优快云博客。反正这种配置环境的路上就是不断地查找文档,不断地更改。,慢慢摸索,,最终我在qt上配置的opencv的代码是:

INCLUDEPATH += D:\QtDemo\opencv\include
INCLUDEPATH += D:\QtDemo\opencv\include/opencv2
CONFIG(debug, debug|release): {
   
   
LIBS += -LD:\QtDemo\opencv/lib \
-lopencv_world440 \
-lopencv_world440d
} else:CONFIG(release, debug|release): {
   
   
LIBS += -LD:\QtDemo\opencv/lib \
-lopencv_world440 \
-lopencv_world440d
}

环境配置完成后,接着把相机封装好的函数体:cpp文件和头文件复制到项目文件下:MVCamera.cpp和MVCamera.h

接着又是参考:海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(二)_boss-dog的博客-优快云博客其中的源代码,结合上官方自带的SDK,就完成了一些基本的显示相机采集的画面,保存图片,获取相机IP,软触发等功能。

3.我的源代码是:

MVCamera.h

/************************************************************************/
/* 以C++接口为基础,对常用函数进行二次封装,方便用户使用                */
/************************************************************************/
 
#ifndef _MV_CAMERA_H_
#define _MV_CAMERA_H_
 
#include "Includes/MvCameraControl.h"
#include <string.h>
 
#include"opencv2/opencv.hpp"
#include"opencv2/imgproc/types_c.h"
 
 
#ifndef MV_NULL
#define MV_NULL    0
#endif
 
class CMvCamera
{
   
   
public:
    CMvCamera();
    ~CMvCamera();
 
    // ch:获取SDK版本号 | en:Get SDK Version
    static int GetSDKVersion();
 
    // ch:枚举设备 | en:Enumerate Device
    static int EnumDevices(unsigned int nTLayerType, MV_CC_DEVICE_INFO_LIST* pstDevList);
 
    // ch:判断设备是否可达 | en:Is the device accessible
    static bool IsDeviceAccessible(MV_CC_DEVICE_INFO* pstDevInfo, unsigned int nAccessMode);
 
    // ch:打开设备 | en:Open Device
    int Open(MV_CC_DEVICE_INFO* pstDeviceInfo);
 
    // ch:关闭设备 | en:Close Device
    int Close();
 
    // ch:判断相机是否处于连接状态 | en:Is The Device Connected
    bool IsDeviceConnected();
 
    // ch:注册图像数据回调 | en:Register Image Data CallBack
    int RegisterImageCallBack(void(__stdcall* cbOutput)(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser), void* pUser);
 
    // ch:开启抓图 | en:Start Grabbing
    int StartGrabbing();
 
    // ch:停止抓图 | en:Stop Grabbing
    int StopGrabbing();
 
    // ch:主动获取一帧图像数据 | en:Get one frame initiatively
    int GetImageBuffer(MV_FRAME_OUT* pFrame, int nMsec);
 
    // ch:主动获取一帧图像数据 | en:Get one frame initiatively
    int GetOneFrameTimeout(unsigned char* pData, unsigned int* pnDataLen, unsigned int nDataSize, MV_FRAME_OUT_INFO_EX* pFrameInfo, int nMsec);
 
    // ch:释放图像缓存 | en:Free image buffer
    int FreeImageBuffer(MV_FRAME_OUT* pFrame);
 
    // ch:显示一帧图像 | en:Display one frame image
    int DisplayOneFrame(MV_DISPLAY_FRAME_INFO* pDisplayInfo);
 
    // ch:设置SDK内部图像缓存节点个数 | en:Set the number of the internal image cache nodes in SDK
    int SetImageNodeNum(unsigned int nNum);
 
    // ch:获取设备信息 | en:Get device information
    int GetDeviceInfo(MV_CC_DEVICE_INFO* pstDevInfo);
 
    // ch:获取GEV相机的统计信息 | en:Get detect info of GEV camera
    int GetGevAllMatchInfo(MV_MATCH_INFO_NET_DETECT* pMatchInfoNetDetect);
 
    // ch:获取U3V相机的统计信息 | en:Get detect info of U3V camera
    int GetU3VAllMatchInfo(MV_MATCH_INFO_USB_DETECT* pMatchInfoUSBDetect);
 
    // ch:获取和设置Int型参数,如 Width和Height,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
    // en:Get Int type parameters, such as Width and Height, for details please refer to MvCameraNode.xlsx file under SDK installation directory
    int GetIntValue(IN const char* strKey, OUT unsigned int* pIntValue);
    int SetIntValue(IN const char* strKey, IN int64_t nValue);
 
    // ch:获取和设置Enum型参数,如 PixelFormat,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
    // en:Get Enum type parameters, such as PixelFormat, for details please refer to MvCameraNode.xlsx file under SDK installation directory
    int GetEnumValue(IN const char* strKey, OUT MVCC_ENUMVALUE *pEnumValue);
    int SetEnumValue(IN const char* strKey, IN unsigned int nValue);
    int SetEnumValueByString(IN const char* strKey, IN const char* sValue);
 
    // ch:获取和设置Float型参数,如 ExposureTime和Gain,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
    // en:Get Float type parameters, such as ExposureTime and Gain, for details please refer to MvCameraNode.xlsx file under SDK installation directory
    int GetFloatValue(IN const char* strKey, OUT MVCC_FLOATVALUE *pFloatValue);
    int SetFloatValue(IN const char* strKey, IN float fValue);
 
    // ch:获取和设置Bool型参数,如 ReverseX,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
    // en:Get Bool type parameters, such as ReverseX, for details please refer to MvCameraNode.xlsx file under SDK installation directory
    int GetBoolValue(IN const char* strKey, OUT bool *pbValue);
    int SetBoolValue(IN const char* strKey, IN bool bValue);
 
    // ch:获取和设置String型参数,如 DeviceUserID,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件UserSetSave
    // en:Get String type parameters, such as DeviceUserID, for details please refer to MvCameraNode.xlsx file under SDK installation directory
    int GetStringValue(IN const char* strKey, MVCC_STRINGVALUE *pStringValue);
    int SetStringValue(IN const char* strKey, IN const char * strValue);
 
    // ch:执行一次Command型命令,如 UserSetSave,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
    // en:Execute Command once, such as UserSetSave, for details please refer to MvCameraNode.xlsx file under SDK installation directory
    int CommandExecute(IN const char* strKey);
 
    // ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
    int GetOptimalPacketSize(unsigned int* pOptimalPacketSize);
 
    // ch:注册消息异常回调 | en:Register Message Exception CallBack
    int RegisterExceptionCallBack(void(__stdcall* cbException)(unsigned int nMsgType, void* pUser), void* pUser);
 
    // ch:注册单个事件回调 | en:Register Event CallBack
    int RegisterEventCallBack(const char* pEventName, void(__stdcall* cbEvent)(MV_EVENT_OUT_INFO * pEventInfo, void* pUser), void* pUser);
 
    // ch:强制IP | en:Force IP
    int ForceIp(unsigned int nIP, unsigned int nSubNetMask, unsigned int nDefaultGateWay);
 
    // ch:配置IP方式 | en:IP configuration method
    int SetIpConfig(unsigned int nType);
 
    // ch:设置网络传输模式 | en:Set Net Transfer Mode
    int SetNetTransMode(unsigned int nType);
 
    // ch:像素格式转换 | en:Pixel format conversion
    int ConvertPixelType(MV_CC_PIXEL_CONVERT_PARAM* pstCvtParam);
 
    // ch:保存图片 | en:save image
    int SaveImage(MV_SAVE_IMAGE_PARAM_EX* pstParam);
 
    // ch:保存图片为文件 | en:Save the image as a file
    int SaveImageToFile(MV_SAVE_IMG_TO_FILE_PARAM* pstParam);
 
    //设置是否为触发模式
    int setTriggerMode(unsigned int TriggerModeNum);
 
    //设置触发源
    int setTriggerSource(unsigned int TriggerSourceNum);
 
    //软触发
    int softTrigger();
 
    //读取buffer
    int ReadBuffer(cv::Mat& image);
 
 
private:
 
    void*               m_hDevHandle;
 
public:
    unsigned int     m_nTLayerType;
 
    unsigned char* m_pBufForSaveImage;         // 用于保存图像的缓存
    unsigned int    m_nBufSizeForSaveImage;
 
    unsigned char* m_pBufForDriver;            // 用于从驱动获取图像的缓存
    unsigned int    m_nBufSizeForDriver;
 
};
 
#endif//_MV_CAMERA_H_
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include "QThread"
#include "MvCamera.h"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
 
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
using namespace std;
using namespace cv;
 
class MyThread :public QThread
{
   
   
    Q_OBJECT
 
public:
    MyThread();
    ~MyThread();
 
    void run();
    void getCameraPtr(CMvCamera* camera);
    void getImagePtr(Mat* image);
    void getCameraIndex(int index);
 
signals:
    void mess();
    void Display(const Mat* image, int index);
 
private:
    CMvCamera* cameraPtr = NULL;
    cv::Mat* imagePtr = NULL;
    int cameraIndex = NULL;
    int TriggerMode;
};
 
#endif // MYTHREAD_H
#pragma once

widget.h

评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值