海康球機控制對准具體坐標點


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM