您的位置:首页 > 编程语言 > C#

C# 视频监控系列(7):服务器端——封装API(下)(5)

2009-03-10 10:39 204 查看
/// <summary>

/// 3.6.1.2设置移动侦测区域范围及个数

/// 说 明: 设置运动检测区域;当收到运动信息的数据帧(PktMotionDetection)时,调用

/// MotionAnalyzer;MotionAnalyzer会根据在SetupMotionDetection中的设置来分析每个需要

/// 检测的区域,当某区域的阀值(MotionAnalyzer的iThreshold)到达时,会在返回的区域数组

/// (MotionAnalyzer的iResult)标明最后的判断;矩形框范围是(0,0,703,575)

///

/// int __stdcall SetupMotionDetection(HANDLE hChannelHandle, RECT *RectList, int iAreas)

/// </summary>

/// <param name="hChannelHandle">通道句柄</param>

/// <param name="RectList">矩形框数组</param>

/// <param name="iAreas">矩形框个数,最大值为100</param>

/// <returns>成功返回0;失败返回错误号</returns>

[DllImport("DS40xxSDK.dll")]

public static extern int SetupMotionDetection(IntPtr hChannelHandle, ref Rectangle RectList, int iAreas);

/// <summary>

/// 3.6.1.3移动侦测分析

/// 说 明: 动态监测分析,移动侦测由DSP完成,DSP送出的IPktMotionData帧就是已经

/// 分析好的运动信息,区域的运动分析由主机完成,数据源由码流中的PktMotionData帧提供,

/// 结果在iResult中说明,2.0以上版本的运动分析基于DSP提供的运动强度,不再使用运动

/// 矢量,其灵敏度及可靠性有大幅提高,用户软件可使用由码流提供的运动强度信息来自己分

/// 析或调用该函数来进行区域分析

///

/// 函 数: int __stdcall MotionAnalyzer(HANDLE hChannelHandle, char *MotionData, int iThreshold, int *iResult)

/// </summary>

/// <param name="hChannelHandle">通道句柄</param>

/// <param name="MotionData">运动矢量指针</param>

/// <param name="iThreshold">判断运动程度的伐值</param>

/// <param name="iResult">按照伐值指定的强度分析后的结果数组。数组的大小在SetupMotionDetection的numberOfAreas指定,如果某数组单元的值大于零则表明有该区域有该值表明的运动强度</param>

/// <returns>成功返回0;失败返回错误号 </returns>

[DllImport("DS40xxSDK.dll")]

public static extern int MotionAnalyzer(IntPtr hChannelHandle, char[] MotionData, int iThreshold, ref int iResult);

#endregion

#region 3.6.2设置方式二

/// <summary>

/// 3.6.2.1设置移动侦测(扩展)

/// 说 明: 设置移动侦测,这种设置方式可替代设置方式一中3个函数的共同作用,在这种情况下,DSP将不再反馈移动侦测帧。

/// 参数delay:画面静止之后的延时时间,单位为秒,若在该延时时间内没有产生

/// 移动侦测,则将回调函数MotionDetectionCallback之中的参数bMotionDetected标志为False,

/// 若在该延时时间之内,在当前所设置的区域内产生移动侦测,则bMotionDetected被标志为

/// True,并且在产生移动侦测之后的delay时间内,DSP不会对在此时间段之内的视频帧进行

/// 移动侦测分析,因此DSP和主机都省却了在此时间段对产生的视频运动进行频繁判断和分

/// 析。直至超过了此delay秒延时时间,DSP才会对此时刻的视频进行判断,若产生了移动侦

/// 测,则回调函数中的bMotionDetected被再次标志为True,否则标志为False。

///

///

/// 函 数: int __stdcall SetupMotionDetectionEx(HANDLE hChannelHandle,int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps,UINT delay,RECT *RectList, int iAreas, MOTION_DETECTION_CALLBACK MotionDetectionCallback,int reserved)

/// </summary>

/// <param name="hChannelHandle">通道句柄</param>

/// <param name="iGrade">

/// 运动分析灵敏度等级,取值范围0-6,0级最灵敏,6级最迟钝,

/// 推荐值2。将iGrade和“0x80000000“做”或“操作,会对移动侦测启用

/// 自适应分析。

/// </param>

/// <param name="iFastMotionDetectFps">高速运动检测的帧间隔,取值范围0-12,0表示不作高速运动检测,通常值取为2</param>

/// <param name="iSlowMotionDetectFps">低速运动检测的帧间隔,取值范围13以上,当取值为0时,不作低速运动检测</param>

/// <param name="delay">前一次移动帧测产生后的延时时间</param>

/// <param name="RectList">进行移动侦测的矩形框数组</param>

