项目中需要定时抓取摄像头不同角度的视频图像,也就是要精确控制海康摄像头PTZ旋转指定的角度,比如像我们的需求应该是90°,旋转完成之后刷屏,然后继续旋转。这种需求第一个想到的就是控制预置点,这个也是一个非常不错的方法,因为可以对真实情况进行调整,但是由于摄像头数据太大,一个个调整不太现实。
PTZ旋转实现
海康的PTZ控制比较简单, 但是要精确控制PTZ到指定的位置,好像没那么容易。查看海康的API文档可以获得另外一种思路,既然要精确控制,我们只需要提供精确的位置给API即可。那么接下来只需要获取到当前位置,然后为水平数值增加90°的数值就可用计算出目标位置的值。
获取当前位置使用 NET_DVR_GetDVRConfig
即可,其中使用参数 NET_DVR_GET_PTZPOS
,获取结构体如下
struct{ |
wAction
操作类型,仅在设置时有效。- 1-定位PTZ参数,2-定位P参数,3-定位T参数,4-定位Z参数,5-定位PT参数
wPanPos
P参数(水平参数)wTiltPos
T参数(垂直参数)wZoomPos
Z参数(变倍参数)
实际显示的PTZ值是获取到的十六进制值的十分之一,如获取的水平参数P的值是0x1750,实际显示的P值为175度;获取到的垂直参数T的值是0x0789,实际显示的T值为78.9度;获取到的变倍参数Z的值是0x1100,实际显示的Z值为110倍。
获取成功之后,就可以通过接口设置真实的值了,当然首先要加上我们需要旋转度数并计算。设置参数使用 NET_DVR_SetDVRConfig
的 NET_DVR_SET_PTZPOS
参数设置即可,一般需要2秒左右旋转到位,可以等待2秒或者实时获取当前位置进行对比是否旋转到位。
然后就可以抓屏了。
参数值计算方法
因为涉及到数据转换,此处共享数值转换代码接口
DWORD HexToDec(DWORD wHex) { |
比如我旋转90°的方法如下,注意取余,毕竟360°就归零了。
DWORD dwRet = 0; |