Parade Series - Pan & Tilt & Zoom

1 篇文章 0 订阅
文章详细描述了如何在Hikvision和Dahua监控系统中进行PTZ(Pan,Tilt,Zoom)控制,包括设备初始化、登录、控制命令解析以及播放操作。展示了与这些监控摄像头相关的API接口和功能实现。
摘要由CSDN通过智能技术生成
PTZ-P                     Pan          水平方向上移动        0 ~ 359
PTZ-T                     Tilt         垂直方向上的移动     -5 ~  90
PTZ-Z                     Zoom         变焦                 1 ~  32

PTZ Facade

com-ptz-facade -scen hikvision -pan    129
com-ptz-facade -scen hikvision -tilt    -4
com-ptz-facade -scen hikvision -zoom     1

Scenario : HIKVISION

com-ptz-scen-hikvision -pan    129
com-ptz-scen-hikvision -tilt    -4
com-ptz-scen-hikvision -zoom     1

comInit

#define PZT_CMD_TILT_UP            (21)    // 云台以SS的速度上仰
#define PZT_CMD_TILT_DOWN          (22)    // 云台以SS的速度下俯
#define PZT_CMD_PAN_LEFT           (23)    // 云台以SS的速度左转
#define PZT_CMD_PAN_RIGHT          (24)    // 云台以SS的速度右转
#define PZT_CMD_UP_LEFT            (25)    // 云台以SS的速度上仰和左转
#define PZT_CMD_UP_RIGHT           (26)    // 云台以SS的速度上仰和右转
#define PZT_CMD_DOWN_LEFT          (27)    // 云台以SS的速度下俯和左转
#define PZT_CMD_DOWN_RIGHT         (28)    // 云台以SS的速度下俯和右转
#define PZT_CMD_PAN_AUTO           (29)    // 云台以SS的速度左右自动扫描

#define PTZ_REAL_PLAY_START        (0)     // 云台开始动作
#define PTZ_REAL_PLAY_STOP         (1)     // 云台停止动作

LOCAL_DEVICE_INFO gDeviceInfo;
LONG gRealPlayHandle;

void comInit() {
	NET_DVR_Init();
	memset(&gDeviceInfo, 0x00, sizeof(LOCAL_DEVICE_INFO));
}

comLogin

BOOL comLogin(CString comDevIp, INT comDevPort = 8000, CString comUser, CString comPwd)
{
	NET_DVR_DEVICEINFO_V30 tmpDeviceInfo;
	memset(&tmpDeviceInfo, 0x00, sizeof(NET_DVR_DEVICEINFO_V30));
	
	gDeviceInfo.lLoginID = NET_DVR_Login_V30(comDevIp.GetBuffer(comDevIp.GetLength()), comDevPort, comUser.GetBuffer(comUser.GetLength()), comPwd.GetBuffer(comPwd.GetLength()), &tmpDeviceInfo);
	if (-1 == gDeviceInfo.lLoginID) {
		DWORD dwLastError = NET_DVR_GetLastError();
		return FALSE;
	}
	gDeviceInfo.iDeviceChanNum = tmpDeviceInfo.byChanNum;    // 模拟通道个数
    gDeviceInfo.iIPChanNum     = tmpDeviceInfo.byIPChanNum;  // 最大数字通道个数,低位
    gDeviceInfo.iStartChan     = tmpDeviceInfo.byStartChan;  // 起始通道号
    gDeviceInfo.iIPStartChan   = tmpDeviceInfo.byStartDChan; // 起始数字通道号, 0表示无效
	return TRUE;
}

comControl

void StartPlay(int iChanIndex)
{
	NET_DVR_CLIENTINFO tmpClientInfo;
	memset(&tmpClientInfo, 0x00, sizeof(NET_DVR_CLIENTINFO));
	
	tmpClientInfo.hPlayWnd     = GetDlgItem(IDC_STATIC_PLAY)->m_hWnd;
	tmpClientInfo.lChannel     = 1;
	tmpClientInfo.lLinkMode    = 0;
	tmpClientInfo.sMultiCastIP = NULL;
	
	gRealPlayHandle = NET_DVR_RealPlay_V30(gDeviceInfo.lLoginID, &tmpClientInfo, NULL, NULL, TRUE);
	if (-1 == gRealPlayHandle) {
		DWORD err = NET_DVR_GetLastError();
	}
	m_bIsPlaying = TRUE;
}

BOOL ProcessControl(DWORD dwPTZCommand, DWORD dwSpeed)
{
	BOOL ret = NET_DVR_PTZControlWithSpeed(gRealPlayHandle, dwPTZCommand, PTZ_REAL_PLAY_STOP, dwSpeed);
	if (!ret) {
		DWORD dwLastError = NET_DVR_GetLastError();
		return FALSE;
	}
	return TRUE;
}

void StopPlay() {
	NET_DVR_StopRealPlay(gRealPlayHandle);
}
BOOL ProcessControl(DWORD dwPTZCommand, DWORD dwSpeed)
{
	LONG lChannel = 1;
	BOOL ret = NET_DVR_PTZControlWithSpeed_Other(gDeviceInfo.lLoginID, lChannel, dwPTZCommand, PTZ_REAL_PLAY_STOP, dwSpeed);
	if (!ret) {
		DWORD dwLastError = NET_DVR_GetLastError();
		return FALSE;
	}
	return TRUE;
}

comLogout

void comLogout()
{
	NET_DVR_Logout_V30(gDeviceInfo.lLoginID);
}

parseCommand

INT parseCommand(CString cmdString) {
	INT result = 0;

	if (0 == cmdString.CompareNoCase(_T("TILT-UP"))) {
		result = TILT_UP;
	}
	if (0 == cmdString.CompareNoCase(_T("TILT-DOWN"))) {
		result = TILT_DOWN;
	}
	if (0 == cmdString.CompareNoCase(_T("PAN-LEFT"))) {
		result = PAN_LEFT;
	}
	if (0 == cmdString.CompareNoCase(_T("PAN-RIGHT"))) {
		result = PAN_RIGHT;
	}

	if (0 == cmdString.CompareNoCase(_T("UP-LEFT"))) {
		result = UP_LEFT;
	}
	if (0 == cmdString.CompareNoCase(_T("UP-RIGHT"))) {
		result = UP_RIGHT;
	}
	if (0 == cmdString.CompareNoCase(_T("PAN-AUTO"))) {
		result = PAN_AUTO;
	}
	if (0 == cmdString.CompareNoCase(_T("DOWN-LEFT"))) {
		result = DOWN_LEFT;
	}
	if (0 == cmdString.CompareNoCase(_T("DOWN-RIGHT"))) {
		result = DOWN_RIGHT;
	}

	if (0 == cmdString.CompareNoCase(_T("ZOOM-IN"))) {
		result = ZOOM_IN;
	}
	if (0 == cmdString.CompareNoCase(_T("ZOOM-OUT"))) {
		result = ZOOM_OUT;
	}
	if (0 == cmdString.CompareNoCase(_T("FOCUS-NEAR"))) {
		result = FOCUS_NEAR;
	}
	if (0 == cmdString.CompareNoCase(_T("FOCUS-FAR"))) {
		result = FOCUS_FAR;
	}

	return result;
}

Scenario : DAHUA

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值