海康工业相机的应用部署不是简简单单!?

打印 上一主题 下一主题

主题 659|帖子 659|积分 1977

作者:SkyXZ
CSDN:SkyXZ~-CSDN博客
博客园:SkyXZ - 博客园
笔者使用的设备及环境:WSL2-Ubuntu22.04+MV-CS016-10UC
        不会吧?不会吧?不会还有人拿到海康工业相机还是一脸懵叭?不会还有人觉得海康相机的API使用很难叭?不用慌!这篇文章从官方文档涵盖了海康相机官方MVS软件的使用以及Linux海康SDK-API包的明白上手,一篇文章带你走出海康相机使用新手村!!!让你一文读完之后便可自信的对朋侪说:“海康相机?简简单单!!!”
参考资料:
一、海康官方MVS客户端使用教程

        我们首先根据自己的系统在官网下载我们的MVS客户端,我的系统为Linux,因此我选择下载第二个Linux版本的客户端

        下载完成后我们会得到一个ZIP压缩包,我们解压后可以看到有许多不同CPU架构的版本,我们选择适合自己系统的版本使用如下命令即可完成安装,安装完成后的客户端将在/opt/MVS目录下
  1. sudo dpkg -i MVS-***********.deb #自行替换适合自己的系统版本安装包
复制代码
        我们使用如下命令即可进入MVS安装环境并且启动我们的客户端
  1. cd /opt/MVS/bin #进入软件目录
  2. ./MVS.sh #运行客户端
复制代码
        运行客户端后我们可以看到我们的客户端主界面如下,左边重要为我们的设备区在这个区域我们可以看到当前连接到我们电脑的所有海康相机设备,最上方为菜单栏提供文件、视图、设置、工具和帮助的功能,下方为控制工具条可以为相机参数保存等操作提供快捷入口

        接着我们选中我们的相机可以看到我们进入了如下界面,在这个界面中左下方为接口和设备信息获取窗口可以显示设备具体信息,中间为图像预览窗口上方左一按钮点击后即可开启相机及时取流查看图像,右边为属性设置窗口,可以对相机的根本参数进行设置,如:触发模式、增益、曝光时间、帧率、像素格式等等

        由于属性设置客户端中有中文介绍,那么我们接着重要开始讲解我们的SDK-API的使用方法叭
二、海康相机开辟实战上手

        在我们上一节安装的MVS目录下存在着海康相机驱动所需要的全部头文件以及链接库,我们首先在我们的工作空间下面新建一个文件夹,接着将MVS安装目录下的include和lib文件全部复制进来
  1. mkdir -P HK_Camera/src #创建工作目录及源码文件夹
  2. cd HK_Camera/ #进入工作目录
  3. cp -r /opt/MVS/include/ HK_Camera/  #复制头文件
  4. cp -r /opt/MVS/lib/ HK_Camera/ #复制链接库
  5. touch CmakeLists.txt #创建Cmake文件
复制代码
        我们首先来看一下海康相机组件包的项目结构叭,要驱动海康工业相机需要有两个重要的驱动包include和lib,其具体的结构以及对应的作用请看下图:
HK_Camera/
├── CmakeLists.txt
├── include/
│   ├── CameraParams.h
│   ├── MvCameraControl.h
│   ├── MvErrorDefine.h
│   ├── MvISPErrorDefine.h
│   ├── MvObsoleteInterfaces.h
│   ├── ObsoleteCamParams.h
│   └── PixelType.h
├── lib/
│   ├── 32/
│   ├── 64/
│   └── CLProtocol/
└── src/


  • CameraParams.h :定义了相机相关的参数结构体和罗列范例,包罗了相机的根本信息结构(如GigE相机信息、USB相机信息等),定义了图像采集相关的参数(如图像巨细、像素格式等),定义了相机工作模式(如单帧模式、连续采集模式等),定义了网络传输相关的参数
  • MvCameraControl.h :定义了相机控制的重要API接口,包罗相机的初始化、连接、断开等根本操作函数,包罗图像采集相关的函数(开始采集、克制采集、获取图像等),包罗参数设置和获取的函数,包罗文件操作相关的函数,是SDK的重要接口文件


  • MvErrorDefine.h :定义了SDK所有的错误码,包罗通用错误码(0x80000000-0x800000FF)、GenICam错误码(0x80000100-0x800001FF)、GigE相关错误码(0x80000200-0x800002FF)、USB相关错误码(0x80000300-0x800003FF)、固件升级相关错误码(0x80000400-0x800004FF)
  • MvISPErrorDefine.h :定义了图像处置惩罚(ISP)相关的错误码,包罗通用错误码、内存相关错误码、图像格式相关错误码、降噪处置惩罚相关错误码、去污点相关错误码
  • PixelType.h :定义了相机支持的所有像素格式范例(enum MvGvspPixelType),重要包罗以下几类像素格式:Mono(单色): Mono8/10/12/16等、Bayer: BayerGR8/10/12, BayerRG8/10/12等、RGB: RGB8_Packed, BGR8_Packed等、YUV: YUV411/422/444等、3D点云相关格式
  • ObsoleteCamParams.h :定义了一些已过时但仍支持的相机参数结构体
  • MvObsoleteInterfaces.h :定义了一些已过时但仍支持的接口函数
        由于海康的这些头文件里的API有着非常非常具体的双语介绍(如下图),因此我们将以海康工业相机MV-CS016-10UC来重要介绍使用海康相机的API使用及相机的使用流程,类似于OpenCV调用免驱摄像头一般,海康摄像头的使用也重要分为四步,分别是初始化相机——>设置相机参数——>开始取图——>克制采集和清理资源,接下来我们将一边介绍重要使用的API一边手把手带着大家使能我们的海康相机,首先我们创建我们的main.cc
  1. touch src/main.cc #创建文件
