Helper.cs 6.8 KB
using OpenCvSharp;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;

namespace OS.Spin.Common
{
    public class Helper
    {
        ///// <summary>
        ///// 检查图片是否存在
        ///// </summary>
        ///// <param name="filePath"></param>
        //public static void CheckExist(object filePath)
        //{
        //    if (!File.Exists(filePath.ToString()))
        //    {
        //        Cache.GetInstance().SaveCount++;
        //    }
        //}

        public static double GetProcessUsedMemory()
        {
            double usedMemory = 0;
            usedMemory = Process.GetCurrentProcess().WorkingSet64 / 1024.0 / 1024.0;
            return usedMemory;
        }
        #region 清理非托管资源
        [System.Runtime.InteropServices.DllImport("Kernel32")]
        private extern static Boolean CloseHandle(IntPtr handle);
        #endregion

        #region 
        [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
        public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
        /// <summary>
        /// 释放内存
        /// </summary>
        public static void ClearMemory()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
            {
                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
            }
        }
        #endregion

        /// <summary>
        /// 通过传入的图片计算增益值
        /// </summary>
        /// <param name="imagePath"></param>
        /// <returns></returns>
        public static int GetGainValue(string imagePath)
        {
            try
            {
                Rect re = new Rect(new OpenCvSharp.Point(1100, 50), new OpenCvSharp.Size(200, 200));
                Mat imageRoi = null;
                Mat _cameraMat = null;
                Mat _mat = new Mat(imagePath);
                if (_mat.Channels() == 3)
                {
                    _cameraMat = new Mat(_mat, re);
                    imageRoi = new Mat(200, 200, MatType.CV_8UC3);
                    Cv2.CvtColor(_cameraMat, imageRoi, ColorConversionCodes.BGR2GRAY);
                }
                else
                {
                    imageRoi = new Mat(_mat, re);
                }
                int gainResult = 0;
                double avgGain = Cv2.Mean(imageRoi).Val0;
                int th_max = 230, th_min = 130, th_mid = 180;
                if (avgGain > th_mid)
                {
                    if (avgGain > th_max)
                        avgGain = th_max;
                    gainResult = 20 - (int)((avgGain - th_mid) / 5);
                }
                else
                {
                    if (avgGain < th_min)
                        avgGain = th_min;
                    gainResult = 20 + (int)((th_mid - avgGain) / 5);
                }
                //imageRoi.Release();
                //_cameraMat.Release();
                //_mat.Release();
                return gainResult;
            }
            catch (Exception ex)
            {
                LogisTrac.WriteLog(string.Format("GetGainValue(string imagePath):{0}", ex.Message));
                return 0;
            }
        }

        /// <summary>
        /// 通过传入的图片计算增益值
        /// </summary>
        /// <param name="_mat"></param>
        /// <returns></returns>
        public static int GetGainValue(Mat _mat)
        {
            try
            {
                Rect re = new Rect(new OpenCvSharp.Point(1100, 50), new OpenCvSharp.Size(200, 200));
                Mat imageRoi = null;
                Mat _cameraMat = null;
                if (_mat.Channels() == 3)
                {
                    _cameraMat = new Mat(_mat, re);
                    imageRoi = new Mat(200, 200, MatType.CV_8UC3);
                    Cv2.CvtColor(_cameraMat, imageRoi, ColorConversionCodes.BGR2GRAY);
                }
                else
                {
                    imageRoi = new Mat(_mat, re);
                }
                int gainResult = 0;
                double avgGain = Cv2.Mean(imageRoi).Val0;
                int th_max = 230, th_min = 130, th_mid = 180;
                if (avgGain > th_mid)
                {
                    if (avgGain > th_max)
                        avgGain = th_max;
                    gainResult = 20 - (int)((avgGain - th_mid) / 5);
                }
                else
                {
                    if (avgGain < th_min)
                        avgGain = th_min;
                    gainResult = 20 + (int)((th_mid - avgGain) / 5);
                }
                //imageRoi.Release();
                //_cameraMat.Release();
                return gainResult;
            }
            catch (Exception ex)
            {
                LogisTrac.WriteLog(string.Format("GetGainValue(Mat _mat):{0}", ex.Message));
                return 0;
            }
        }

        /// <summary>
        /// 普通图片获取增益值(非Mat)
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static int GetGain(string filePath)
        {
            try
            {
                double[] a = new double[3] { 0, 0, 0 };
                Bitmap curBitmap = (Bitmap)System.Drawing.Image.FromFile(filePath);
                int wide = curBitmap.Width;
                int height = curBitmap.Height;
                Color srcColor;
                double RR = 0;
                double GG = 0;
                double BB = 0;

                for (int y3 = 50; y3 < (50 + 200); y3++)
                {
                    for (int x3 = 1100; x3 < (1100 + 200); x3++)
                    {
                        srcColor = curBitmap.GetPixel(x3, y3);
                        RR = RR + srcColor.R;
                        GG = GG + srcColor.G;
                        BB = BB + srcColor.B;
                    }
                }
                a[0] = Math.Round(RR / (1100 * 50), 2);
                double mean_gain = a[0];
                int th_max = 230, th_min = 130, th_mid = 180;
                if (mean_gain > th_mid)
                {
                    if (mean_gain > th_max)
                        mean_gain = th_max;
                    return 20 - (int)((mean_gain - th_mid) / 5);
                }
                else
                {
                    if (mean_gain < th_min)
                        mean_gain = th_min;
                    return 20 + (int)((th_mid - mean_gain) / 5);
                }
            }
            catch (Exception ex)
            {
                LogisTrac.WriteLog(string.Format("GetGain(string filePath):{0}", ex.Message));
                return 0;
            }
        }
    }
}