控制球機光軸運動到具體坐標的方式: 調用基於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);
}
}