海康工业相机SDK + OpenCV实例(4):
相机参数设置详解
文章目录
- 海康工业相机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会报错,可以尝试先关闭采集,等设置参数后,再开启采集。
1
2
3
4
5
6
7
8
9
10
11
12
13
14nRet = 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接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18MVCC_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接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14nRet = 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接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17MVCC_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] usn", 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,表示连续自动曝光模式开启。
1
2
3
4
5
6
7
8//设置连续自动曝光模式 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的灰度级对应。
1
2
3
4
5
6
7nRet = MV_CC_SetBrightness(handle, brightness); if (MV_OK != nRet) { printf("Set Brightness fail! nRet [0x%x]n", nRet); return nRet; }
自动曝光模式不应该在相机稳定工作后一直保持开启状态,这会导致相机图像亮度的不稳定。为解决该问题,我们应该在相机动态调整曝光时间后,等曝光时间到达某个稳定值时,便关闭相机的自动曝光时间模式。
注意事项:
自动曝光模式开启后,只有当开始采集图像后,曝光时间才会开始自动调整,而且需要一定的调整时间。根据经验,设置默认调整时间为3s。
因此,流程应为开启采集——等待自动曝光时间调整——输出当前的曝光时间——关闭自动曝光时间模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28nRet = 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] usn", 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:
1
2
3
4
5
6
7
8
9
10
11MV_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:
1
2
3
4
5
6
7
8MV_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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21MV_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):相机参数设置详解海康工业相机SDK + OpenCV实例(4):相机参数设置详解前言一、相机参数基本接口二、自动曝光时间调整亮度三、图像对比度调整的全部内容,更多相关海康工业相机SDK内容请搜索靠谱客的其他文章。
发表评论 取消回复