From 1f17a18600e4e69f8f2dc4707e0e50b45d2546ba Mon Sep 17 00:00:00 2001 From: Canming Huang Date: Fri, 5 Apr 2024 17:09:51 -0400 Subject: [PATCH] Minor optimization using Span. --- Emgu.CV.Models/Dnn/DetectedObject.cs | 7 +++++++ Emgu.CV.Models/Dnn/SceneTextDetector.cs | 4 ++++ Emgu.CV.OCR/Tesseract.cs | 4 ++++ Emgu.CV.Platform/Emgu.CV.Bitmap/BitmapExtension.cs | 3 +-- Emgu.CV/Imgproc/Subdiv2D.cs | 4 ++++ Emgu.CV/Objdetect/HOGDescriptor.cs | 5 +++++ 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Emgu.CV.Models/Dnn/DetectedObject.cs b/Emgu.CV.Models/Dnn/DetectedObject.cs index e45ae7199..5389953da 100644 --- a/Emgu.CV.Models/Dnn/DetectedObject.cs +++ b/Emgu.CV.Models/Dnn/DetectedObject.cs @@ -123,9 +123,16 @@ namespace Emgu.CV.Models regions, confThreshold, nmsThreshold); +#if UNSAFE_ALLOWED + var classIdArr = classIds.GetSpan(); + var confidentArr = confidents.GetSpan(); + var regionArr = regions.GetSpan(); +#else var classIdArr = classIds.ToArray(); var confidentArr = confidents.ToArray(); var regionArr = regions.ToArray(); + +#endif List results = new List(); for (int i = 0; i < classIdArr.Length; i++) { diff --git a/Emgu.CV.Models/Dnn/SceneTextDetector.cs b/Emgu.CV.Models/Dnn/SceneTextDetector.cs index 978faf70c..0880b91ab 100644 --- a/Emgu.CV.Models/Dnn/SceneTextDetector.cs +++ b/Emgu.CV.Models/Dnn/SceneTextDetector.cs @@ -232,7 +232,11 @@ namespace Emgu.CV.Models _textDetector.Detect(image, vvp, confidents); Point[][] detectionResults = vvp.ToArrayOfArray(); +#if UNSAFE_ALLOWED + var confidentResult = confidents.GetSpan(); +#else float[] confidentResult = confidents.ToArray(); +#endif List results = new List(); for (int i = 0; i < detectionResults.Length; i++) { diff --git a/Emgu.CV.OCR/Tesseract.cs b/Emgu.CV.OCR/Tesseract.cs index 75918458c..73dada65c 100644 --- a/Emgu.CV.OCR/Tesseract.cs +++ b/Emgu.CV.OCR/Tesseract.cs @@ -503,7 +503,11 @@ namespace Emgu.CV.OCR OcrInvoke.cveTessBaseAPIExtractResult(_ptr, textSeq, results); byte[] bytes = textSeq.ToArray(); +#if UNSAFE_ALLOWED + var trs = results.GetSpan(); +#else TesseractResult[] trs = results.ToArray(); +#endif Word[] res = new Word[trs.Length]; int idx = 0; diff --git a/Emgu.CV.Platform/Emgu.CV.Bitmap/BitmapExtension.cs b/Emgu.CV.Platform/Emgu.CV.Bitmap/BitmapExtension.cs index cea09b759..ea411b091 100644 --- a/Emgu.CV.Platform/Emgu.CV.Bitmap/BitmapExtension.cs +++ b/Emgu.CV.Platform/Emgu.CV.Bitmap/BitmapExtension.cs @@ -813,8 +813,7 @@ namespace Emgu.CV Bitmap result = new Bitmap(s.Width, s.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imaging.BitmapData data = result.LockBits(new Rectangle(Point.Empty, result.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, result.PixelFormat); - using (Image tmp = new Image(s.Width, s.Height, data.Stride, data.Scan0) - ) + using (Image tmp = new Image(s.Width, s.Height, data.Stride, data.Scan0)) { cudaImage.Download(tmp); } diff --git a/Emgu.CV/Imgproc/Subdiv2D.cs b/Emgu.CV/Imgproc/Subdiv2D.cs index 77af511ad..03f165f7e 100644 --- a/Emgu.CV/Imgproc/Subdiv2D.cs +++ b/Emgu.CV/Imgproc/Subdiv2D.cs @@ -124,7 +124,11 @@ namespace Emgu.CV CvInvoke.cveSubdiv2DGetVoronoiFacetList(_ptr, vi, facetVec, centerVec); PointF[][] vertices = facetVec.ToArrayOfArray(); +#if UNSAFE_ALLOWED + var centers = centerVec.GetSpan(); +#else PointF[] centers = centerVec.ToArray(); +#endif VoronoiFacet[] facets = new VoronoiFacet[centers.Length]; for (int i = 0; i < facets.Length; i++) diff --git a/Emgu.CV/Objdetect/HOGDescriptor.cs b/Emgu.CV/Objdetect/HOGDescriptor.cs index a4fcf48e9..28bf007cd 100644 --- a/Emgu.CV/Objdetect/HOGDescriptor.cs +++ b/Emgu.CV/Objdetect/HOGDescriptor.cs @@ -114,8 +114,13 @@ namespace Emgu.CV { ObjdetectInvoke.cveHOGDescriptorDetectMultiScale(_ptr, iaImage, vr, vd, hitThreshold, ref winStride, ref padding, scale, finalThreshold, useMeanshiftGrouping); +#if UNSAFE_ALLOWED + var location = vr.GetSpan(); + var weight = vd.GetSpan(); +#else Rectangle[] location = vr.ToArray(); double[] weight = vd.ToArray(); +#endif MCvObjectDetection[] result = new MCvObjectDetection[location.Length]; for (int i = 0; i < result.Length; i++) {