精确控制海康摄像头PTZ

项目中需要定时抓取摄像头不同角度的视频图像,也就是要精确控制海康摄像头PTZ旋转指定的角度,比如像我们的需求应该是90°,旋转完成之后刷屏,然后继续旋转。这种需求第一个想到的就是控制预置点,这个也是一个非常不错的方法,因为可以对真实情况进行调整,但是由于摄像头数据太大,一个个调整不太现实。

PTZ旋转实现

海康的PTZ控制比较简单, 但是要精确控制PTZ到指定的位置,好像没那么容易。查看海康的API文档可以获得另外一种思路,既然要精确控制,我们只需要提供精确的位置给API即可。那么接下来只需要获取到当前位置,然后为水平数值增加90°的数值就可用计算出目标位置的值。

获取当前位置使用 NET_DVR_GetDVRConfig 即可,其中使用参数 NET_DVR_GET_PTZPOS,获取结构体如下

struct{  
WORD wAction;
WORD wPanPos;
WORD wTiltPos;
WORD wZoomPos;
}NET_DVR_PTZPOS, *LPNET_DVR_PTZPOS;
  • 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_SetDVRConfigNET_DVR_SET_PTZPOS 参数设置即可,一般需要2秒左右旋转到位,可以等待2秒或者实时获取当前位置进行对比是否旋转到位。

然后就可以抓屏了。

参数值计算方法

因为涉及到数据转换,此处共享数值转换代码接口

DWORD HexToDec(DWORD wHex) {
return (wHex / 4096) * 1000 + ((wHex % 4096) / 256) * 100 +
((wHex % 256) / 16) * 10 + (wHex % 16);
}

DWORD DecToHex(DWORD wDec) {
return (wDec / 1000) * 4096 + (wDec / 100 % 10) * 256 +
(wDec / 10 % 10) * 16 + wDec % 10;
}

比如我旋转90°的方法如下,注意取余,毕竟360°就归零了。

DWORD dwRet = 0;
NET_DVR_PTZPOS pos;
NET_DVR_GetDVRConfig(handle, NET_DVR_GET_PTZPOS, channel, &pos, sizeof(NET_DVR_PTZPOS), &dwRet);

int p = HexToDec(pos.wPanPos);
int p90 = DecToHex((p + 900) % 3600); //+90

pos.wPanPos = p;
...
NET_DVR_SetDVRConfig(handle, NET_DVR_SET_PTZPOS, channel, &pos, sizeof(NET_DVR_PTZPOS));
最近的文章

FISCOBCOS~2.4动态群组试用

续前文,近期 FISCO BCOS 2.4 版本发布了,最核心的特性是动态群组管理,这个功能免去了手动部署新群组的过程,极大的方便了群组管理。 新版本部署FISCO BCOS 2.4 版本部署前一版本基本没有区别,注意 2.3 版本部署的时候配置文件稍有变化(依然兼容以前配置)。按照以前的部署方法 …

技术 继续阅读
更早的文章

FISCOBCOS~联盟链部署

续前文,开始进行区块链部署。 部署前准备首先清楚联盟链,是需要多家机构组成联盟,因此在部署上稍微有区别。其中 FISCO BCOS 支持多群组概念,也就是意思说,多个组织组成多个联盟,而且联盟中可以允许共同的组织节点。 FISCO BCOS 部署需要 Linux 平台,建议使用 CentOS 7 平 …

技术 继续阅读