/// <param name="iAreas">矩形框个数(最大个数为100)</param>

/// <param name="MotionDetectionCallback">移动侦测结果回调函数 </param>

/// <param name="reserved">保留参数</param>

/// <returns>成功返回0;失败返回错误号</returns>

[DllImport("DS40xxSDK.dll")]

public static extern int SetupMotionDetectionEx(IntPtr hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps, uint delay, ref Rectangle RectList, int iAreas, MOTION_DETECTION_CALLBACK MotionDetectionCallback, int reserved);

#endregion

#region 3.6.3启动及停止移动侦测

/// <summary>

/// 3.6.3.1启动移动侦测

/// 说 明: 启动移动侦测。

/// 注意:移动侦测和编码相互独立,用户程序可在不启动编码的情况下进行运动检测

///

/// int __stdcall StartMotionDetection(HANDLE hChannelHandle)

/// </summary>

/// <param name="hChannelHandle">通道句柄</param>

/// <returns>成功返回0;失败返回错误号</returns>

[DllImport("DS40xxSDK.dll")]

public static extern int StartMotionDetection(IntPtr hChannelHandle);

/// <summary>

/// 3.6.3.2停止移动侦测

/// 说 明: 停止移动侦测

///

/// int __stdcall StopMotionDetection(HANDLE hChannelHandle)

/// </summary>

/// <param name="hChannelHandle"></param>

/// <returns></returns>

[DllImport("DS40xxSDK.dll")]

public static extern int StopMotionDetection(IntPtr hChannelHandle);

#endregion

#endregion

#region 3.7视频信息叠加

#region 3.7.1信息叠入视频编码(OSD、LOGO、MASK)

//注意:使用此部分函数时,在录像文件中,包含所叠加的信息

#region 3.7.1.1 OSD

/// <summary>

/// 3.7.1.1.1设置OSD显示模式

///

/// 函 数: int __stdcall SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness, BOOL Translucent, int parameter, USHORT *Format1, USHORT *Format2)

/// </summary>

/// <param name="hChannelHandle">通道句柄</param>

/// <param name="Brightness">OSD显示亮度。0最暗,255最亮</param>

/// <param name="Translucent">OSD图像是否做半透明处理</param>

/// <param name="parameter">Bit0:是否自动进行颜色翻转 Bit16-23垂直放大倍数 Bit24-31水平 </param>

/// <param name="Format1">描述字符叠加的位置和次序的格式</param>

/// <param name="Format2"></param>

#region USHORT *Forma1, *Format2

//USHORT *Forma1, *Format2

//描述字符叠加的位置和次序的格式串,具体定义如下:

//USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN, NULL

// 其中X,Y 是该字串在标准4CIF图象的起始位置,X必须是16的倍数,Y可以在图

//象高度内取值即(0-575)PAL 、(0-479)NTSC;CHARN也是USHORT型的参数,可以

//是ASCII码也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值

//如下:

//_OSD_YEAR4 四位的年显示,如2004

//_OSD_YEAR2 两位的年显示,如02

//_OSD_MONTH3 英文的月显示,如 Jan

//_OSD_MONTH2 两位阿拉伯数字的月显示,如07

//_OSD_DAY 两位的阿拉伯数字的日显示,如31

//_OSD_WEEK3 英文的星期显示,如Tue

//_OSD_CWEEK1 中文的星期显示,如星期二

// _OSD_HOUR24 24小时的时钟显示,如18

//_OSD_HOUR12 12小时的时钟显示,如AM09或PM09

//_OSD_MINUTE 两位分钟的显示

//_OSD_SECOND 两位秒的显示

//在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容。

//字符串和时间显示可以在FORMAT1 也可以在FORMAT2,也可以混合在一起,但不得超

//过一行4CIF 图象的宽度。

//例如:

//要显示位置在16,19的字符串“办公室”的格式字符串如下:

// USHORT Format[] = {16, 19, ‘办’,’公’,’室’, ‘\0’};

//要显示位置在8, 3的时间字符串可以如下:

// USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY,

//‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘\0’};

//如果只想显示其中一行,则将起始的字符串定义如下:

// USHORT FormatNoDisplay[]={0, 0, ‘\0’};

//返回值: 成功返回0;失败返回错误号

//说 明: OSD字符中,ASCII字符的标准分辨率为8×16,汉字的标准分辨率为16×16。

//由于在编码之前需要对原始图像进行缩小才能产生编码所需的分辨率,此时为了保证在

//缩小后的编码图像上能够看清OSD字符,就需要先把OSD字符放大以后再叠加在4CIF的

//原始图像上。

//如果不指定放大倍数(采用默认设置),则系统会根据该通道录像的分辨率自动设置,

