Skip to content

Commit

Permalink
Update Aardvark.Base packages
Browse files Browse the repository at this point in the history
  • Loading branch information
hyazinthh committed Sep 11, 2024
1 parent 9ac2982 commit 76cbc1e
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 45 deletions.
2 changes: 1 addition & 1 deletion paket.dependencies
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ storage: none
nuget Aardvark.Build ~> 1.0.24
nuget FSharp.Core >= 8.0.0 lowest_matching: true

nuget Aardvark.Base.Tensors ~> 5.3.0
nuget Aardvark.Base.Tensors ~> 5.3.4

nuget OpenCvSharp4 ~> 4.10.0

Expand Down
16 changes: 8 additions & 8 deletions paket.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,23 @@ STORAGE: NONE
RESTRICTION: || (== net8.0) (== netstandard2.0)
NUGET
remote: https://api.nuget.org/v3/index.json
Aardvark.Base (5.3.3)
Aardvark.Base.Telemetry (5.3.3)
Aardvark.Base (5.3.4)
Aardvark.Base.Telemetry (5.3.4)
SingleFileExtractor.Core (>= 2.2.1 < 2.3)
System.Collections.Immutable (>= 8.0)
System.Reflection.Metadata (>= 8.0)
System.Text.Json (>= 8.0.4)
Aardvark.Base.FSharp (5.3.3)
Aardvark.Base (5.3.3)
Aardvark.Base.FSharp (5.3.4)
Aardvark.Base (5.3.4)
Aardvark.Base.TypeProviders (>= 4.5.15 < 4.6)
FSharp.Core (>= 8.0)
FSharp.Data.Adaptive (>= 1.2 < 1.3)
FsPickler (>= 5.3.2 < 5.4)
System.Dynamic.Runtime (>= 4.3 < 4.4)
Aardvark.Base.Telemetry (5.3.3)
Aardvark.Base.Tensors (5.3.3)
Aardvark.Base (5.3.3)
Aardvark.Base.FSharp (5.3.3)
Aardvark.Base.Telemetry (5.3.4)
Aardvark.Base.Tensors (5.3.4)
Aardvark.Base (5.3.4)
Aardvark.Base.FSharp (5.3.4)
FSharp.Core (>= 8.0)
Aardvark.Base.TypeProviders (4.5.15)
FSharp.Core (>= 4.2.3)
Expand Down
6 changes: 2 additions & 4 deletions src/Aardvark.OpenCV.Tests/Benchmarks/ImageBench.fs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
namespace Aardvark.OpenCV.Benchmarks

open Aardvark.Base
open Aardvark.OpenCV
open BenchmarkDotNet.Attributes

module ``Image Processing Benchmarks`` =
Expand All @@ -27,9 +26,8 @@ module ``Image Processing Benchmarks`` =

[<Benchmark(Description = "Aardvark (Tensors)", Baseline = true)>]
member x.AardvarkTensors() =
let volume = Aardvark.Base.TensorExtensions.Scaled(image.Volume, scaleFactor, x.Interpolation)
PixImage<float32>(image.Format, volume)
Aardvark.Base.PixProcessor.Instance.Scale(image, scaleFactor, x.Interpolation)

[<Benchmark>]
member x.OpenCV() =
ImageProcessing.ScaledOpenCV(image, scaleFactor, x.Interpolation)
Aardvark.OpenCV.PixProcessor.Instance.Scale(image, scaleFactor, x.Interpolation)
8 changes: 2 additions & 6 deletions src/Aardvark.OpenCV.Tests/Tests/ImageTests.fs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
namespace Aardvark.OpenCV.Tests

open Aardvark.Base
open Aardvark.OpenCV
open NUnit.Framework
open FsUnit

Expand Down Expand Up @@ -45,11 +44,8 @@ module ``Image Processing Tests`` =
else
pi

let result = ImageProcessing.ScaledOpenCV(src, scaleFactor, filter)

let reference =
let volume = Aardvark.Base.TensorExtensions.Scaled(src.Volume, scaleFactor, filter)
new PixImage<float32>(src.Format, volume)
let result = Aardvark.OpenCV.PixProcessor.Instance.Scale(src, scaleFactor, filter)
let reference = Aardvark.Base.PixProcessor.Instance.Scale(src, scaleFactor, filter)

