{"id":50028414,"url":"https://github.com/sn4k3/emguextensions","last_synced_at":"2026-05-30T20:00:54.075Z","repository":{"id":353601002,"uuid":"1199999905","full_name":"sn4k3/EmguExtensions","owner":"sn4k3","description":"EmguCV Extensions for C#","archived":false,"fork":false,"pushed_at":"2026-05-29T22:44:03.000Z","size":1253,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T23:04:57.052Z","etag":null,"topics":["computer-vision","emgu","emgucv","extensions-csharp","image-processing","opencv"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sn4k3.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["sn4k3"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["https://www.paypal.com/donate/?hosted_button_id=3F9DKDNPWEYR6"]}},"created_at":"2026-04-02T23:46:21.000Z","updated_at":"2026-05-29T22:43:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sn4k3/EmguExtensions","commit_stats":null,"previous_names":["sn4k3/emguextensions"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sn4k3/EmguExtensions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sn4k3%2FEmguExtensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sn4k3%2FEmguExtensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sn4k3%2FEmguExtensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sn4k3%2FEmguExtensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sn4k3","download_url":"https://codeload.github.com/sn4k3/EmguExtensions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sn4k3%2FEmguExtensions/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33707328,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["computer-vision","emgu","emgucv","extensions-csharp","image-processing","opencv"],"created_at":"2026-05-20T17:49:25.178Z","updated_at":"2026-05-30T20:00:54.069Z","avatar_url":"https://github.com/sn4k3.png","language":"C#","funding_links":["https://github.com/sponsors/sn4k3","https://www.paypal.com/donate/?hosted_button_id=3F9DKDNPWEYR6"],"categories":[],"sub_categories":[],"readme":"# [![Logo](https://raw.githubusercontent.com/sn4k3/EmguExtensions/main/media/EmguExtensions-32.png)](#) EmguExtensions\n\n[![License](https://img.shields.io/github/license/sn4k3/EmguExtensions?style=for-the-badge)](https://github.com/sn4k3/EmguExtensions/blob/master/LICENSE)\n[![GitHub repo size](https://img.shields.io/github/repo-size/sn4k3/EmguExtensions?style=for-the-badge)](#)\n[![Code size](https://img.shields.io/github/languages/code-size/sn4k3/EmguExtensions?style=for-the-badge)](#)\n[![NuGet](https://img.shields.io/nuget/v/EmguExtensions?style=for-the-badge)](https://www.nuget.org/packages/EmguExtensions)\n[![GitHub Sponsors](https://img.shields.io/github/sponsors/sn4k3?color=red\u0026style=for-the-badge)](https://github.com/sponsors/sn4k3)\n\nA high-performance .NET library that extends [Emgu.CV](https://www.emgu.com) (OpenCV wrapper) with span-based `Mat` accessors, ROI utilities, pluggable Mat compression, structured contour hierarchies, and drawing helpers.\n\n## Features\n\n- **Span-based Mat access** - Zero-copy `GetSpan\u003cT\u003e`, `GetSpan2D\u003cT\u003e`, and `GetReadOnlySpan2D\u003cT\u003e` accessors for fast pixel manipulation\n- **ROI utilities** - `Roi`, `SafeRoi` (clamped), and `RoiFromCenter` for safe region-of-interest cropping\n- **Image transforms** - Rotate with adjusted bounds, letterbox creation, crop-by-bounds, and shrink-to-fit resizing that reports whether the image changed\n- **Mat compression** - Pluggable compressors (PNG, Deflate, GZip, ZLib, Brotli, Zstd) with `CMat` for memory-efficient compressed image storage. `CMat.Compress` is thread-safe — concurrent calls are serialized automatically\n- **Contour hierarchies** - Structured `EmguContour`, `EmguContours`, and `EmguContourFamily` wrappers for OpenCV contour trees using hierarchy links\n- **Drawing helpers** - Polygon geometry, multi-line text rendering with alignment, SVG path generation, and predefined colors\n- **Disposal infrastructure** - `DisposableObject`, `LeaveOpenDisposableObject`, and `GCSafeHandle` for thread-safe resource management\n\n## Requirements\n\n- [.NET 10](https://dotnet.microsoft.com/download) or later\n- [Emgu.CV](https://www.nuget.org/packages/Emgu.CV) Latest\n\n## Installation\n\n### NuGet Package Manager\n\n```\nInstall-Package EmguExtensions\n```\n\n### .NET CLI\n\n```bash\ndotnet add package EmguExtensions\n```\n\n## Quick Start\n\n### Span-Based Mat Access\n\n```csharp\nusing EmguExtensions;\nusing Emgu.CV;\nusing Emgu.CV.CvEnum;\n\n// Create or load a Mat\nusing var mat = new Mat(100, 100, DepthType.Cv8U, 1);\n\n// Zero-copy span access for fast pixel reads/writes\nvar span = mat.GetSpan\u003cbyte\u003e();\nspan[0] = 255; // Set first pixel\n\n// 2D span access\nvar span2D = mat.GetSpan2D\u003cbyte\u003e();\nspan2D[10, 20] = 128; // Row 10, Col 20\n```\n\n### Safe ROI Cropping\n\n```csharp\nusing var source = CvInvoke.Imread(\"image.png\");\n\n// SafeRoi clamps to mat bounds - never throws on out-of-range coordinates\nusing var roi = source.SafeRoi(new Rectangle(-10, -10, 200, 200));\n```\n\n### Image Sizing and Transforms\n\n```csharp\n// Create a fixed-size letterboxed image. targetWidth and targetHeight must be positive.\nusing var boxed = source.CreateLetterBox(640, 480, out float scale, out int padX, out int padY);\n\n// Shrink only when the image exceeds the target bounds. Returns true when resized.\nbool wasShrunk = source.ShrinkToFitPreserveAspect(1024, 768);\n\n// Output overloads populate dst even when no resize/rotation is needed.\nusing var resized = new Mat();\nbool resizedWasShrunk = source.ShrinkToFitPreserveAspect(resized, 1024, 768);\n\nusing var rotated = new Mat();\nsource.RotateAdjustBounds(rotated, angle: 30);\n```\n\n### Mat Compression with CMat\n\n```csharp\nusing EmguExtensions;\n\n// Compress a Mat for memory-efficient storage\nvar cmat = new CMat();\ncmat.Compress(mat); // Auto-selects best storage (compressed or raw)\n\n// Decompress back to Mat — caller owns and must dispose the returned Mat\nusing var restored = cmat.Decompress();\n\n// Use a specific compressor and level\ncmat.Compressor = MatCompressorBrotli.Instance;\ncmat.CompressionLevel = CompressionLevel.SmallestSize;\ncmat.Compress(mat);\n\n// Compress(Mat) and Compress(MatRoi) are thread-safe — safe to call from multiple threads\nParallel.ForEach(frames, (frame, _, i) =\u003e\n{\n    using var mat = frame.ToMat();\n    compressedFrames[i].Compress(mat);\n});\n\n// Switch compressor and re-encode existing data in one step\ncmat.ChangeCompressor(MatCompressorDeflate.Instance, reEncodeWithNewCompressor: true);\n\n// Equality is hash-based (XxHash3) — O(1) for mismatches, fast for collections\nbool same = cmat1 == cmat2;\n```\n\n### Contour Hierarchy\n\n```csharp\nusing EmguExtensions;\n\n// Find contours with full hierarchy\nusing var contours = new EmguContours(binaryImage, RetrType.Tree);\n\n// Iterate contour families (tree roots)\nforeach (var family in contours.Families)\n{\n    Console.WriteLine($\"Area: {family.Self.Area}, Children: {family.Count}\");\n    // Even depth = solid fill; odd depth = hole/cavity\n}\n```\n\n### Drawing Helpers\n\n```csharp\nusing EmguExtensions;\n\n// Generate regular polygon vertices\nvar hexVertices = DrawingExtensions.GetPolygonVertices(6, new SizeF(50, 50), new PointF(100, 100));\n\n// Multi-line text with alignment\nmat.PutTextExtended(\"Line 1\\nLine 2\\nLine 3\",\n    new Point(50, 50),\n    FontFace.HersheyComplex,\n    1.0,\n    EmguExtensions.WhiteColor,\n    lineAlignment: PutTextLineAlignment.Center);\n```\n\n## Available Compressors\n\n| Compressor | Class | Description |\n|---|---|---|\n| None | `MatCompressorNone` | No compression (raw bytes) |\n| PNG | `MatCompressorPng` | PNG image encoding via OpenCV |\n| Deflate | `MatCompressorDeflate` | Deflate stream compression |\n| GZip | `MatCompressorGZip` | GZip stream compression |\n| ZLib | `MatCompressorZLib` | ZLib stream compression |\n| Brotli | `MatCompressorBrotli` | Brotli stream compression |\n| Zstd | `MatCompressorZstd` | Zstandard compression (.NET 11+) |\n\nAll compressors are singletons accessed via `Instance` (e.g., `MatCompressorBrotli.Instance`).  \n\n`CMat` automatically falls back to raw (uncompressed) storage when:\n- The source is smaller than `ThresholdToCompress` (default 512 bytes), or\n- Compression produces a result larger than the original.\n\n## Benchmarks\n\n### Compressor benchmark\n```\nBenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.8246/25H2/2025Update/HudsonValley2)\nAMD Ryzen 9 7845HX with Radeon Graphics 3.00GHz, 1 CPU, 24 logical and 12 physical cores\n.NET SDK 10.0.203\n  [Host]     : .NET 10.0.7 (10.0.7, 10.0.726.21808), X64 RyuJIT x86-64-v4\n  Job-MTJJIS : .NET 10.0.7 (10.0.7, 10.0.726.21808), X64 RyuJIT x86-64-v4\n\nMaxIterationCount=16\n\n| Method     | MatSize | CompressorName | Level         | Mean        | Error       | StdDev      | Gen0     | Gen1     | Gen2     | Allocated |\n|----------- |-------- |--------------- |-------------- |------------:|------------:|------------:|---------:|---------:|---------:|----------:|\n| Compress   | 1920    | Brotli         | NoCompression |    318.3 us |    14.55 us |    14.29 us |        - |        - |        - |    3200 B |\n| Compress   | 1920    | Brotli         | Fastest       |    332.3 us |    54.77 us |    53.79 us |        - |        - |        - |    2816 B |\n| Compress   | 1920    | None           | NoCompression |    337.8 us |    11.88 us |    11.66 us | 194.3359 | 194.3359 | 194.3359 | 3686483 B |\n| Compress   | 1920    | Deflate        | Fastest       |    636.3 us |    55.72 us |    54.73 us |   1.9531 |        - |        - |   45744 B |\n| Compress   | 1920    | GZip           | Fastest       |    638.2 us |    28.39 us |    27.88 us |   2.4414 |        - |        - |   45792 B |\n| Compress   | 1920    | ZLib           | Fastest       |    640.3 us |    49.51 us |    48.62 us |   2.4414 |        - |        - |   45784 B |\n| Compress   | 1920    | GZip           | NoCompression |    769.6 us |    13.23 us |    12.38 us | 276.3672 | 276.3672 | 276.3672 | 3688281 B |\n| Compress   | 1920    | ZLib           | NoCompression |    770.1 us |    27.85 us |    27.35 us | 284.1797 | 284.1797 | 284.1797 | 3688256 B |\n| Compress   | 1920    | Deflate        | NoCompression |    862.5 us |    14.73 us |    13.78 us | 280.2734 | 280.2734 | 280.2734 | 3688228 B |\n| Compress   | 1920    | Deflate        | Optimal       |  1,303.5 us |    42.47 us |    41.71 us |   0.9766 |        - |        - |   23512 B |\n| Compress   | 1920    | GZip           | Optimal       |  1,305.6 us |    93.40 us |    91.74 us |        - |        - |        - |   23568 B |\n| Compress   | 1920    | ZLib           | Optimal       |  1,353.0 us |    67.70 us |    66.49 us |        - |        - |        - |   23552 B |\n| Compress   | 1920    | Brotli         | Optimal       |  4,997.6 us |   181.04 us |   177.80 us |        - |        - |        - |    1313 B |\n| Compress   | 1920    | GZip           | SmallestSize  |  8,240.1 us |   397.06 us |   389.97 us |        - |        - |        - |   15552 B |\n| Compress   | 1920    | ZLib           | SmallestSize  |  8,380.9 us |   372.70 us |   366.04 us |        - |        - |        - |   15536 B |\n| Compress   | 1920    | Deflate        | SmallestSize  |  8,492.4 us |   427.02 us |   419.39 us |        - |        - |        - |   15504 B |\n| Compress   | 1920    | PNG            | Fastest       | 15,511.5 us | 1,415.48 us | 1,390.19 us |        - |        - |        - |   25736 B |\n| Compress   | 1920    | PNG            | NoCompression | 15,571.9 us |   654.92 us |   643.22 us | 375.0000 | 375.0000 | 375.0000 | 3694733 B |\n| Compress   | 1920    | PNG            | Optimal       | 16,101.5 us |   679.06 us |   666.93 us |        - |        - |        - |   25496 B |\n| Compress   | 1920    | PNG            | SmallestSize  | 35,974.1 us | 2,452.16 us | 2,408.35 us |        - |        - |        - |    9280 B |\n| Compress   | 1920    | Brotli         | SmallestSize  | 66,692.0 us | 9,677.48 us | 9,504.58 us |        - |        - |        - |     692 B |\n|            |         |                |               |             |             |             |          |          |          |           |\n| Decompress | 1920    | Deflate        | SmallestSize  |    113.4 us |     1.35 us |     1.19 us |        - |        - |        - |     280 B |\n| Decompress | 1920    | Deflate        | Fastest       |    119.7 us |     2.57 us |     2.52 us |        - |        - |        - |     280 B |\n| Decompress | 1920    | Deflate        | Optimal       |    123.6 us |     3.56 us |     3.50 us |        - |        - |        - |     280 B |\n| Decompress | 1920    | Deflate        | NoCompression |    145.0 us |     2.05 us |     1.82 us |        - |        - |        - |     280 B |\n| Decompress | 1920    | None           | NoCompression |    147.1 us |     1.93 us |     1.71 us |        - |        - |        - |         - |\n| Decompress | 1920    | ZLib           | Fastest       |    157.1 us |     1.58 us |     1.32 us |        - |        - |        - |     312 B |\n| Decompress | 1920    | GZip           | Fastest       |    161.6 us |     2.30 us |     1.92 us |        - |        - |        - |     312 B |\n| Decompress | 1920    | GZip           | Optimal       |    162.2 us |     2.07 us |     1.93 us |        - |        - |        - |     312 B |\n| Decompress | 1920    | GZip           | SmallestSize  |    168.2 us |     8.01 us |     7.86 us |        - |        - |        - |     312 B |\n| Decompress | 1920    | ZLib           | Optimal       |    177.4 us |     1.59 us |     1.41 us |        - |        - |        - |     312 B |\n| Decompress | 1920    | GZip           | NoCompression |    182.6 us |     1.61 us |     1.50 us |        - |        - |        - |     312 B |\n| Decompress | 1920    | ZLib           | SmallestSize  |    197.6 us |     8.23 us |     8.08 us |        - |        - |        - |     312 B |\n| Decompress | 1920    | ZLib           | NoCompression |    225.5 us |    13.96 us |    13.71 us |        - |        - |        - |     312 B |\n| Decompress | 1920    | Brotli         | NoCompression |  1,560.4 us |    24.39 us |    21.62 us |        - |        - |        - |         - |\n| Decompress | 1920    | Brotli         | Fastest       |  2,107.5 us |   267.52 us |   262.74 us |        - |        - |        - |         - |\n| Decompress | 1920    | Brotli         | SmallestSize  |  2,354.4 us |    49.89 us |    49.00 us |        - |        - |        - |         - |\n| Decompress | 1920    | Brotli         | Optimal       |  3,384.4 us |   254.81 us |   250.26 us |        - |        - |        - |         - |\n| Decompress | 1920    | PNG            | Fastest       |  6,079.8 us |    39.73 us |    35.22 us |        - |        - |        - |      88 B |\n| Decompress | 1920    | PNG            | Optimal       |  6,120.8 us |    43.09 us |    38.19 us |        - |        - |        - |      88 B |\n| Decompress | 1920    | PNG            | NoCompression |  6,830.0 us |    47.14 us |    44.09 us |        - |        - |        - |      88 B |\n| Decompress | 1920    | PNG            | SmallestSize  |  8,797.8 us |    39.41 us |    34.94 us |        - |        - |        - |      88 B |\n```\n\n### Mat.ToArray() benchmark\n\n```\nBenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.8246/25H2/2025Update/HudsonValley2)\nAMD Ryzen 9 7845HX with Radeon Graphics 3.00GHz, 1 CPU, 24 logical and 12 physical cores\n.NET SDK 10.0.202\n  [Host]     : .NET 10.0.6 (10.0.6, 10.0.626.17701), X64 RyuJIT x86-64-v4\n  DefaultJob : .NET 10.0.6 (10.0.6, 10.0.626.17701), X64 RyuJIT x86-64-v4\n\n\n| Method                | MatSize | Mean       | Error    | StdDev   | Ratio | RatioSD | Gen0     | Gen1     | Gen2     | Allocated | Alloc Ratio |\n|---------------------- |-------- |-----------:|---------:|---------:|------:|--------:|---------:|---------:|---------:|----------:|------------:|\n| GetRawData            | 1920    |   617.7 us |  6.08 us |  5.08 us |  0.99 |    0.04 | 999.0234 | 999.0234 | 999.0234 |   3.52 MB |        1.00 |\n| GetSpan.ToArray       | 1920    |   623.8 us | 10.47 us |  9.28 us |  1.00 |    0.05 | 999.0234 | 999.0234 | 999.0234 |   3.52 MB |        1.00 |\n| 'ToArray (extension)' | 1920    |   626.5 us | 11.84 us | 28.15 us |  1.00 |    0.06 | 999.0234 | 999.0234 | 999.0234 |   3.52 MB |        1.00 |\n|                       |         |            |          |          |       |         |          |          |          |           |             |\n| 'ToArray (extension)' | 3840    | 1,444.4 us | 28.81 us | 32.02 us |  1.00 |    0.03 | 500.0000 | 500.0000 | 500.0000 |  14.06 MB |        1.00 |\n| GetSpan.ToArray       | 3840    | 1,551.3 us | 16.07 us | 15.04 us |  1.07 |    0.02 | 500.0000 | 500.0000 | 500.0000 |  14.06 MB |        1.00 |\n| GetRawData            | 3840    | 1,582.3 us | 21.02 us | 19.66 us |  1.10 |    0.03 | 500.0000 | 500.0000 | 500.0000 |  14.06 MB |        1.00 |\n```\n\n## Project Structure\n\n```\nEmguExtensions/\n  Extensions/\n    EmguExtensions.cs           # Mat span accessors, ROI, copy, transforms, drawing, shrink-to-fit\n    EmguExtensions.Constants.cs # Predefined colors, anchor, shared stream manager\n    EmguExtensions.Static.cs    # Text measurement, kernel creation, Mat factories\n    DrawingExtensions.cs        # Color scaling, polygon geometry and vertices\n    PointExtensions.cs          # Euclidean distance, rotation around a pivot\n    ArrayExtensions.cs          # High-performance uninitialized-memory array copy\n    StreamExtensions.cs         # MemoryStream.ToArrayPerf — copy buffer without zero-init\n    CompressionExtensions.cs    # CompressionLevel enum mapping (0–3 → enum)\n    StaticObjects.cs            # Internal: line-break character constants\n  MatCompressor/\n    MatCompressor.cs            # Abstract base — template method, async overloads\n    MatCompressor.None.cs       # Raw (uncompressed) passthrough\n    MatCompressor.Png.cs        # PNG via OpenCV Imdecode/Imencode\n    MatCompressor.Deflate.cs    # Deflate stream\n    MatCompressor.GZip.cs       # GZip stream\n    MatCompressor.ZLib.cs       # ZLib stream\n    MatCompressor.Brotli.cs     # Brotli stream\n    MatCompressor.Zstd.cs       # Zstandard stream (.NET 11+)\n    CMat.cs                     # Compressed Mat — thread-safe Compress, XxHash3 equality\n  Contours/\n    EmguContour.cs              # Single contour wrapper (lazy bounds, area, perimeter, disposal guards)\n    EmguContours.cs             # Contour collection with hierarchy-link tree and grouping helpers\n    EmguContourFamily.cs        # Tree node: Self, Depth, Parent, Count/children traversal\n  Handlers/\n    DisposableObject.cs         # Abstract full Dispose pattern base with atomic dispose guard\n    LeaveOpenDisposableObject.cs # Dispose with leave-open semantics\n    GCSafeHandle.cs             # SafeHandle wrapper for GCHandle pinning\n  Strides/\n    GreyLine.cs                 # Straight run of pixels with the same grey value (line scan)\n    GreyStride.cs               # Contiguous pixel run with index, location, and grey value\n  MatRoi.cs                     # ROI crop with optional per-edge padding\n  Enums/\n    PutTextLineAlignment.cs     # None | Left | Center | Right for PutTextExtended\nEmguExtensions.Tests/           # xUnit test suite\n  MatFactory.cs                 # Shared Mat helpers for tests\n  UnitTestCMat.cs               # CMat compression/decompression tests\n  UnitTestCMatThreadSafety.cs   # CMat concurrent Compress thread-safety tests\n  UnitTestEmguContours.cs       # Contour hierarchy tests\n  UnitTestEmguExtensions.cs     # Extension method tests\n  UnitTestFindMethods.cs        # Pixel-find method tests\n  UnitTestMatRoi.cs             # MatRoi crop and padding tests\n  UnitTestScanMethods.cs        # Scan/stride method tests\nEmguExtensions.Benchmarks/      # BenchmarkDotNet performance benchmarks\n  MatCompressorBenchmarks.cs    # Compress/Decompress measurements across compressors and levels\n  MatToArrayBenchmarks.cs       # Mat-to-array conversion micro-benchmarks\n  RedundantCompressorLevelFilter.cs # Filter to skip redundant compressor/level pairs\n  Program.cs                    # Benchmark runner entry point\n```\n\n## Building from Source\n\n```bash\n# Restore and build\ndotnet restore\ndotnet build\n\n# Run tests\ndotnet test EmguExtensions.Tests\n\n# Pack for NuGet (Release only)\ndotnet pack EmguExtensions --configuration Release --output .\n```\n\n## Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsn4k3%2Femguextensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsn4k3%2Femguextensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsn4k3%2Femguextensions/lists"}