海康工业相机SDK + OpenCV实例(4):

相机参数设置详解


文章目录

  • 海康工业相机SDK + OpenCV实例(4):
  • 相机参数设置详解
  • 前言
  • 一、相机参数基本接口
  • 二、自动曝光时间调整亮度
  • 三、图像对比度调整

前言

前文海康工业相机SDK + OpenCV实例(3):相机初始化Bug调试讲述了相机初始化可能遇到的问题。本文讲解海康工业相机设置参数的相关接口,其中,会重点讲解自动曝光时间调整亮度图像对比度调整


一、相机参数基本接口

海康SDK提供一系列参数设置的接口,本节主要讲解几个万能接口的使用,例如MV_CC_SetIntValueMV_CC_SetFloatValue、MV_CC_SetBoolValue、MV_CC_SetStringValue、MV_CC_SetEnumValue、MV_CC_SetCommandValue。

MV_CC_SetIntValue:
以图像宽度与高度为例,使用MV_CC_SetIntValue接口。
注意事项
当MV_CC_StartGrabbing后,即相机开始图像采集后,设置Height和Width会报错,可以尝试先关闭采集,等设置参数后,再开启采集。

    nRet = MV_CC_SetIntValue(handle, "Width", widthValue);if (MV_OK != nRet){printf("Set Width fail! nRet [0x%x]\n", nRet);return nRet;}nRet = MV_CC_SetIntValue(handle, "Height", heightValue);if (MV_OK != nRet){printf("Set Height fail! nRet [0x%x]\n", nRet);return nRet;}

MV_CC_GetIntValue:
以图像宽度与高度为例,使用MV_CC_GetIntValue接口。

    MVCC_INTVALUE stIntVal;memset(&stIntVal, 0, sizeof(MVCC_INTVALUE));nRet = MV_CC_GetIntValue(handle, "Width", &stIntVal);if (MV_OK != nRet){printf("Get Width fail! nRet [0x%x]\n", nRet);return nRet;}printf("Current Width [%d]\n", stIntVal.nCurValue);nRet = MV_CC_GetIntValue(handle, "Height", &stIntVal);if (MV_OK != nRet){printf("Get Height fail! nRet [0x%x]\n", nRet);return nRet;}printf("Current Height [%d]\n", stIntVal.nCurValue);

MV_CC_SetFloatValue:
以相机曝光时间与增益为例,使用MV_CC_SetFloatValue接口。

    nRet = MV_CC_SetFloatValue(handle, "ExposureTime", ExposureTimeValue);if (MV_OK != nRet){printf("Set ExposureTime fail! nRet [0x%x]\n", nRet);return nRet;}nRet = MV_CC_SetFloatValue(handle, "Gain", GainValue);if (MV_OK != nRet){printf("Set Gain fail! nRet [0x%x]\n", nRet);return nRet;}

MV_CC_GetFloatValue:
以相机曝光时间与增益为例,使用MV_CC_GetFloatValue接口。

    MVCC_FLOATVALUE stFloatVal;memset(&stFloatVal, 0, sizeof(MVCC_FLOATVALUE));nRet = MV_CC_GetFloatValue(handle, "ExposureTime", &stFloatVal);if (MV_OK != nRet){printf("Get ExposureTime fail! nRet [0x%x]\n", nRet);return nRet;}printf("Current ExposureTime [%f] us\n", stFloatVal.fCurValue);nRet = MV_CC_GetFloatValue(handle, "Gain", &stFloatVal);if (MV_OK != nRet){printf("Get Gain fail! nRet [0x%x]\n", nRet);return nRet;}printf("Current Gain [%f] \n", stFloatVal.fCurValue);

二、自动曝光时间调整亮度

当图像的背景亮度发生变化时,我们可以设置自动曝光时间模式,相机在该模式下,会自动调整曝光时间,直至逼近设定的亮度

MV_CC_SetExposureAutoMode:
ExposureAutoMode值为0,表示自动曝光模式关闭;
ExposureAutoMode值为1,表示单次自动曝光模式开启;
ExposureAutoMode值为2,表示连续自动曝光模式开启。

    //设置连续自动曝光模式nRet = MV_CC_SetExposureAutoMode(handle, ExposureAutoMode);if (MV_OK != nRet){printf("Set ExposureAutoMode fail! nRet [0x%x]\n", nRet);return nRet;}

