用海康的DS-4004HC板卡做监控,采用C#语言,设备监控与控制方面使用OPC
OPC不再重复,好简单的。DS-4004HC板卡做监控参考达人的系列帖子,基本不用变动,原帖地址如下:
http://www.cnblogs.com/over140/archive/2009/04/07/1429308.html
这里要说的是关于移动侦测的方面,这点在原文中并没有提及,这里专门做这方面的介绍:
首先,移动侦测有两种方法:
Rectangle[] areaList
=
new
Rectangle[
1
];
Rectangle rect
=
new
Rectangle(
0
,
0
,
700
,
500
);
//
因为pdf里说“DS400C的矩形框范围是(0,0,703,575)”
areaList[
0
]
=
rect;
(1)
Code
MOTION_DETECTION_CALLBACK mdc;
mdc = new MOTION_DETECTION_CALLBACK(MOTION_DETECTION_CALLBACK1);//注册移动侦测回调
HikVisionSDK.SetupMotionDetectionEx(ChannelHandle_Vedio, 2, 2, 0, 10, areaList, areaList.Length, mdc, 0);
(2)
HikVisionSDK.AdjustMotionDetectPrecision(ChannelHandle_Vedio,
2
,
2
,
0
);
HikVisionSDK.SetupMotionDetection(ChannelHandle_Vedio, areaList, areaList.Length);
然后在回调STREAM_DIRECT_READ_CALLBACK1(int channelNum, IntPtr DataBuf, int Length, FrameType_t frameType, IntPtr context)里添加:
int
[] result
=
new
int
[
1
];HikVisionSDK.MotionAnalyzer(ChannelHandle_Vedio, DataBuf,
20
, result);
每个函数的用法与说明看看那个大哥的DS40xxSDK.cs和海康的pdf里面写的很清晰地.
(3)当然别忘里开启移动侦测哦:HikVisionSDK.StartMotionDetection(ChannelHandle_Vedio);
可是不知道什么原因,按理说方案一比较简单,只要设置回调然后注册,接着启动移动侦测就好,可惜的是,每次当我出发后,处理完会叫后(回调里什么都没干),就会报错说DS40xxSDK.dll里异常结果崩溃,我想了半天也不知道哪里错了,也跟踪不进去,也许用VC做是正常的吧,又或者我哪里设置错了,但pdf里就是这样的,可惜海康demo程序没用到这个。解决此问题的大哥可以告诉我,学习下
于是乎,采用了方案二,毕竟然家海康demo里用的就是这个。事实证明用第二方案果然不报错了
把那位大哥的STREAM_DIRECT_READ_CALLBACK1回调修改下,加入移动侦测部分就搞定了,效果不错(代码内其他函数的说明,请看那个系列文章作者的说明):
Code
//该函数主要是通过MP4_ServerWriteDataEx将数据写入内存(文档注释:往发送缓存写数据。)和用_write写文件做存储视频录像。
public int STREAM_DIRECT_READ_CALLBACK1(int channelNum, IntPtr DataBuf, int Length, FrameType_t frameType, IntPtr context)
{
int status = 0;
if (frameType > 0)
{
if (frameType == FrameType_t.PktSysHeader)
{
FileHeader = new byte[Length];
Marshal.Copy(DataBuf, FileHeader, 0, Length);
FileHeaderLen = Length;
}
if (frameType == FrameType_t.PktIFrames || frameType == FrameType_t.PktSubIFrames)
status = 1;
else
status = 0;
/*if (frameType == FrameType_t.PktMotionDetection || frameType == FrameType_t.PktOrigImage)
return 0;*/
if (frameType == FrameType_t.PktOrigImage)
return 0;
if (frameType == FrameType_t.PktMotionDetection)
{
int[] result = new int[1];
HikVisionSDK.MotionAnalyzer(ChannelHandle_Vedio, DataBuf, 20, result);
if (result[0] > 0)
{
isMotion = true;
}
else
isMotion = false;
return 0;
}
}
if (Length == 0)
{
//TRACE("no data ?\n");
return 0;
}
if (frameType == FrameType_t.PktAudioFrames)
{
if (isMotion)//判断是否处于运动状态
{
WriterVideoCapture(Length, DataBuf);//写入录像文件
}
//写文件
// _write(gFileHandleQcif[channelNum],DataBuf,Length);
//HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 1);
// _write(gFileHandle[channelNum], DataBuf, Length);
HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
}
else if (frameType == FrameType_t.PktSubIFrames || frameType == FrameType_t.PktSubPFrames || frameType == FrameType_t.PktSubBBPFrames || frameType == FrameType_t.PktSubSysHeader)
{
// _write(gFileHandleQcif[channelNum],DataBuf,Length);
HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 1);
}
else
{
WriterVideoCapture(Length, DataBuf);
HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
}
return 0;
}
对了,最后问个问题:怎么在写博客时黏贴代码啊,我看别人的都可以像在MSDN中的效果一样的,而我复制来的,就只是纯文本,我也想有那种效果,这样以后看博客,写博客也方便点!
新增板卡sdk,驱动与demo的下载地址:
http://download.csdn.net/source/1562398