C# 封装SDK 获取摄像头的水平角度和垂直角度

本文介绍如何使用C#实现对摄像头水平和垂直角度的控制,通过调用NET_DVR_GetDVRConfig函数并解决参数转换问题,实现了从C++到C#的跨平台移植。

最近需要做一个C#版本的控制终端,控制摄像头,获取摄像头的水平角度和垂直角度

获取当前摄像头的角度,需要调用一个名为NET_DVR_GetDVRConfig的bool类型的函数

在C++中,函数定义:NET_DVR_GetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel, LPVOID lpOutBuffer, DWORD dwOutBufferSize, LPDWORD lpBytesReturned)

在C#封装过程中,函数改为:

[DllImport(@"HCNetSDK.dll")]
public static extern bool NET_DVR_GetDVRConfig(int lUserID, uint dwCommand, int lChannel, IntPtr lpOutBuffer, uint dwOutBufferSize, ref uint lpBytesReturned);

在调用的过程中,主要是第四个参数的转换遇到了问题

首先看一下C++Demo里面的函数用法:

 1  NET_DVR_PTZPOS m_ptzPos = {0};
 2     DWORD dwReturned;
 3     BOOL bRet = NET_DVR_GetDVRConfig(m_lUserID[m_struSlaveCameraCond.byID], NET_DVR_GET_PTZPOS, 0, &m_ptzPos, sizeof(NET_DVR_PTZPOS), &dwReturned);
 4     if (!bRet)
 5     {
 6         g_pMainDlg->AddLog(m_iDeviceIndex, OPERATION_FAIL_T, "NET_DVR_GET_PTZPOS");
 7         return;
 8     }
 9 
10     int m_iPara1 = HexToDecMa(m_ptzPos.wPanPos);
11     int m_iPara2 = HexToDecMa(m_ptzPos.wTiltPos);
12     int m_iPara3 = HexToDecMa(m_ptzPos.wZoomPos);
C++获取角度

首先结构体实例化 ,传入对应的参数,返回bool类型的值,值为True时,获取结构体里面的值

在c#中,传递的第四个参数的类型由LPVOID 类型的转化为了IntPtr类型的

首先两篇文档:Marshal.StructureToPtr方法Marshal.PtrToStructure方法

 了解了Intptr与架构体之间的相互转化,就好处理了,代码如下:

1   //首先获取当前结构体的长度
2             int nSizeOfPtz = Marshal.SizeOf(Ptz);
3             //定义一个IntPtr类型的数据
4             IntPtr intPtr = Marshal.AllocHGlobal(nSizeOfPtz);
5             DevideAngle = CHCNetSDK.NET_DVR_GetDVRConfig(_mLUserId, CHCNetSDK.NET_DVR_GET_PTZPOS, 0, intPtr, (uint)nSizeOfPtz, ref dwReturned);
6             //IntPtr数据转换成Struct结构体
7             Ptz = (CHCNetSDK.NET_DVR_PTZPOS)Marshal.PtrToStructure(intPtr, typeof(CHCNetSDK.NET_DVR_PTZPOS));
8             Pan = HexToDecMa(Ptz.wPanPos);
9             Tit = HexToDecMa(Ptz.wTiltPos);
C#获取角度

 

转载于:https://www.cnblogs.com/Liu30/p/7601684.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值