控制球机光轴运动到具体坐标的方式: 调用基于java的sdk中球机3D定位功能。
- 主要包括两个函数:NET_DVR_PTZSelZoomIn与NET_DVR_PTZSelZoomIn_EX,两个参数不同但功能一样。
NET_DVR_PTZSelZoomIn(LONG lRealHandle, LPNET_DVR_POINT_FRAME pStruPointFrame);
NET_DVR_PTZSelZoomIn_EX(LONG lUserID, LONG lChannel, LPNET_DVR_POINT_FRAME pStruPointFrame);
-
NET_DVR_PTZSelZoomIn参数介绍:
lRealHandle [in] NET_DVR_RealPlay或者NET_DVR_RealPlay_V30的返回值 pStruPointFrame [in] 云台图像区域位置信息 Return Values TRUE表示成功,FALSE表示失败。接口返回失败请调用NET_DVR_GetLastError获取错误码,通过错误码判断出错原因。 Remarks 该接口实现3D定位功能,需要前端设备的支持。设备是否支持3D定位功能,可以通过能力集进行判断,对应设备云台能力集(PTZAbility),相关接口:NET_DVR_GetDeviceAbility,能力集类型:DEVICE_ABILITY_INFO,节点:<PTZZoomIn>。
-
NET_DVR_SCREENZOOM参数介绍:
dwSize 结构体大小 dwScreenNum 大屏号 struPointFrame 区域位置信息 byLayer 图层号 byRes 保留,置为0 返回值: TRUE 表示成功,FALSE 表示失败。接口返回失败请调用NET_DVR_GetLastError 获取错误码,通过错误码判断出错原因。
-
先创建一个类,保存pStruPointFrame的结构体。
package com.peng.hg.Controller;
import com.sun.jna.Structure;
import java.util.Arrays;
import java.util.List;
//云台图像区域位置信息
public class Posbean extends Structure {
public int xTop; //方框起始点的x坐标
public int yTop; //方框起始点的y坐标
public int xBottom; //方框结束点的x坐标
public int yBottom; //方框结束点的y坐标
public int bCounter; //保留
//缩小条件:xTop减去xBottom的值大于2。放大条件:xTop小于xBottom。如果不想缩放,把(xTop,yTop),(xBottom,yBottom)位置互换。
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[] {"xTop","yTop","xBottom","yBottom","bCounter"});
}
}
- 第二部创建一个控制类,先将cameraInfo里账号信息设置好,注册用户设备,初始化HCNetSDK接口,调用NET_DVR_PTZSelZoomIn()接口即可实现。
package com.peng.hg.Controller;
import com.sun.jna.NativeLong;
public class ControlPos {
public static void main(String[] args) {
ControlPos controlpos = new ControlPos();
short port = 8080;
CameraInfo cameraInfo = new CameraInfo();
// cameraInfo.setAddress("10.1.16.78");
cameraInfo.setCameraPort(port);
cameraInfo.setUserName("admin");
cameraInfo.setUserPwd("p*****");
cameraInfo.setUserAddress("10.1.16.80");
controlpos.SaveRealDataformDir1(cameraInfo);
}
/*
* 通过云台参数控制摄像机位置
* param: CameraInfo 摄像机连接的基本信息
* return: null
* */
void SaveRealDataformDir1(CameraInfo cameraInfo) {
//设置设备通道号 查看Demo代码 通道号为1
NativeLong channel = new NativeLong(1);
cameraInfo.setChannel(channel);
//初始化HCNetSDK接口 实例化对象
HCNetSDK sdk = HCNetSDK.INSTANCE;
if (!sdk.NET_DVR_Init()) {
System.out.println("初始化失败..................");
}
//创建设备
HCNetSDK.NET_DVR_DEVICEINFO_V30 deInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
Posbean posbean = new Posbean();
// xTop yTop xBottom yBottom
posbean.xBottom = (int) 254*255/1920;
posbean.yBottom = (int) 810*255/1080;
posbean.xTop = (int) 384*255/1920;
posbean.yTop = (int) 940*255/1080;
posbean.bCounter = (int) 1;
//注册用户设备
NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), cameraInfo.getCameraPort(),
cameraInfo.getUserName(), cameraInfo.getUserPwd(), deInfo);
cameraInfo.setUserId(id);
//判断是否注册成功
if (cameraInfo.getUserId().intValue() < 0) {
System.out.println("注册设备失败 错误码为: " + sdk.NET_DVR_GetLastError());
} else {
System.out.println("注册成功 Id为: " + cameraInfo.getUserId().intValue());
}
//判断是否获取到设备能力
HCNetSDK.NET_DVR_WORKSTATE_V30 devWork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devWork)) {
System.out.println("获取设备能力集失败,返回设备状态失败...............");
return;
}
//启动实时预览功能 创建clientInfo对象赋值预览参数
HCNetSDK.NET_DVR_CLIENTINFO clientInfo = new HCNetSDK.NET_DVR_CLIENTINFO();
clientInfo.lChannel = cameraInfo.getChannel(); //设置通道号
clientInfo.lLinkMode = new NativeLong(0); //TCP取流
clientInfo.sMultiCastIP = null; //不启动多播模式
//创建窗口句柄
clientInfo.hPlayWnd = null;
ClientDemo clientDemo = new ClientDemo();
ClientDemo.FRealDataCallBack fRealDataCallBack = clientDemo.fRealDataCallBack;
//开启实时预览
NativeLong key = sdk.NET_DVR_RealPlay_V30(cameraInfo.getUserId(), clientInfo, fRealDataCallBack, null, true);
if (!sdk.NET_DVR_PTZSelZoomIn(key, posbean)) {
System.out.println("定位到某个位置错误,错误码为:" + sdk.NET_DVR_GetLastError());
sdk.NET_DVR_StopRealPlay(key);
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
}
System.out.println(true);
}
}