Camera.cs 4.5 KB
using Asa.Camera;
using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore
{
    public class HIKCamera
    {
        Thread camerathread;
        Asa.Camera.VisionLib camera;
        public string Name = "";
        public event EventHandler<Bitmap> camera_event;
        public string DeviceName = "monitor1";
        public void LoadCameraConfig()
        {
            string path = @".\StoreConfig\Camera.json";
            if (!File.Exists(path))
            {
                LogUtil.error(Name + "找不到监控相机配置文件" + path);
                return;
            }
            try
            {
                var configtxt = File.ReadAllText(path);
                if (configtxt.IndexOf("Pwd") > 0)
                {
                    configtxt = configtxt.Replace("Pwd", "Password");
                    configtxt = configtxt.Replace("\"8000\"", "8000");
                    File.WriteAllText(path, configtxt);
                }
                var m = Regex.Match(configtxt, "name\".*?\"(.+)\"", RegexOptions.IgnoreCase);
                DeviceName = m.Groups[1].Value;
                camera = new VisionLib(path, "HIK.IPCamera");
            }
            catch (Exception e)
            {
                LogUtil.error(Name + "加载监控相机配置文件失败:" + e.ToString());
                return;
            }
            camera.Open(DeviceName);
            Bitmap bmp = camera.GetImage(DeviceName);
            if (bmp == null)
            {
                LogUtil.error(Name + $"监控相机打开失败");
            }
            camerathread = new Thread(new ThreadStart(startCamera));
            camerathread.Start();
            GC.KeepAlive(camerathread);

        }
        int errortimes = 0;
        void startCamera()
        {
            while (true)
            {
                try
                {
                    Bitmap bmp = camera.GetImage(DeviceName);
                    if (bmp != null)
                    {
                        errortimes = 0;
                        camera_event?.Invoke(this, bmp);
                    }
                    else if (bmp == null && errortimes < 5)
                    {
                        errortimes++;
                        LogUtil.error(Name + $"相机获取图像出错,{errortimes}");
                    }
                    else if (errortimes == 5)
                    {
                        camera.Open();
                        errortimes++;
                        LogUtil.error(Name + $"相机错误次数过多,重新打开,{errortimes}");
                    }
                    else if (errortimes == 6)
                    {
                        LogUtil.error(Name + $"相机连接失败, 相机线程退出,{errortimes}");
                        break;
                    }
                    Thread.Sleep(1000 / 7);
                }
                catch
                {
                    errortimes++;
                }
            }
            camera.Close();
            camera.Dispose();
        }
        void CameraGrabOne(string filename)
        {
            try
            {
                LogUtil.info(Name + "库位文件名:" + filename);
                Bitmap bmp = camera.GetImage(DeviceName);
                if (bmp != null)
                {
                    if (File.Exists(filename))
                        File.Delete(filename);

                    bmp.Save(filename, ImageFormat.Jpeg);
                    bmp.Dispose();
                }
            }
            catch (Exception e)
            {
                LogUtil.error(Name + e.ToString());
            }
        }
        string GetFixtureStateFilename(InOutStoreParam inOutParam,StoreMoveType storeMoveType, FixtureState fixtureState)
        {
            string dir = $"\\image\\Fixture\\{storeMoveType}\\{inOutParam.PositionNum}\\";
            Directory.CreateDirectory(dir);
            string filename = $"{inOutParam.WareNumber}@@{fixtureState}.jpg";
            foreach (var x in Path.GetInvalidFileNameChars())
            {
                filename = filename.Replace(x.ToString(), "");
            }
            return dir + filename;
        }
        enum FixtureState
        {
            In,
            Up,
            Down,
            Out
        }
    }
}