C#物联网调用摄像头进行截图,录像等功能

开始做题前需要引用以下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 ();
        }

需要源码的去资源下载

猜你喜欢

转载自blog.csdn.net/weixin_44790046/article/details/102567333