海康工业相机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);

  • 4
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的维京号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值