海康工业相机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详解相关推荐

  1. 海康工业相机SDK + OpenCV实例(3):相机初始化Bug调试

    海康工业相机SDK + OpenCV实例(3): 相机初始化Bug调试 文章目录 海康工业相机SDK + OpenCV实例(3): 相机初始化Bug调试 前言 一.心跳时间设置 二.相机先关闭再打开 ...

  2. 海康工业相机SDK + OpenCV实例(4):相机参数设置详解

    海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 文章目录 海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 前言 一.相机参数基本接口 二.自动曝光时间调整亮度 ...

  3. 海康工业相机SDK + OpenCV实例(5):相机双线程读写缓存策略

    海康工业相机SDK + OpenCV实例(5): 相机双线程读写缓存策略 文章目录 海康工业相机SDK + OpenCV实例(5): 相机双线程读写缓存策略 前言 一.双线程 二.缓存区容量为2的生产 ...

  4. 海康工业相机SDK+OpenCV实例(1):海康SDK和OPENCV的安装与编译

    海康工业相机SDK+OpenCV实例(1) 海康SDK和OPENCV的安装与编译 文章目录 海康工业相机SDK+OpenCV实例(1) 海康SDK和OPENCV的安装与编译 前言 一.海康SDK安装 ...

  5. (一)Qt+OpenCV调用海康工业相机SDK示例开发

    系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 文章目录 系列文章目录 ...

  6. python调用海康工业相机并用opencv显示(整体实现)

    python语言调用海康机器人(hikrobotics)工业相机 系列文章目录 第一章 python调用海康工业相机并用opencv显示(整体实现) 第二章 python 调用海康工业相机图像获取方式 ...

  7. Java_JDK19.0.2_Ubuntu18.04中配合海康工业相机SDK环境搭建

    Java_JDK19.0.2_Ubuntu18.04中配合海康工业相机SDK环境搭建 简介 1. JDK环境搭建 JDK下载 JDK环境安装 2. 工业相机环境SDK安装 简介 本文主要介绍在ubun ...

  8. 海康摄像头实时显示与字符叠加详解

    1.说明 文章详细叙述了海康摄像头的两种实时显示方法--基于SDK 解码显示和基于数据流回调显示,并且讲述了这在两种显示方法下如何往画面添加字符和图像,最后比较了这两种方法的优劣.文章全程给以详细的程 ...

  9. 海康工业相机SDK错误码常见场景解析

    在使用SDK二次开发过程中,接口的调用往往会遇到较多的错误,sdk错误码能够帮助我们快速分析错误原因,解决问题,针对常见的错误码,下面给出一下常见的问题原因,供大家分析 1.MV_OK 0x00000 ...

最新文章

  1. python 使用scapy创建arping脚本
  2. python学精通要多久-学习Python从入门到精通需要多长时间
  3. 深度学习核心技术精讲100篇(六十)-深度学习分类算法之神经网络
  4. 修改mysql数据库的编码格式
  5. 外观模式源码解析(springjdbc+myabtis+tomcat)
  6. group count聚集函数无法直接统计出分组后的总记录数
  7. Springboot/Cloud集成Sentinel 和 入门实战
  8. Java Currency getInstance()方法与示例
  9. 监视和调整Linux网络协议栈:接收数据
  10. 用“混序”替代鲍尔默
  11. 总结 15/4/23
  12. c ++ strstr_在C / C ++中使用strstr()的指南
  13. C#自学总结_Day2
  14. jmeter使用不同数据进行post请求测试:csv配置使用
  15. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1160/1170)...
  16. SAP中成本中心实际/计划/差异报表查询实例
  17. Xss小游戏通关攻略带解释
  18. 绘图与滤镜全面解析--Quartz 2D 、Core Image
  19. 微信小程序的全局变量和单例
  20. 湖仓一体化:铁打的数据仓 流水的数据湖产品

热门文章

  1. wdr通刷固件_高手绕道 新手 菜鸟修WD硬盘 少走弯路 必出通刷和方法以及一些个人见解...
  2. 以太坊黄皮书(7~)
  3. ubuntu18.04 aria2 GUI 的安装使用
  4. PHP接口interface详解
  5. oracle md5 重复,33-SQLServer和Oracle使用MD5加密字符串不一致的问题
  6. 一道二阶常系数非齐次微分方程的八种解法
  7. 【ClickHouse系列】clickhouse-copier是如何进行数据迁移的
  8. windows查看端口占用情况相关命令
  9. 打卡3本书10句话-20
  10. php字符串操作整理,PHP 字符串操作整理