C++|海康摄像头(3)相机配置设置

480 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

我们连接上摄像头之后,默认会展示当前相机的日期时间以及相机编号。

有些情况下我们是不需要显示的,那么该如何控制是否展示的功能呢?难道还要在网页上修改吗?不觉得那样很费劲吗?

基于有些配置属性的修改,研究了下SDK的开发文档,发现在程序中可以用代码进行设置。

实现的可供修改的配置属性,如下:

1:是否同步计算机时间

2:是否显示星期

3:是否显示年份

4:实现显示通道名称

5:OSD格式

在这里列举了海康摄像头中涉及的8种格式OSD格式,以日期:2022年4月24日为例子,如下所示:

编号方式举例说明
0XXXX-XX-XX 年月日2022-4-24
1XX-XX-XXXX 月日年4-24-2022
2XXXX年XX月XX日2022年4月24日
3XX月XX日XXXX年4月24日2022年
4XX-XX-XXXX 日月年24-4-2022
5XX日XX月XXXX年24日4月2022年
6xx/xx/xxxx 月/日/年4/24/2022
7xxxx/xx/xx 年/月/日2022/4/22
8xx/xx/xxxx 日/月/年24/4/2022

为了修改方便,我们可以将这些属性的修改放到界面上修改,以及配置文件中记录。

存储流程:

默认相机启动之后会读取我们配置文件中设置的一些信息,当界面修改后将更改属性存储到配置文件中,实现了一个简单的记录功能。

属性配置使用

无论是配置哪个属性参数,用到的调用函数都是一样的。

首先,需要获取摄像头的配置属性,用到的函数:NET_DVR_GetDVRConfig

其次,重新设置摄像头的配置属性,用到的函数:NET_DVR_SetDVRConfig

1:同步计算机时间

1.1:获取当前实时时间

time_t ticks = time(NULL);
tm local_time;
localtime_s(&local_time, &ticks);
auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());

1.2:获取设备的配置信息

NET_DVR_TIME timeCfg;
memset(&timeCfg , 0 , sizeof(NET_DVR_TIME));
BOOL bState = NET_DVR_GetDVRConfig(loginID , NET_DVR_GET_TIMECFG , 0 , &timeCfg , sizeof(NET_DVR_TIME) , &dwReturnLen);
dwErrorCode = NET_DVR_GetLastError();

bState返回值是TRUE,说明配置信息获取成功。

获取时间用到的结构体是:NET_DVR_GET_TIMECFG

注意:不同的配置对应的结构体也不同,具体的可以参考Remarks的详细说明,这里只是涉及了文章中需要实现的功能。

1.3:更改摄像头时间

timeCfg.dwYear = local_time.tm_year + 1900;
timeCfg.dwMonth = local_time.tm_mon +1;
timeCfg.dwDay = local_time.tm_mday ;
timeCfg.dwHour = local_time.tm_hour ;
timeCfg.dwMinute = local_time.tm_min ;
timeCfg.dwSecond = local_time.tm_sec ;
bState = NET_DVR_SetDVRConfig(loginID,  NET_DVR_SET_TIMECFG , byStartChan , &timeCfg , sizeof(NET_DVR_TIME));
dwErrorCode = NET_DVR_GetLastError();

2:其他配置属性参数设置

除了设置时间属性外,其它的属性配置都可以使用一个结构体来搞定的。

调用结构体:NET_DVR_PICCFG_V40

2.1:获取通道图像参数结构体

NET_DVR_PICCFG_V40 PicCfgV40;
memset(&PicCfgV40, 0, sizeof(NET_DVR_PICCFG_V40));
bState = NET_DVR_GetDVRConfig(loginID , NET_DVR_GET_PICCFG_V40 , byStartChan , &PicCfgV40 , sizeof(NET_DVR_PICCFG_V40) , &dwReturnLen );
dwErrorCode = NET_DVR_GetLastError();

2.2:设置属性参数更改

是否展示年份:PicCfgV40.dwShowOsd (1:展示;0:隐藏)

是否展示星期:PicCfgV40.byDispWeek (1:展示;0:隐藏)

是否展示通道名称:PicCfgV40.dwShowChanName (1:展示;0:隐藏)

显示OSD格式类型:PicCfgV40.byOSDType (0-8格式类型)

最后,将修改后的通道参数重新设置到摄像头中

bState = NET_DVR_SetDVRConfig(loginID,  NET_DVR_SET_PICCFG_V40 , byStartChan , &PicCfgV40 , sizeof(NET_DVR_PICCFG_V40));

未解决问题:

在我设置属性过程中,想要修改相机的分辨率,有个疑问,返回值并没有错误,但是分辨率并没有改变,有人知道是为什么吗?

我把我的代码贴出来了,大家有知道的,可以帮帮忙,感谢!

//获取分辨率
NET_DVR_COMPRESSIONCFG_V30 comperCfgV30;
memset(&comperCfgV30 , 0 , sizeof(NET_DVR_COMPRESSIONCFG_V30));
bState = NET_DVR_GetDVRConfig(loginID , NET_DVR_GET_COMPRESSCFG_V30 , byStartChan , &comperCfgV30 , sizeof(NET_DVR_COMPRESSIONCFG_V30), &dwReturnLen);
dwErrorCode = NET_DVR_GetLastError();

摄像头的基本操作已经完成了。

我是中国好公民st,一名C++开发程序猿~