let psnr = PixImage.peakSignalToNoiseRatio result reference
psnr |> should be (greaterThan 20.0)
61 changes: 35 additions & 26 deletions src/Aardvark.OpenCV/ImageProcessing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,29 +18,10 @@ namespace Aardvark.OpenCV
public void Dispose() => Handle.Free();
}

internal static class PinningExtensions
internal static class Extensions
{
public static GCHandleDiposable Pin(this object obj)
=> new (GCHandle.Alloc(obj, GCHandleType.Pinned));
}

public static class ImageProcessing
{
[OnAardvarkInit]
public static void Init()
{
PixImage<byte>.SetScaledFun(ScaledOpenCV);
PixImage<sbyte>.SetScaledFun(ScaledOpenCV);
PixImage<ushort>.SetScaledFun(ScaledOpenCV);
PixImage<short>.SetScaledFun(ScaledOpenCV);
PixImage<uint>.SetScaledFun(ScaledOpenCV);
PixImage<int>.SetScaledFun(ScaledOpenCV);
PixImage<ulong>.SetScaledFun(ScaledOpenCV);
PixImage<long>.SetScaledFun(ScaledOpenCV);
PixImage<Half>.SetScaledFun(ScaledOpenCV);
PixImage<float>.SetScaledFun(ScaledOpenCV);
PixImage<double>.SetScaledFun(ScaledOpenCV);
}

private static readonly Dictionary<Type, Func<int, MatType>> matTypes = new()
{
Expand All @@ -53,7 +34,7 @@ public static void Init()
{ typeof(double), MatType.CV_64FC },
};

private static MatType ToMatType(this Type type, int channels)
public static MatType ToMatType(this Type type, int channels)
{
if (matTypes.TryGetValue(type, out var toMatType)) return toMatType(channels);
else throw new NotSupportedException($"Channel type {type} is not supported.");
Expand All @@ -67,14 +48,29 @@ private static MatType ToMatType(this Type type, int channels)
{ ImageInterpolation.Lanczos, InterpolationFlags.Lanczos4 },
};

private static InterpolationFlags ToInterpolationFlags(this ImageInterpolation interpolation)
public static InterpolationFlags ToInterpolationFlags(this ImageInterpolation interpolation)
{
if (interpolationFlags.TryGetValue(interpolation, out InterpolationFlags flags)) return flags;
else throw new NotSupportedException($"Filter {interpolation} is not supported.");
}
}

public sealed class PixProcessor : IPixProcessor
{
public string Name => "OpenCV";

public PixProcessorCaps Capabilities => PixProcessorCaps.Scale;

public static Volume<T> ScaledOpenCV<T>(this Volume<T> src, V2d scaleFactor, ImageInterpolation interpolation)
[OnAardvarkInit]
public static void Init()
{
PixImage.AddProcessor(Instance);
}

public PixImage<T> Scale<T>(PixImage<T> image, V2d scaleFactor, ImageInterpolation interpolation)
{
var src = image.Volume;

if (!src.HasImageWindowLayout())
{
throw new ArgumentException($"Volume must be in image layout (Delta = {src.Delta}).");
Expand Down Expand Up @@ -104,10 +100,23 @@ public static Volume<T> ScaledOpenCV<T>(this Volume<T> src, V2d scaleFactor, Ima
var dstMat = CvMat.FromPixelData(dstSize.Y, dstSize.X, matType, dstPtr);
Cv2.Resize(srcMat, dstMat, new Size(dstSize.X, dstSize.Y), interpolation: interpolation.ToInterpolationFlags());

return dst;
return new (image.Format, dst);
}

public static PixImage<T> ScaledOpenCV<T>(this PixImage<T> src, V2d scaleFactor, ImageInterpolation interpolation)
=> new (src.Format, src.Volume.ScaledOpenCV(scaleFactor, interpolation));
public PixImage<T> Rotate<T>(PixImage<T> image, double angleInRadians, bool resize, ImageInterpolation interpolation,
ImageBorderType borderType = ImageBorderType.Const,
T border = default)
=> null;

public PixImage<T> Remap<T>(PixImage<T> image, Matrix<float> mapX, Matrix<float> mapY, ImageInterpolation interpolation,
ImageBorderType borderType = ImageBorderType.Const,
T border = default)
=> null;

private PixProcessor() { }

private static readonly Lazy<PixProcessor> _instance = new(() => new PixProcessor());

public static PixProcessor Instance => _instance.Value;
}
}

0 comments on commit 76cbc1e

Please sign in to comment.