C++下OPENCV驱动调用海康GigE工业相机
系列文章目录
第一章 Ubuntu22下OpenCV4.6.0+contrib模块编译安装
第二章 ubuntu22下C++ kdevelop环境搭建:OpenCV示例
第三章 C++下OPENCV驱动调用海康GigE工业相机
文章目录
- 系列文章目录
- 前言
- 一、海康工业相机
- 二、MVS软件安装 摄像头连接
- 1.安装MVS
- 2.连接配置摄像头
- 三、基于SDK的摄像头C++开发
- 1.拷贝SDK
- 2.编辑cmakelist
- 3.编辑相机class
- 4.主函数调用
- 四、测试验证
- 总结
前言
在前两章内笔者详细叙述了如何编译以及加载opencv库,本文将从opencv出发,在linux系统下利用海康工业摄像机的SDK完成基于海康工业相机的opencv开发算法。
包含:
1.海康工业相机的驱动;
2.工业相机的帧格式转换;
本文代码库:https://gitee.com/C-Qiyao/gig-e_camera
一、海康工业相机
一切缘起笔者在实验室翻箱倒柜喜提一个师兄购买的海康工业 相机,遂对其进行详细了解,发现功能性相比普通摄像头强不少。
产品页面
笔者使用的海康工业相机的型号为MV-CE013-50GC,采用rj45的网线接口来输出视频数据,并不会在系统设备上挂载video设备,所以需要调用海康的驱动来完成视频帧的获取。
二、MVS软件安装 摄像头连接
MVS软件是为支持海康机器视觉相机产品而开发的软件应用程序,适用于所有海康机器视觉面阵以及线阵相机产品。MVS内我们主要配置摄像头以及利用他的SDK进行开发。
1.安装MVS
前往HIKROBOT网站下载对应系统的MVS安装包
在此笔者使用的是linux系统所以选择linux系统的安装包进行下载
打开下载得到的压缩包,内容如下:
我们使用的计算机为64位的X86架构,所以在此我们将后缀为x86_64的安装包解压出来,笔者使用的是Debian系的ubuntu操作系统,所以在此解压对应deb安装包。
使用终端或者软件安装器安装该deb包
安装完成之后,读者可能会发现并没有在菜单内找到MVS软件的图标,但是我们可以在/opt路径下找到MVS的文件夹
qiyao@qiyao-Legion-Y9000X-IAH7:/opt$ ls
apps durapps ffmpeg-4.3.tar.gz nvidia zTools
clion deepin-wine6-stable ffmpeg MVS qqmusic
进入MVS文件夹,启动MVS软件
$ cd /opt/MVS/bin
$ ./MVS
成功打开MVS界面
2.连接配置摄像头
笔者使用的海康摄像头采用rj45接口,查阅手册得知需要使用千兆以太网标准进行连接
设置网卡IP 修改有线网卡ipv4参数为以下内容:
IP: 192.168.16.68
网关: 192.168.16.1
DNS: 202.96.128.166
MTU: 9000
重启MVS软件,在设备列表里选中我们的网络摄像机,右键修改IP(在ip段内随意设置)
双击选中我们的相机,开启相机采集
至此,相机和计算机之间的连接以及完成,接下来就需要进行SDK的开发了,同时我们在画面下部的带宽部分也可以发现,该相机的数据流巨大,确实需要依赖千兆网络的支撑。
三、基于SDK的摄像头C++开发
1.拷贝SDK
笔者比较习惯kdevelop的开发,当然也建议读者选择自己钟意的IDE进行软件的开发,毕竟代码才是核心,工具次之,对于狠人用文本编辑器也未尝不可。
拷贝/opt/MVS目录下的 include和lib文件夹到我们的项目文件夹内,与main.cpp同级
2.编辑cmakelist
本次项目我们需要使用到海康摄像头SDK以及opencv库,笔者在此提供自己的cmakelist
# cmake needs this line
cmake_minimum_required(VERSION 3.1)
set(PROJECT_NAME1 "camera_class_project")
# Define project name
#set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_BUILD_TYPE "Release")
set(PROJ_DIR "/home/qiyao/codes/camera_class")
#s设置自己的项目文件夹目录,用以定位文件夹下的include'和libproject(${PROJECT_NAME1})
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
message(STATUS "OpenCV library status:")
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")link_directories("${PROJ_DIR}/lib/64")
include_directories("${PROJ_DIR}/include" "/usr/include/X11" "/usr/include")
link_libraries("${PROJ_DIR}/lib/64/libMvCameraControl.so")
add_compile_options(-std=c++11)
add_executable(${PROJECT_NAME1} main.cpp)
add_library(camera_class SHARED camera_class.cpp)
#target_link_libraries(${PROJECT_NAME1} PUBLIC )# Link your application with OpenCV libraries
target_link_libraries(${PROJECT_NAME1} ${OpenCV_LIBS} )
target_link_libraries(${PROJECT_NAME1} -lX11)
target_link_libraries(${PROJECT_NAME1} libMvCameraControl.so)
target_link_libraries(${PROJECT_NAME1} camera_class)
3.编辑相机class
笔者将自己对相机的操作编写成了一个class类,方便自己的调用,读者可以进行参考
camera_class.h
#ifndef CAMERA_CLASS_H_INCLUDED
#define CAMERA_CLASS_H_INCLUDED
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include "MvCameraControl.h"
#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/video/video.hpp>
using namespace std;
using namespace cv;class camera{private:void* handle;bool g_bExit;int nRet;unsigned int g_nPayloadSize;unsigned char *pDataForRGB;MV_CC_DEVICE_INFO* pDeviceInfo;MV_CC_DEVICE_INFO_LIST stDeviceList;MVCC_INTVALUE stParam;MV_FRAME_OUT stOutFrame;MV_CC_PIXEL_CONVERT_PARAM CvtParam;
public:camera();void PrintDeviceInfo();void close_cam();void start_cam();void get_pic(Mat * srcimg);void re_iso();
};
#endif // CAMERA_CLASS_H_INCLUDED
camera_class.cpp
#include "camera_class.h"
camera::camera()
{nRet = MV_OK;handle = NULL;g_bExit = false;g_nPayloadSize = 0;pDataForRGB = (unsigned char*)malloc(1280 *960 * 4 + 2048);memset(&stParam, 0, sizeof(MVCC_INTVALUE));CvtParam={0};stOutFrame = {0};memset(&stOutFrame, 0, sizeof(MV_FRAME_OUT));
}
void camera::start_cam()
{memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);if (stDeviceList.nDeviceNum > 0){for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++){pDeviceInfo = stDeviceList.pDeviceInfo[i];if (NULL == pDeviceInfo){break;}PrintDeviceInfo();}}else{cout<<"Find no Device"<<endl;}unsigned int nIndex = 0;MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);MV_CC_OpenDevice(handle);if (stDeviceList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE){int nPacketSize = MV_CC_GetOptimalPacketSize(handle);if (nPacketSize > 0){MV_CC_SetIntValue(handle,"GevSCPSPacketSize",nPacketSize);}else{cout<<"Warning: Get Packet Size fail"<<endl;}}MVCC_ENUMVALUE p={0};MVCC_STRINGVALUE st;MV_CC_GetStringValue(handle,"DeviceModelName",&st);cout<<"DeviceModelName: "<<st.chCurValue<<endl;MV_CC_GetStringValue(handle,"DeviceVersion",&st);cout<<"DeviceVersion:\t"<<st.chCurValue<<endl;MV_CC_GetEnumValue(handle,"DeviceScanType",&p);if(p.nCurValue==0){cout<<"DeviceScanType:\t"<<"Areascan"<<endl;}else{cout<<"DeviceScanType:\t"<<"Linescan"<<endl;}MV_CC_SetEnumValue(handle, "TriggerMode", 0);MV_CC_SetEnumValue(handle, "PixelFormat", 0x0210001F);MV_CC_SetEnumValue(handle, "GainAuto", 1);MV_CC_SetFloatValue(handle, "Gamma", 0.8);MV_CC_SetBoolValue(handle, "GammaEnable", 1);MV_CC_SetEnumValue(handle, "BalanceWhiteAuto", 2);MV_CC_SetEnumValue(handle, "ExposureAuto", 1);MV_CC_GetIntValue(handle, "PayloadSize", &stParam);g_nPayloadSize = stParam.nCurValue;nRet = MV_CC_StartGrabbing(handle);if (MV_OK == nRet)cout<<"Start Grabbing !"<<endl;cout<<"\nPress ESC to exit.\n";
}
void camera::PrintDeviceInfo()
{if (NULL == pDeviceInfo){cout<<"null point"<<endl;}if (pDeviceInfo->nTLayerType == MV_GIGE_DEVICE){int nIp1 = ((pDeviceInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24);int nIp2 = ((pDeviceInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16);int nIp3 = ((pDeviceInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8);int nIp4 = (pDeviceInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff);cout<<"IP:"<<nIp1<<"."<<nIp2<<"."<<nIp3<<"."<<nIp4<<endl;}
}
void camera::close_cam()
{int nRet = MV_CC_StopGrabbing(handle);if (MV_OK == nRet)cout<<"Stopped Grabbing !"<<endl;
}
void camera::get_pic(cv::Mat* srcimg)
{MV_CC_GetImageBuffer(handle, &stOutFrame, 400);CvtParam.enSrcPixelType=stOutFrame.stFrameInfo.enPixelType;CvtParam.enDstPixelType=PixelType_Gvsp_RGB8_Packed;CvtParam.nHeight=stOutFrame.stFrameInfo.nHeight;CvtParam.nWidth=stOutFrame.stFrameInfo.nWidth;CvtParam.nDstBufferSize=stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight * 4 + 2048;CvtParam.pSrcData=stOutFrame.pBufAddr;CvtParam.pDstBuffer=pDataForRGB;CvtParam.nSrcDataLen=stOutFrame.stFrameInfo.nFrameLen;MV_CC_ConvertPixelType(handle,&CvtParam);*srcimg=Mat(stOutFrame.stFrameInfo.nHeight,stOutFrame.stFrameInfo.nWidth,CV_8UC3,pDataForRGB);cvtColor(*srcimg,*srcimg,COLOR_RGB2BGR);if(NULL != stOutFrame.pBufAddr){MV_CC_FreeImageBuffer(handle, &stOutFrame);}
}
void camera::re_iso()
{MV_CC_SetEnumValue(handle, "BalanceWhiteAuto", 2);MV_CC_SetEnumValue(handle, "ExposureAuto", 1);
}
4.主函数调用
main.cpp
#include <stdio.h>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/video/video.hpp>
#include <opencv2/opencv.hpp>
#include "camera_class.h"int main()
{Mat img;int key;camera cam;cam.start_cam();while(1){cam.get_pic(&img);imshow("test",img);key=waitKey(1);if(key==27){cam.close_cam();break;}}
}
可谓非常的简洁优雅
四、测试验证
构建编译测试工程
达到预期目标,成功驱动摄像机
总结
以上就是今天要讲的内容,本文介绍了linux下海康GigE相机在opencv下的使用,同时在代码类里包括了相机参数调整和帧格式的转换操作,笔者有空再进行详细地阐述。
C++下OPENCV驱动调用海康GigE工业相机相关推荐
- Python下Opencv尝试调用海康GIGE工业相机
环境 一.相机型号(海康): HIKVison MV-CE013-50GC 二.win10 x86_64 三.Python3.6.5.OpenCV3.4 四.需要结合海康SDK 拿到的童鞋,估计要慌了 ...
- 不带网口的笔记本电脑使用海康GigE工业相机
不带网口的笔记本电脑使用海康GigE工业相机 现在的笔记本都向轻薄型发展,基本都不带网线接口了.而一般程序开发人员都是使用的笔记本进行程序开发,因为笔记本携带方便嘛.我自己在工作中就遇到了,笔记本无法 ...
- python调用海康工业相机并用opencv显示(整体实现)
python语言调用海康机器人(hikrobotics)工业相机 系列文章目录 第一章 python调用海康工业相机并用opencv显示(整体实现) 第二章 python 调用海康工业相机图像获取方式 ...
- Python调用海康工业相机:包含相机参数修改、彩色原图显示(不失真)
[引言] 海康相机作为目前工业检测.视觉定位等领域应用较为广泛的国产品牌相机,其搭配有一套专用视觉软件VM,而在完成具有复杂场景.复杂任务的科研项目时依靠其VM算法平台提供的视觉算法往往无法满足项目要 ...
- Python 实现海康机器人工业相机 MV-CU060-10GM 的实时显示视频流及拍照功能
一.背景介绍 1.最近项目中需要给客户对接海康机器人工业相机 MV-CU060-10GM: 2.客户要求通过部署的管理平台,可以在页面上实现如下功能: 1)相机视频流开始预览: 2)相机视频流停止预览 ...
- (一)Qt+OpenCV调用海康工业相机SDK示例开发
系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 文章目录 系列文章目录 ...
- pyQT5 学习使用 笔记 六 pyQt5+opencv 显示海康GIGE相机动态视频流
opencv 读取 海康GIGE相机视频流 新项目中我们需要使用opencv读取海康威视的工业相机 MV-CA060-10GM 的视频流进行处理.那么首先我们要读取到相机的视频流,总所周知 openc ...
- QT+opencv调用海康工业相机
这里写自定义目录标题 QT+opencv调用海康工业相机 开发环境 引用海康开发文件 直接上代码 QT+opencv调用海康工业相机 最近在使用Opencv调用海康工业相机的程序,从网上查了好多资料, ...
- linux64下调用海康sdk(=登陆、获取通道列表、获取文件列表、按照文件下载文件、按照时间下载文件)
linux下调用海康sdk 1.库文件的配置 mkdir /data/hk_sdk/ cd /data/hk_sdk/将海康SDK的lib文件夹复制到/data/hk_sdk/下 lib文件下面的结构 ...
最新文章
- 推荐一个个人感觉比较有吸引力的网站
- c语言 打砖块,打砖块
- spring aop 应用实例
- insert 语句_CTF从入门到提升(七)insert 等数据表相关操作注入及例题分享
- Java多线程同步Synchronized深入解析
- 【黑金原创教程】【TimeQuest】【第二章】TimeQuest模型角色,网表概念,时序报告...
- 开发高级 Web 部件
- Android之XML序列化和解析
- php if throw,Laravel throw_if 和 throw_unless 辅助函数
- 渴望整成“卡戴珊” 澳大利亚年轻女性以整容为荣
- 关于JS的面向对象总结
- 基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱
- Excel做文件归档
- ISSN码和ISBN码的区别
- Android 前置摄像头预览与编码
- HTML Responsive Web Page
- 计算机用户分为哪4类,计算机的分类-通常将计算机分为哪几类?通常将计算机分为哪几类,各自的特点和用途 爱问知识人...
- mysql防火墙设置_mysql8 参考手册--MySQL企业防火墙配置参考
- 方舟服务器恐龙等级修改器,方舟服务器恐龙的等级 | 手游网游页游攻略大全
- 极光推送 使用实例 (一)服务端