MV_CC_SetBrightness
(1)亮度只有在ExposureAutoMode开启的时候才能设置,当ExposureAutoMode关闭时,会返回访问节点条件错误
(2)亮度值的范围为[0-255],这与8bit的灰度级对应。

    nRet = MV_CC_SetBrightness(handle, brightness);if (MV_OK != nRet){printf("Set Brightness fail! nRet [0x%x]\n", nRet);return nRet;}

自动曝光模式不应该在相机稳定工作后一直保持开启状态,这会导致相机图像亮度的不稳定。为解决该问题,我们应该在相机动态调整曝光时间后,等曝光时间到达某个稳定值时,便关闭相机的自动曝光时间模式。
注意事项
自动曝光模式开启后,只有当开始采集图像后,曝光时间才会开始自动调整,而且需要一定的调整时间。根据经验,设置默认调整时间为3s。
因此,流程应为开启采集——等待自动曝光时间调整——输出当前的曝光时间——关闭自动曝光时间模式

        nRet = MV_CC_StartGrabbing(handle);if (MV_OK != nRet){printf("Start Grabbing fail! nRet [0x%x]\n", nRet);}for (int SetExposureTimeCount = 0; SetExposureTimeCount < 10; SetExposureTimeCount++){Sleep(300);}MVCC_FLOATVALUE stFloatVal;memset(&stFloatVal, 0, sizeof(MVCC_FLOATVALUE));nRet = MV_CC_GetFloatValue(handle, "ExposureTime", &stFloatVal);if (MV_OK != nRet){printf("Get ExposureTime fail! nRet [0x%x]\n", nRet);}printf("Current ExposureTime [%f] us\n", stFloatVal.fCurValue);//关闭自动曝光模式nRet = MV_CC_SetExposureAutoMode(handle, 0);if (MV_OK != nRet){printf("Set ExposureAutoMode fail! nRet [0x%x]\n", nRet);}

三、图像对比度调整

图像对比度处理实际算是图像处理的工作,我们可以调用OpenCV函数去处理。当然,海康相机也提供了调整缓存内图像对比度、饱和度、锐度等等属性的接口,本节以对比度为例。

MV_CC_GetImageBuffer:

MV_CAMCTRL_API int __stdcall MV_CC_GetImageBuffer(IN void* handle, OUT MV_FRAME_OUT* pstFrame, IN unsigned int nMsec);
/********************************************************************//***  @brief  使用内部缓存获取一帧图片(与MV_CC_Display不能同时使用)*  @param  handle                      [IN]            设备句柄*  @param  pstFrame                    [OUT]           图像数据和图像信息*  @param  nMsec                       [IN]            等待超时时间,输入INFINITE时表示无限等待,直到收到一帧数据或者停止取流*  @return 成功,返回MV_OK;错误,返回错误码*  @remarks 调用该接口获取图像数据帧之前需要先调用MV_CC_StartGrabbing启动图像采集。该接口为主动式获取帧数据,上层应用程序需要根据帧率,控制好调用该接口的频率。该接口支持设置超时时间,SDK内部等待直到有数据时返回,可以增加取流平稳性,适合用于对平稳性要求较高的场合。 \n该接口与MV_CC_FreeImageBuffer配套使用,当处理完取到的数据后,需要用MV_CC_FreeImageBuffer接口将pFrame内的数据指针权限进行释放。 \n**********************************************************************/

MV_CC_ImageContrast:

MV_CAMCTRL_API int __stdcall MV_CC_ImageContrast(IN void* handle, IN OUT MV_CC_CONTRAST_PARAM* pstContrastParam);
/********************************************************************//***  @brief  图像对比度调节(该接口已弃用,建议改用ISP Tool方式进行调节)*  @param  handle                      [IN]            设备句柄*  @param  pstContrastParam            [IN]            对比度调节参数*  @return 成功,返回MV_OK;错误,返回错误码 ************************************************************************/

流程:缓存图像——调整对比度后的图像——OpenCV Mat格式
(1)pstContrastParam.nDstBufSize为输出缓存大小,要与图像大小与图像格式对应,本文图像格式为灰度图。
(2)contrast取值范围为1-10000。