//这样在任何分辨率下都可以保证回放时能够看清OSD内容,但是这会导致OSD的大小和位

//置在原始图像中不固定。

//为了避免上面的现象,用户可以指定OSD的大小。例如,如果应用程序想以CIF、DCIF、

//2CIF、4CIF的分辨率录像,这时候可以将放大系数设为2、2,此时OSD的位置始终固定,

//但在不同的编码分辨率下,OSD字符的分辨率也不同,所以需要特别注意。如果此时使用

//QCIF录像,则OSD字符会变得模糊不清(因为QCIF要对图像进行1/4缩小,而对OSD

//字符只进行了2倍的放大)。具体配置详见下表:

//水平放大倍数 垂直放大倍数 适合的录像分辨率 说明

//1 1 4CIF 其它分辨率下会模糊

//1 2 2CIF 小于2CIF时无法分辩

//2 2 CIF、DCIF QCIF时无法分辩

//4 4 QCIF 在其它分辨率下字符会很大

//任意系数为0 自动设置(默认值)

//其它无效值 按水平2、垂直2处理

//注意:因为字符的位置会随着不同的录像分辨率而改变,在位置改变后,某些OSD字符的

//位置可能会超出图像的范围,此时这些字符将无法显示,但系统并不会返回错误。

#endregion

/// <returns></returns>

[DllImport("DS40xxSDK.dll")]

public static extern int SetOsdDisplayMode(IntPtr hChannelHandle, int Brightness, bool Translucent, int parameter, ushort[] Format1, ushort[] Format2);

/// <summary>

/// 3.7.1.1.2设置OSD显示模式(扩展)

/// 说 明: 此函数为SetOsdDisplayMode的扩展,SetOsdDisplayModeEx函数支持最多8行OSD字符串的显示。

///

/// int __stdcall SetOsdDisplayModeEx(HANDLE hChannelHandle,int color, BOOL Translucent,int param,int nLineCount,USHORT **Format)

/// </summary>

/// <param name="hChannelHandle">通道句柄</param>

/// <param name="Brightness">OSD显示亮度。0最暗,255最亮</param>

/// <param name="Translucent">OSD图像是否做半透明处理</param>

/// <param name="param">Bit0:是否自动进行颜色翻转 Bit16-23垂直放大倍数 Bit24-31水平放大倍数</param>

/// <param name="nLineCount">OSD显示的行数,最多为8行</param>

/// <param name="Format">多行字符显示

/// USHORT **Format;多行字符显示,描述字符叠加的位置和次序的格式串,

/// 其中每一行的第一元素X和第二元素Y 是该字串在标准4CIF图象的起始位置,X必须是

/// 16的倍数,Y可以在图象高度内取值即(0-575)PAL 、(0-479)NTSC;可以是ASCII码

/// 也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值如下:

/// _OSD_YEAR4 四位的年显示,如2004

/// _OSD_YEAR2 两位的年显示,如02

/// _OSD_MONTH3 英文的月显示,如 Jan

/// _OSD_MONTH2 两位阿拉伯数字的月显示,如07

/// _OSD_DAY 两位的阿拉伯数字的日显示,如31

/// _OSD_WEEK3 英文的星期显示,如Tue

/// _OSD_CWEEK1 中文的星期显示,如星期二

/// _OSD_HOUR24 24小时的时钟显示,如18

/// _OSD_HOUR12 12小时的时钟显示,如AM09或PM09

/// _OSD_MINUTE 两位分钟的显示

/// _OSD_SECOND 两位秒的显示

/// 在格式字符串的每一行最后一个元素必须以NULL(0)结尾,否则会显示错误的内容。

/// 返回值: 成功返回0;失败返回错误号。

/// 说 明: 此函数为SetOsdDisplayMode的扩展,SetOsdDisplayModeEx函数支持最多8行

/// OSD字符串的显示。

/// </param>

/// <returns>成功返回0;失败返回错误号</returns>

[DllImport("DS40xxSDK.dll")]

public static extern int SetOsdDisplayModeEx(IntPtr hChannelHandle, int Brightness, bool Translucent, int param, int nLineCount, char[] Format);

/// <summary>

/// 3.7.1.1.3设置OSD显示

/// 说 明: 设置OSD显示,将当前的系统时间年月日星期时分秒等信息叠加在视频之上,并可作透明处理。

///

/// int __stdcall SetOsd(HANDLE hChannelHandle, BOOL Enable)

/// </summary>

/// <param name="hChannelHandle">通道句柄</param>

/// <param name="Enable">OSD是否显示</param>

/// <returns>成功返回0;失败返回错误号</returns>

[DllImport("DS40xxSDK.dll")]

public static extern int SetOsd(IntPtr hChannelHandle, bool Enable);

#endregion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