海康球机控制对准具体坐标点


控制球机光轴运动到具体坐标的方式: 调用基于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