海康工业相机SDK + OpenCV实例(4):
相机参数设置详解
前言
前文海康工业相机SDK + OpenCV实例(3):相机初始化Bug调试讲述了相机初始化可能遇到的问题。本文讲解海康工业相机设置参数的相关接口,其中,会重点讲解自动曝光时间调整亮度,图像对比度调整。
一、相机参数基本接口
海康SDK提供一系列参数设置的接口,本节主要讲解几个万能接口的使用,例如MV_CC_SetIntValue、MV_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:文章来源:https://www.toymoban.com/news/detail-502686.html
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模板网!