复制代码
        接着我们开始编写我们的Cmake文件,由于Cmake比较简单,我们便不具体的展开阐明白:
  1. #step 1 设置我们的项目以及版本最小需求
  2. cmake_minimum_required(VERSION 3.10)
  3. project(HK_Camera)
  4. #step 2 设置C++标准
  5. set(CMAKE_CXX_STANDARD 14)
  6. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  7. #step 3 设置编译类型
  8. if(NOT CMAKE_BUILD_TYPE)
  9.     set(CMAKE_BUILD_TYPE Release)
  10. endif()
  11. #step 4 添加海康相机SDK路径
  12. set(MVCAM_SDK_PATH "${PROJECT_SOURCE_DIR}/lib/64")  # SDK库文件路径
  13. set(MVCAM_INCLUDE_PATH "${PROJECT_SOURCE_DIR}/include")  # SDK头文件路径
  14. #step 5 添加头文件路径
  15. include_directories(
  16.     ${PROJECT_SOURCE_DIR}/include
  17.     ${MVCAM_INCLUDE_PATH}
  18. )
  19. #step 6 添加库文件路径
  20. link_directories(
  21.     ${MVCAM_SDK_PATH}
  22. )
  23. #step 7 添加源文件
  24. add_executable(${PROJECT_NAME}
  25.     src/main.cc
  26. )
  27. #step 8 链接海康相机库
  28. target_link_libraries(${PROJECT_NAME}
  29.     MvCameraControl  # 海康相机主库
  30.     pthread         # 线程库
  31. )
  32. #step 9 设置编译选项
  33. target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -O2)
  34. #step 10 安装目标
  35. install(TARGETS ${PROJECT_NAME}
  36.     RUNTIME DESTINATION bin
  37. )
复制代码
(1)海康相机使用根本部署流程

        Cmake编写完成后我们开始编写我们的代码,首先导入一些我们需要的头文件
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>  // for memset
  4. #include "MvCameraControl.h"
  5. #include "CameraParams.h"  // for MVCC_INTVALUE
  6. #include "PixelType.h"     // for PixelType_Gvsp_BGR8_Packed
复制代码
        接着为了便于我们的使用,我们首先创建一个HKCamera类,其中包罗有五个重要的函数分别是InitCamera()、SetParameters()、StartGrabbing()、GetOneFrame()、StopGrabbing()分别用来初始化我们的相机、设置相机参数、开始取流、获取一帧图像以及克制采集释放资源
  1. class HKCamera{
  2.     public:
  3.             bool InitCamera(); // 初始化相机
  4.             bool SetParameters(); // 设置相机参数
  5.             bool StartGrabbing(); // 开始取图
  6.             bool GetOneFrame(); // 获取一帧图像
  7.             void StopGrabbing() // 停止采集
  8. }
复制代码
        我们开始首先完成初始化相机的函数,要使用我们的海康相机那么首先肯定就需要先知道当前设备链接了哪些相机,因此我们便需要先使用MV_CC_EnumDevices函数来罗列当前链接上主机的网口orUSB海康相机,海康官方的API以及MV_CC_DEVICE_INFO_LIST结构体解析如下:
  1. typedef struct _MV_CC_DEVICE_INFO_LIST_
  2. {
  3.     unsigned int        nDeviceNum;                    ///< [OUT] \~chinese 在线设备数量           
  4.     MV_CC_DEVICE_INFO*  pDeviceInfo[MV_MAX_DEVICE_NUM];///< [OUT] \~chinese 支持最多256个设备      
  5. }MV_CC_DEVICE_INFO_LIST;
  6. /********************************************************************//**
  7. *  @~chinese
  8. *  @brief  枚举设备
  9. *  @param  nTLayerType      [IN]            枚举传输层, 参数定义参见CameraParams.h定义, 如: #define MV_GIGE_DEVICE 0x00000001 GigE设备
  10. *  @param  pstDevList       [IN][OUT]       设备列表
  11. *  @return 成功,返回MV_OK;错误,返回错误码
  12. *  @remarks 设备列表的内存是在SDK内部分配的,多线程调用该接口时会进行设备列表内存的释放和申请,建议尽量避免多线程枚举操作。
  13. *  @remarks 参数枚举传输层,适配传入MV_GIGE_DEVICE、MV_1394_DEVICE、MV_USB_DEVICE、MV_CAMERALINK_DEVICE;MV_GIGE_DEVICE该参数
  14.              传出所有GiGE相关的设备信息(包含虚拟GiGE和GenTL下的GiGE设备),MV_USB_DEVICE该参数传出所有USB设备,包含虚拟USB设备。
  15. ************************************************************************/
  16. MV_CAMCTRL_API int __stdcall MV_CC_EnumDevices(IN unsigned int nTLayerType, IN OUT MV_CC_DEVICE_INFO_LIST* pstDevList);
复制代码
        因此根据API的描述,我们首先需要创建一个MV_CC_DEVICE_INFO_LIST范例的结构体,同时我们还需要定义一个nRet变量来获取调用API后返回的值来判断我们是否乐成使用了API,因此我们的代码应该为下述形式:
[code]MV_CC_DEVICE_INFO_LIST stDeviceList;//定义MV_CC_DEVICE_INFO_LIST范例的结构体stDeviceListmemset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));//将结构体stDeviceList内存清零,防止垃圾值影响int nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);// 罗列设备if (MV_OK != nRet) { //判断返回值为MV_OK即正常运行    std::cout

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表