MV_FRAME_OUT stImageInfo = { 0 };
nRet = MV_CC_GetImageBuffer(handle, &stImageInfo, 1000);//定义对比度结构体,进行图像对比度的调整
unsigned char* pDstBuf;
MV_CC_CONTRAST_PARAM pstContrastParam;
memset(&pstContrastParam, 0, sizeof(MV_CC_CONTRAST_PARAM));
pstContrastParam.nWidth = stImageInfo.stFrameInfo.nWidth;
pstContrastParam.nHeight = stImageInfo.stFrameInfo.nHeight;
pstContrastParam.pSrcBuf = stImageInfo.pBufAddr;
pstContrastParam.nSrcBufLen = stImageInfo.stFrameInfo.nFrameLen;
pstContrastParam.enPixelType = stImageInfo.stFrameInfo.enPixelType;
pstContrastParam.nContrastFactor = contrast;
pstContrastParam.pDstBuf = pDstBuf;
pstContrastParam.nDstBufLen = stImageInfo.stFrameInfo.nFrameLen;
pstContrastParam.nDstBufSize = stImageInfo.stFrameInfo.nHeight * stImageInfo.stFrameInfo.nWidth * 8;
nRet = MV_CC_ImageContrast(handle, &pstContrastParam);cv::Mat srcImageTemp;
srcImageTemp = cv::Mat(pstContrastParam.nHeight, pstContrastParam.nWidth, CV_8UC1, pstContrastParam.pDstBuf);

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

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

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

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

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

  3. 海康工业相机SDK+OpenCV实例(2):RawDataFormatConvert详解

    海康工业相机SDK+OpenCV实例(2): RawDataFormatConvert详解 文章目录 海康工业相机SDK+OpenCV实例(2): RawDataFormatConvert详解 前言 ...

  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. 海康、大华IpCamera RTSP地址和格式详解

    海康.大华IpCamera RTSP地址和格式详解 想要实现基于IP摄像头的视频监控,就不得不提到RTSP协议.海康和大华是国内比较著名的IP摄像头品牌,这篇文章将介绍海康.大华IP摄像头的RTSP地 ...

  9. 海康工业相机LabVIEW二次开发——修改参数、存图

    最近使用LabVIEW对海康机器人的工业相机进行二次开发,没有专门介绍LabVIEW的开发手册,本文就简单的写一写单相机取图显示以及存图的开发步骤. 如果各位是直接使用IMAQdx开发的,可以直接下载 ...

最新文章

  1. 资源 | 12月机器学习TOP 10文章,错过的快补课
  2. zabbix图表出现中文乱码
  3. C#中使用Process调取Windows中的进程(应用程序)
  4. 【剑指offer - C++/Java】11、二进制中1的个数
  5. python if break_python_if_else,while,break
  6. win10下openpose1.5安装
  7. selenium元素等待及滚动条滚动
  8. html怎么设置自动音乐播放器,运用js教你轻松制作html音乐播放器
  9. Git基本操作(学习笔记)
  10. 智能配电房综合监控系统 建设成效
  11. 计算机视觉技术与应用综述
  12. 我的世界服务器怎么做无限的弓,我的世界无限弓箭怎么做?
  13. 手机换IP的方法--手机PPTP
  14. 各大厂家人脸识别对比
  15. 机器学习—决策树模型
  16. Kafka:合理设置分区数
  17. GPU Skinning旋转指定骨骼
  18. 高考作文题“幸存者偏差”难哭了?这有份标准答案
  19. java毕业设计房屋租赁系统(附源码、数据库)
  20. SCI EI ISTP SSCI CSSCI CSCD分别代表了什么意思?

热门文章

  1. jQuery序列化表单数据 serialize()、serializeArray()及使用
  2. 使用BeautifulSoup解析html入门
  3. 高端课后晚托品牌“文启优思”获数千万A+轮融资,源道投资、高思教育、柏宏锐尔合投... 1
  4. 添加nginx中的stream模块
  5. c语言程序报告学分信息管理,C语言程序报告学生学籍信息管理系统(总21页
  6. 默纳克系统 服务器,默纳克:如何设置服务楼层
  7. R语言中如何将中文日期转化为英文格式(日期格式是%B,% A,却显示中文日期格式)
  8. php7 unset函数,深入理解 PHP7 unset 真的会释放内存吗?
  9. BANCOR学习:如何开发自己的BANCOR去中心化交易平台?
  10. 计算机八股文:操作系统总结