海康工业相机SDK+OpenCV实例(2):RawDataFormatConvert详解
海康工业相机SDK+OpenCV实例(2):
RawDataFormatConvert详解
文章目录
- 海康工业相机SDK+OpenCV实例(2):
- RawDataFormatConvert详解
- 前言
- 一、海康工业相机SDK详解
- 二、OpenCV相关操作
- 三、运行结果
前言
在前文讲解了海康工业相机SDK与OpenCV的安装与环境配置,本文接着讲解SDK给的OpenCV的demo,主要实现RawDataFormatConvert的功能,即将海康连续采集的图像转化为OpenCV的Mat格式并显示于屏幕。
一、海康工业相机SDK详解
在海康SDK安装位置,找到D:\Softwares\MVS\Development\Samples\OpenCV\VC的Samples_OpenCV.sln并打开,下面会先对SDK的调用相机的各功能进行详解:
1.1 首先定义句柄和相机操作的返回值,当相机操作出现问题时,需要将nRet,可以根据对应的返回值查询可能出现的问题。
int nRet = MV_OK;void* handle = NULL;
1.2 列出当前的设备管理目录,输入对应值,选择相应的相机设备。
// Enum deviceMV_CC_DEVICE_INFO_LIST stDeviceList;memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);if (MV_OK != nRet){printf("Enum Devices fail! nRet [0x%x]\n", nRet);break;}if (stDeviceList.nDeviceNum > 0){for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++){printf("[device %d]:\n", i);MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];if (NULL == pDeviceInfo){break;}PrintDeviceInfo(pDeviceInfo);}}else{printf("Find No Devices!\n");break;}// input the format to convertunsigned int nFormat = 0;// select device to connectprintf("Please Input camera index(0-%d):", stDeviceList.nDeviceNum-1);unsigned int nIndex = 0;scanf("%d", &nIndex);if (nIndex >= stDeviceList.nDeviceNum){printf("Input error!\n");break;}
1.3 创建句柄并打开相机设备
// Select device and create handlenRet = MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);if (MV_OK != nRet){printf("Create Handle fail! nRet [0x%x]\n", nRet);break;}// open devicenRet = MV_CC_OpenDevice(handle);if (MV_OK != nRet){printf("Open Device fail! nRet [0x%x]\n", nRet);break;}
1.4 设置相机参数,图片的宽度与高度、相机的曝光时间与增益;返回相机参数,图片的宽度与高度、相机的曝光时间与增益。
nRet = SetParameters(handle, WidthValue, HeightValue, ExposureTimeValue, GainValue);if (MV_OK != nRet){printf("Set parameters fail! nRet [0x%x]\n", nRet);break;}nRet = GetParameters(handle);if (MV_OK != nRet){printf("Get parameters fail! nRet [0x%x]\n", nRet);break;}
1.5 设置网络最佳的包大小,设置相机的触发模式
// Detection network optimal package size(It only works for the GigE camera)if (stDeviceList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE){int nPacketSize = MV_CC_GetOptimalPacketSize(handle);if (nPacketSize > 0){nRet = MV_CC_SetIntValue(handle,"GevSCPSPacketSize",nPacketSize);if(nRet != MV_OK){printf("Warning: Set Packet Size fail nRet [0x%x]!", nRet);}}else{printf("Warning: Get Packet Size fail nRet [0x%x]!", nPacketSize);}}// Set trigger mode as offnRet = MV_CC_SetEnumValue(handle, "TriggerMode", 0);if (MV_OK != nRet){printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);break;}// Get payload sizeMVCC_INTVALUE stParam;memset(&stParam, 0, sizeof(MVCC_INTVALUE));nRet = MV_CC_GetIntValue(handle, "PayloadSize", &stParam);if (MV_OK != nRet){printf("Get PayloadSize fail! nRet [0x%x]\n", nRet);break;}g_nPayloadSize = stParam.nCurValue;
1.6 开启连续采集模式,并分配缓冲内存区
// Start grab imagenRet = MV_CC_StartGrabbing(handle);if (MV_OK != nRet){printf("Start Grabbing fail! nRet [0x%x]\n", nRet);break;}MV_FRAME_OUT stImageInfo = {0};memset(&stImageInfo, 0, sizeof(MV_FRAME_OUT));unsigned char * pData = (unsigned char *)malloc(sizeof(unsigned char) * (g_nPayloadSize));if (pData == NULL){printf("Allocate memory failed.\n");break;}
1.7 停止采集
// Stop grab imagenRet = MV_CC_StopGrabbing(handle);if (MV_OK != nRet){printf("Stop Grabbing fail! nRet [0x%x]\n", nRet);break;}
1.8 关闭相机并摧毁句柄
// Close devicenRet = MV_CC_CloseDevice(handle);if (MV_OK != nRet){printf("ClosDevice fail! nRet [0x%x]\n", nRet);break;}// Destroy handlenRet = MV_CC_DestroyHandle(handle);if (MV_OK != nRet){printf("Destroy Handle fail! nRet [0x%x]\n", nRet);break;}
二、OpenCV相关操作
在RawDataFormatConvert中,最主要的功能是将连续采集的图片,从相机的缓冲区域转化OpenCV的Mat格式,并在屏幕上显示,因此我们可以利用Mat格式调用OpenCV的相关操作。
while (true){clock_t startTime, endTime;startTime = clock();nRet = MV_CC_GetImageBuffer(handle, &stImageInfo, 1000);if (nRet == MV_OK){printf("Get One Frame: Width[%d], Height[%d], nFrameNum[%d]\n",stImageInfo.stFrameInfo.nWidth, stImageInfo.stFrameInfo.nHeight, stImageInfo.stFrameInfo.nFrameNum);}else{printf("No data[0x%x]\n", nRet);free(pData);pData = NULL;break;}cv::Mat srcImage;srcImage = cv::Mat(stImageInfo.stFrameInfo.nHeight, stImageInfo.stFrameInfo.nWidth, CV_8UC1, stImageInfo.pBufAddr);cv::namedWindow("srcImage", 0);cv::resizeWindow("srcImage", 918, 768);cv::imshow("srcImage", srcImage);cv::waitKey(1);srcImage.release();nRet = MV_CC_FreeImageBuffer(handle, &stImageInfo);endTime = clock();std::cout << "Run Time:" << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << std::endl;std::cout<< std::endl;}
根据上述代码,我们将ImageBuffer区域的数据转化为Mat格式,并且根据CV_8UC1格式,可知图像应为灰度图,这要与相机图像格式对应。
三、运行结果
运行结果如图所示:
海康工业相机SDK+OpenCV实例(2):RawDataFormatConvert详解相关推荐
- 海康工业相机SDK + OpenCV实例(3):相机初始化Bug调试
海康工业相机SDK + OpenCV实例(3): 相机初始化Bug调试 文章目录 海康工业相机SDK + OpenCV实例(3): 相机初始化Bug调试 前言 一.心跳时间设置 二.相机先关闭再打开 ...
- 海康工业相机SDK + OpenCV实例(4):相机参数设置详解
海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 文章目录 海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 前言 一.相机参数基本接口 二.自动曝光时间调整亮度 ...
- 海康工业相机SDK + OpenCV实例(5):相机双线程读写缓存策略
海康工业相机SDK + OpenCV实例(5): 相机双线程读写缓存策略 文章目录 海康工业相机SDK + OpenCV实例(5): 相机双线程读写缓存策略 前言 一.双线程 二.缓存区容量为2的生产 ...
- 海康工业相机SDK+OpenCV实例(1):海康SDK和OPENCV的安装与编译
海康工业相机SDK+OpenCV实例(1) 海康SDK和OPENCV的安装与编译 文章目录 海康工业相机SDK+OpenCV实例(1) 海康SDK和OPENCV的安装与编译 前言 一.海康SDK安装 ...
- (一)Qt+OpenCV调用海康工业相机SDK示例开发
系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 文章目录 系列文章目录 ...
- python调用海康工业相机并用opencv显示(整体实现)
python语言调用海康机器人(hikrobotics)工业相机 系列文章目录 第一章 python调用海康工业相机并用opencv显示(整体实现) 第二章 python 调用海康工业相机图像获取方式 ...
- Java_JDK19.0.2_Ubuntu18.04中配合海康工业相机SDK环境搭建
Java_JDK19.0.2_Ubuntu18.04中配合海康工业相机SDK环境搭建 简介 1. JDK环境搭建 JDK下载 JDK环境安装 2. 工业相机环境SDK安装 简介 本文主要介绍在ubun ...
- 海康摄像头实时显示与字符叠加详解
1.说明 文章详细叙述了海康摄像头的两种实时显示方法--基于SDK 解码显示和基于数据流回调显示,并且讲述了这在两种显示方法下如何往画面添加字符和图像,最后比较了这两种方法的优劣.文章全程给以详细的程 ...
- 海康工业相机SDK错误码常见场景解析
在使用SDK二次开发过程中,接口的调用往往会遇到较多的错误,sdk错误码能够帮助我们快速分析错误原因,解决问题,针对常见的错误码,下面给出一下常见的问题原因,供大家分析 1.MV_OK 0x00000 ...
最新文章
- python 使用scapy创建arping脚本
- python学精通要多久-学习Python从入门到精通需要多长时间
- 深度学习核心技术精讲100篇(六十)-深度学习分类算法之神经网络
- 修改mysql数据库的编码格式
- 外观模式源码解析(springjdbc+myabtis+tomcat)
- group count聚集函数无法直接统计出分组后的总记录数
- Springboot/Cloud集成Sentinel 和 入门实战
- Java Currency getInstance()方法与示例
- 监视和调整Linux网络协议栈:接收数据
- 用“混序”替代鲍尔默
- 总结 15/4/23
- c ++ strstr_在C / C ++中使用strstr()的指南
- C#自学总结_Day2
- jmeter使用不同数据进行post请求测试:csv配置使用
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1160/1170)...
- SAP中成本中心实际/计划/差异报表查询实例
- Xss小游戏通关攻略带解释
- 绘图与滤镜全面解析--Quartz 2D 、Core Image
- 微信小程序的全局变量和单例
- 湖仓一体化:铁打的数据仓 流水的数据湖产品
热门文章
- wdr通刷固件_高手绕道 新手 菜鸟修WD硬盘 少走弯路 必出通刷和方法以及一些个人见解...
- 以太坊黄皮书(7~)
- ubuntu18.04 aria2 GUI 的安装使用
- PHP接口interface详解
- oracle md5 重复,33-SQLServer和Oracle使用MD5加密字符串不一致的问题
- 一道二阶常系数非齐次微分方程的八种解法
- 【ClickHouse系列】clickhouse-copier是如何进行数据迁移的
- windows查看端口占用情况相关命令
- 打卡3本书10句话-20
- php字符串操作整理,PHP 字符串操作整理