这是对前一篇《海康球机控制函数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
空间中的位置和姿态,最终输出
定位
结果的过程。