1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 海康工业相机SDK + OpenCV实例(4):相机参数设置详解

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

时间:2021-08-19 10:40:54

相关推荐

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

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);

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。