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

这篇具有很好参考价值的文章主要介绍了海康工业相机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。文章来源地址https://www.toymoban.com/news/detail-502686.html

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):相机参数设置详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 海康工业相机飞拍硬触发接线及参数设置、调试

            工业相机要实现拍照本质就是由触发给出信号,控制相机内部电路曝光、取图、传输照片这几个步骤,可分为内部触发与外部触发。         相机硬触发(也称为外部触发)是一种触发模式,当传感器(如光电传感器、接近开关、光线传感器)检

    2024年04月15日
    浏览(218)
  • 【项目实践】海康威视工业相机SDK开发小白版入门教程(VS2015+OpenCV4.5.1)

      由于学校要求暑期实习,于是找了一位学长开的公司,接了一个项目,是 对海康威视工业相机(MV_CE200_10GM)进行二次开发,读取其图像并做分析处理。 于是花了一点时间查找的相关资料并记录一些 入门要点 。   想先说说一些 “尝试授人与渔” 的话,也是自己的一

    2024年02月04日
    浏览(51)
  • C# 开源SDK 工业相机库 调用海康相机 大恒相机

    c# 相机库,含海康、大恒品牌2D相机的常用功能。 底层采用回调+信号量模式封装 ,最大程度减小线程资源,提高采图效率。 开源地址 :https://gitee.com/laomaogu/mgcamctrl 现只兼容了大恒和海康,都是常用的 其他相机,看我老板啥时候换品牌吧,或者换老板? 当然如果小伙伴感兴

    2024年04月26日
    浏览(52)
  • 海康工业相机SDK连接demo,Qt界面显示

    在机器视觉开发过程中,经常使用工业相机采集图像,以下采用海康机器人提供的SDK开发demo,使用语言C++,界面显示使用的Qt。SDK来自MVS 3.1版本中附属的Development文件夹。完整的项目链接地址为: 海康工业相机SDK的Demo源代码C++版本 附录海康工业相机的命名方式: 海康工业相

    2024年02月13日
    浏览(59)
  • 海康机器人工业相机SDK MVS安装教程

    海康机器人是面向全球的机器视觉和移动机器人产品及解决方案提供商,业务聚焦于工业物联网、智慧物流和智能制造,构建开放合作生态,为工业和物流领域用户提供服务,以创新技术持续推动智能化,引领智能制造进程。 进入官网 https://www.hikrobotics.com/cn,点击下载中心

    2024年02月10日
    浏览(52)
  • 【HIKROBOT】海康机器人:工业相机SDK二次开发

    海康机器人官网链接:https://www.hikrobotics.com/cn 根据购买设备的型号下载用户说明书 笔者实验室购买了两款,一款GigE网口接口的,一款USB接口 GigE网口接口 USB接口:MV-CA050-20UC 服务支持”“下载中心”“机器视觉”中下载MVS客户端安装包及SDK开发包。 1.1.1 Ubuntu18.04系统安装 下

    2024年02月05日
    浏览(62)
  • 海康工业相机SDK基于C#关于IO输入输出的控制

    海康工业相机功能模块sdk提供了很多相机的接口,本文主要介绍下相机的io相关的控制。例如在通过io输入触发相机拍照。通过io输出传递拍照成功,或者存图成功的信号等。 IO输入的主要作用就是,相机通过IO管脚,收到1个IO信号,来触发相机拍照; 触发模式:TriggerMode设置

    2024年02月03日
    浏览(251)
  • opencv——连接/控制工业相机(海康)

    1.自动抓取图像 通过接受前步传输的指令而实现相机的自动抓取图像 2.定时抓取图像 通过自定义设置延时时间而实现相机的定时抓取图像 3.特定按键控制抓取图像 通过自定义特定按键而实现相机的人为控制抓取图像 以上就是三种实现Python/opencv工业相机控制的方法啦!

    2024年02月12日
    浏览(38)
  • 海康威视工业相机Linux SDK开发指南详细步骤(Ubuntu20.04+单目、双目相机单次、连续拍照)

    由于实验需要使用双目相机同步采集图像,实验室准备的设备是海康威视的工业相机,对其进行二次开发,其中花了大部分时间查找资料,以及代码进行反复调试,最后到达了想要的效果,并写博客记录一下。 首先是资料的查找,我们要注意的是海康威视一共有两个官网,一

    2024年02月16日
    浏览(143)
  • Qt+opencv+Linux+海康工业相机连接

           本人需要在树莓派上部署深度学习推理模型 ,由于本实验室只有海康工业相机,因此通过借鉴博客和自主调试,完成了模型的部署。本文主要讲述如何在基于linux的Qt中成功连接海康工业相机,第一次尝试写博客,练练手感。       1、安装海康工业相机自带的MVS  

    2024年02月01日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包