PTZ功能即缩放(Z),左右移动(P)和上下移动(T)功能,定义在相机终端描述符里面(Camera Terminal Descriptor ),如下图为终端描述符。
从描述符中可以知道,PTZ通过bmControls来控制,PTZ对应的是D9-D12,这里我们选择绝对控制,这里我觉得绝对控制好处理一点,不用记录上一次状态。所有我们只要在描述符中把D9和D11置为1即可。
描述符打开之后就可以接收到上层应用请求了。Z对应CT_ZOOM_ABSOLUTE_CONTROL,PT对应CT_PANTILT_ABSOLUTE_CONTROL。
ZOOM必须要实现 GET_CU R, GET_MIN, GET_MAX, GET_RES, GET_INFO, GET_DEF请求,这里我们需要进行控制的话,还得支持SET_CUR。需要注意的是处理GET_INFO请求的时候返回的数据一定要正确,如不正确可能会接收不到UVC命令。GET_INFO请求值定义如下,一般我们支持GET和SET,GET_INFO的时候返回一个3就行了。
PT必须要支持GET_CUR, GET_MIN, GET_MAX, GET_RES, GET_INFO, GET_DEF请求,同理我们要能控制还得支持SET_CUR请求。
最近在给模块端添加这个功能的时候折腾了一段时间,zoom功能主要根据SET_CUR请求值对画面做相应处理就好,这里说下PT功能,PT功能需要注意下面几个点:
1.PT功能命令的数据长度为8个字节,低4字节为P(左右移动)数据,高4字节为T(上下移动)数据
2.数据以3600为单位,比如你想设置的移动范围为-10-10,那么实际返回给上层的值应该是-36000-36000。
3.PT两个功能对应一个指令,所以同一个请求实际上是请求两个功能数据,如处理GET_MAX请求时,我们需要把P功能的最大值放到低4字节,把T功能的最大值放到高4字节。
4.接收SET_CUR指令时需要区分是设置P、设置T还是PT都设置,当设置P时,高四个字节全是0,当设置T时,低4个字节全是0,其他值PT都设置。
我实现这两个功能的算法思路就是在每一帧图像中根据设置的PTZ值裁剪出一个框进行resize。