开始做题前需要引用以下DLL库
用WPF窗体搭建这么一个窗口(为了快速实现没有美化界面)
首先将我们用到的命名空间引用一下
using System;
using System.Windows;
using System.Windows.Media.Imaging;
using NLE.Device.ADAM;
using Camera.Net;
using System.Threading;
using System.IO;
写各项功能前我们需要做一下程序的初始化
CameraCapture camera = new CameraCapture ();/*CameraCapture,用于摄像头图像帧的获取*/
CameraPTZ PTZ = new CameraPTZ (); /*CameraPTZ,摄像头云台的通用接口类*/
ADAMSeriesTcp adam = new ADAMSeriesTcp ("172.13.17.16",2001);//串口服务器的IP和TCP端口
VideoFileWriter vd = new VideoFileWriter ();//视频动画实例化
AutoResetEvent a = new AutoResetEvent (false);
Thread timer,timers;
bool stop = true;
byte[] imgbuffer = null;
public MainWindow ()
{
InitializeComponent ();
timer = new Thread (Controls);
timer.IsBackground = true;
timer.Start ();
timers = new Thread (Controls1);
timers.IsBackground = true;
timers.Start ();
PtzControl ();//摄像头初始化
adam.ADAM4150DataReceived += Adam_ADAM4150DataReceived;
CameraCore.Initialize ();
camera.OnFrameChanged += Camera_OnFrameChanged;
adam.Connect ();
camera.SetFrameSize (1280,720);//定义摄像头画布宽高
btnDown.IsEnabled = false;//在无人的状态下按钮不可用
btnUp.IsEnabled = false;
btnRight.IsEnabled = false;
btnLeft.IsEnabled = false;
btnJie.IsEnabled = false;
btnvideo.IsEnabled = false;
}
定义的timers线程实时读取ADAM的数据
private void Controls1 ()//实时获取Adam数据
{
while (true)
{
adam.ReadADAM4150Data ();
}
}
摄像头的数据接收事件
private void Camera_OnFrameChanged (object sender, byte[] buffer)
{
if (buffer.Length > 0)
{
imgbuffer = buffer;
CameraCore.Invoke (() =>
{
BitmapImage b = new BitmapImage ();
b.BeginInit ();
b.CacheOption = BitmapCacheOption.OnLoad;
b.StreamSource = new MemoryStream (buffer);
b.EndInit ();
b.Freeze ();
imgCamera.Source = b;
if (vd.IsOpened)
{
vd.Write (buffer);
}
});
}
}
ADAM的数据接收事件
private void Adam_ADAM4150DataReceived (object sender, ADAM4150EventArgs e)
{
if (e.Data.DI1)
{
Dispatcher.Invoke (() =>
{
lblBody.Content = "有人";
btnJie.IsEnabled = true;
btnDown.IsEnabled = true;
btnUp.IsEnabled = true;
btnRight.IsEnabled = true;
btnLeft.IsEnabled = true;
btnvideo.IsEnabled = true;
});
camera.Open ("rtsp://admin:[email protected]:554/11")/*当人体传感器感受到有人时打开摄像头*/
}
else
{
Dispatcher.Invoke (() =>
{
lblBody.Content = "无人";
imgCamera.Source = null;//无人时不显示图像
btnDown.IsEnabled = false;
btnUp.IsEnabled = false;
btnRight.IsEnabled = false;
btnLeft.IsEnabled = false;
btnJie.IsEnabled = false;
btnvideo.IsEnabled = false;
});
camera.Close ();//关闭摄像头
}
}
摄像头的初始化工作
private void PtzControl ()
{
PTZ.Args = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=[PTZ]";
PTZ.UserName = "admin";
PTZ.Password = "admin";
PTZ.Port = 80;
PTZ.Host = "172.13.17.14";
}
录像功能的实现
private void Controls ()//生成视频
{
while (true)
{
if (stop)
a.WaitOne ();
string path = System.IO.Path.Combine (AppDomain.CurrentDomain.BaseDirectory, DateTime.Now.ToString ("yymmddhhmmss") + ".mp4");
vd.Open (path, 1280, 720, 60, VideoCodes.MPEG4);
Thread.Sleep (5000);
vd.Close ();
}
}
控制摄像头上下左右转动
private void btnUp_Click (object sender, RoutedEventArgs e)
{
PTZ.TurnUp ();
}
private void btnDown_Click (object sender, RoutedEventArgs e)
{
PTZ.TurnDown ();
}
private void btnLeft_Click (object sender, RoutedEventArgs e)
{
PTZ.TurnLeft ();
}
private void btnRight_Click (object sender, RoutedEventArgs e)
{
PTZ.TurnRight ();
}
截图功能的实现方法
private void btnJie_Click (object sender, RoutedEventArgs e)
{
string path = System.IO.Path.Combine ("D:/Image", "人员截图" + DateTime.Now.ToString ("123")+".jpg");
////string path = System.IO.Path.Combine (AppDomain.CurrentDomain.BaseDirectory//代表根目录, "人员截图" + DateTime.Now.ToString ("123123") + ".jpg");
File.WriteAllBytes (path, imgbuffer);
}
录像按钮的Click事件
private void btnvideo_Click (object sender, RoutedEventArgs e)
{
stop = false;
a.Set ();
}
需要源码的去资源下载