using OpenCVForUnity.CoreModule; using OpenCVForUnity.ImgprocModule; using System; using UnityEngine; using UnityEngine.Serialization; namespace OpenCVForUnity.UnityUtils.Helper { /// /// Image optimization helper. /// v 1.1.0 /// public class ImageOptimizationHelper : MonoBehaviour { /// /// The downscale ratio. /// [SerializeField, FormerlySerializedAs("downscaleRatio"), TooltipAttribute("Set the ratio of down scaling.")] protected float _downscaleRatio = 2f; public float downscaleRatio { get { return _downscaleRatio; } set { _downscaleRatio = Mathf.Clamp(value, 1f, float.MaxValue); } } /// /// The frame skipping ratio. /// [SerializeField, FormerlySerializedAs("frameSkippingRatio"), TooltipAttribute("Set the ratio of frame skipping.")] protected int _frameSkippingRatio = 2; public int frameSkippingRatio { get { return _frameSkippingRatio; } set { _frameSkippingRatio = (int)Mathf.Clamp(value, 1f, float.MaxValue); } } /// /// The frame count. /// protected int frameCount = 0; /// /// The downscale frame mat. /// protected Mat downScaleFrameMat; protected void OnValidate() { _downscaleRatio = Mathf.Clamp(_downscaleRatio, 1f, float.MaxValue); _frameSkippingRatio = (int)Mathf.Clamp(_frameSkippingRatio, 1f, float.MaxValue); } /// /// Indicates whether the current frame is skipped. /// /// true, if the current frame is skipped, false otherwise. public virtual bool IsCurrentFrameSkipped() { frameCount++; return (frameCount % frameSkippingRatio != 0) ? true : false; } /// /// Gets the mat that downscaled the original mat. /// if downscaleRatio == 1 , return originalMat. /// /// The downscale mat. /// Original mat. public virtual Mat GetDownScaleMat(Mat originalMat) { if (Mathf.Approximately(_downscaleRatio, 1f)) return originalMat; if (downScaleFrameMat == null) downScaleFrameMat = new Mat(); Imgproc.resize(originalMat, downScaleFrameMat, new Size(), 1.0 / _downscaleRatio, 1.0 / _downscaleRatio, Imgproc.INTER_LINEAR); return downScaleFrameMat; } /// /// To release the resources for the initialized method. /// public virtual void Dispose() { frameCount = 0; if (downScaleFrameMat != null) { downScaleFrameMat.Dispose(); downScaleFrameMat = null; } } } }