持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
我们连接上摄像头之后,默认会展示当前相机的日期时间以及相机编号。
有些情况下我们是不需要显示的,那么该如何控制是否展示的功能呢?难道还要在网页上修改吗?不觉得那样很费劲吗?
基于有些配置属性的修改,研究了下SDK的开发文档,发现在程序中可以用代码进行设置。
实现的可供修改的配置属性,如下:
1:是否同步计算机时间
2:是否显示星期
3:是否显示年份
4:实现显示通道名称
5:OSD格式
在这里列举了海康摄像头中涉及的8种格式OSD格式,以日期:2022年4月24日为例子,如下所示:
编号 | 方式 | 举例说明 |
---|---|---|
0 | XXXX-XX-XX 年月日 | 2022-4-24 |
1 | XX-XX-XXXX 月日年 | 4-24-2022 |
2 | XXXX年XX月XX日 | 2022年4月24日 |
3 | XX月XX日XXXX年 | 4月24日2022年 |
4 | XX-XX-XXXX 日月年 | 24-4-2022 |
5 | XX日XX月XXXX年 | 24日4月2022年 |
6 | xx/xx/xxxx 月/日/年 | 4/24/2022 |
7 | xxxx/xx/xx 年/月/日 | 2022/4/22 |
8 | xx/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++开发程序猿~