这是对前一篇《海康球机控制函数VC (PTZ控制+对准具体坐标点)》的补充。

在前一篇文章中介绍的设置PTZ参数法,总是基于最初设定的基准坐标而言的,而不是基于每个当前帧而言的。(可参见前一篇文章 https://blog.csdn.net/leexin95/article/details/81131902

所以,本文是设置PTZ参数法的改进-- 基于动态相对量的设置PTZ参数法 用于连续多次地持续的将球机光轴对准目标

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【算法思想】

设定参数值 = 当前状态 + 坐标相对量;

获取当前状态下的PTZ参数作为基准,利用当前帧中的坐标位置求取相对PT参数,二者之和即为设置参数值。

【代码实现】

NET_DVR_PTZPOS m_ptzPosCurrent; DWORD dwtmp = 0; DWORD tmp_zd, tmp_yd; //获取当前PTZ状态 if (!NET_DVR_GetDVRConfig(0, NET_DVR_GET_PTZPOS, 0, &m_ptzPosCurrent, sizeof(NET_DVR_PTZPOS), &dwtmp)){ auto a = NET_DVR_GetLastError(); CString s; s.Format("GET:%d", a); AfxMessageBox(s); //转换为十进制用于运算 tmp_zd = (m_ptzPosCurrent.wPanPos / 4096) * 1000 + ((m_ptzPosCurrent.wPanPos % 4096) / 256) * 100 + ((m_ptzPosCurrent.wPanPos % 256) / 16) * 10 + (m_ptzPosCurrent.wPanPos % 16); tmp_yd = (m_ptzPosCurrent.wTiltPos / 4096) * 1000 + ((m_ptzPosCurrent.wTiltPos % 4096) / 256) * 100 + ((m_ptzPosCurrent.wTiltPos % 256) / 16) * 10 + (m_ptzPosCurrent.wTiltPos % 16); tmp_zd = tmp_zd / 10; tmp_yd = tmp_yd / 10; tmp_zd %= 360; tmp_yd %= 360; //计算坐标的相对量 y_degree = (point.y - rt.Height() / 2.0) > 0 ? -atan(-(rt.Height() / 2.0 - point.y) / (rt.Height() / 2) * tan(21.8 / 180 * PI)) * 180 / PI : atan(-(point.y - rt.Height() / 2.0) / (rt.Height() / 2) * tan(21.8 / 180 * PI)) * 180 / PI; z_degree = ((point.x - rt.Width() / 2.0) > 0) ? atan((point.x - rt.Width() / 2.0) / (rt.Width() / 2) * tan(29.15 / 180 * PI)) * 180 / PI : (360 - atan((rt.Width() / 2.0 - point.x) / (rt.Width() / 2) * tan(29.15 / 180 * PI)) * 180 / PI); z_degree = ((z_degree < 100) ? -z_degree : 360 - z_degree); //相对量与当前基准叠加 z_degree += tmp_zd; y_degree += tmp_yd; //转换为十六进制用于控制球机 NET_DVR_PTZPOS m_ptzPos; m_ptzPos.wAction = 1; DWORD z_idegree = z_degree * 10; DWORD y_idegree = y_degree * 10; m_ptzPos.wPanPos = (z_idegree / 1000) * 4096 + ((z_idegree % 1000) / 100) * 256 + ((z_idegree % 100) / 10) * 16 + z_idegree % 10; m_ptzPos.wTiltPos = (y_idegree / 1000) * 4096 + ((y_idegree % 1000) / 100) * 256 + ((y_idegree % 100) / 10) * 16 + y_idegree % 10; m_ptzPos.wZoomPos =(10/ 1000) * 4096 + ((10 % 1000) / 100) * 256 + ((10 % 100) / 10) * 16 + 10 % 10; //设置PTZ参数 if (!NET_DVR_SetDVRConfig(0, NET_DVR_SET_PTZPOS, 0, &m_ptzPos, sizeof(NET_DVR_PTZPOS))){ auto a = NET_DVR_GetLastError(); CString s; s.Format("SET:%d", a); AfxMessageBox(s);

海康球机demo中自带的3D定位功能是相对量的,改进后的算法与其功能几乎一致,其中调焦策略可以通过

m_ptzPos.wZoomPos =(10/ 1000) * 4096 + ((10 % 1000) / 100) * 256 + ((10 % 100) / 10) * 16 + 10 % 10;

来设定,加入判断即可,可自行发挥。

改进后的方法--“ 基于动态相对量的设置PTZ参数法 ”,功能与3D定位功能一致,但存在较小的误差(几个像素),其原因可能有以下几个:

1.存在畸变;

2.坐标转换为角度的算法存在一定的误差;

3.球机机械原因,球机PT角度精确到1度,在1度的区间内小幅度的移动是共用一个相同的PT参数。

这是对前一篇《海康球机控制函数VC (PTZ控制+对准具体坐标点)》的补充。     在前一篇文章中介绍的设置PTZ参数法,总是基于最初设定的基准坐标而言的,而不是基于每个当前帧而言的。(可参见前一篇文章https://blog.csdn.net/leexin95/article/details/81131902)     所以,本文是设置PTZ参数法的改进--基于动态相对量...
@ApiOperation(value = "设置 海康 摄像头PTZ参数", notes = "设置 海康 摄像头PTZ参数") @Log(action = "设置 海康 摄像头PTZ参数", tag = "/setHKCameraPTZValue") @WebMapping("/setHKCameraPTZValue") public JSONObject setHKCameraPTZvalue(String ip,String username,String password,int i.
1.从官方下载SDK包 按照自己的环境下载 2.按照readme 将相关dll文件和HCNetSDK.java文件放入自己的项目 我这是把全部的dll文件都搬过来了 放到了自己项目根目录下面 3.java文件肯定会报红 修改文件路径 4.关于包的引用 ,官方sdk的压缩包也有,建议用官方的 这样不会出错 添加对应依赖 <dependency> <groupId>com.sun.jna.examples</groupId> 什么是相机的预置点?预置点就是一条记录,它记录下云台的俯仰角、偏转角,镜头的焦距、相机的光圈、曝光、白平衡等拍照参数,储存在相机内部的SD卡上,并被赋予一个编号以供用户索引。用户可以让相机根据指定编号的预置点,将自身拍照参数恢复到预置点记录的参数值,以 实现 拍摄预定区域的画面,这在安防领域很常用。 海康 相机的云台最多支持255个预置点,对于安防一般够了,但对巡检机器人来说就不够,因为机器人是移动的,它的巡视面积非常大,很容易就突破这个数目。 预置点的用法 一般通过调用NET_DVR_PTZPreset(
海康 SDK编程指南 目前使用的 海康 SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用 海康 播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息。本文仅对视频监控常用 功能 的使用进行说明,其它未 实现 功能 请参看设备网络SDK使用手册和播放库编程指南V7.2。 IPC_SDK编程指南 (一) SDK的引用 由于IPC_SDK没有SDK安装程...
由于最近在开发 海康 威视摄像头,特此记录一下通过云台参数控制摄像机的位置,我这里是通过properties配置文件输入的参数,也可以不用配置文件,看具体的需求 package ClientDemo; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import java.io.File; import java.io.FileInputStream;
海康 摄像头的 3D 定位 功能 原理是基于计算机视觉和图像处理技术 实现 的。其具体步骤如下: 首先, 海康 摄像头会捕捉到目标物体的图像。通过预处理和分析图像,摄像头可以提取出目标物体的特征向量和形状信息。 然后,摄像头会将特征向量和形状信息与预先建立的 3D 模型进行匹配。这个 3D 模型是在摄像头系统中存储的,包含了目标物体的真实尺寸、形状和外观等信息。 接下来,摄像头会利用视差法或三角测量等方法,计算出目标物体在 3D 空间中的位置和姿态。这些计算是基于目标物体在不同角度和位置下的图像信息,通过三维重建技术得出的。 最后, 海康 摄像头将 定位 结果输出给用户,可以将位置和姿态信息实时传输到其他设备或应用程序中,用于控制机器人、无人机或其他机械设备的导航和操作。 总之, 海康 摄像头的 3D 定位 功能 原理是利用摄像头捕捉图像,提取目标物体特征,匹配储存的 3D 模型信息,通过三维重建技术计算目标物体在 3D 空间中的位置和姿态,最终输出 定位 结果的过程。