From 993edfb76afa1adcc3a4d7086f5148ab761bbf6c Mon Sep 17 00:00:00 2001 From: Canming Huang Date: Sat, 6 May 2023 16:21:42 -0400 Subject: [PATCH] Fix issue #834 Mat.GetData does not respect the ROI --- Emgu.CV.Test/AutoTestMatrix.cs | 21 +++++++++++++++++++++ Emgu.CV/Core/Mat.cs | 11 ++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Emgu.CV.Test/AutoTestMatrix.cs b/Emgu.CV.Test/AutoTestMatrix.cs index 1a855e7f64..96de27f3ec 100644 --- a/Emgu.CV.Test/AutoTestMatrix.cs +++ b/Emgu.CV.Test/AutoTestMatrix.cs @@ -13,6 +13,7 @@ using System.Xml; using System.Xml.Linq; using Emgu.CV; +using Emgu.CV.CvEnum; using Emgu.CV.Structure; using Emgu.Util; @@ -62,6 +63,26 @@ public void TestGetData() EmguAssert.IsTrue(data2[i, j] == data[i, j]); } + using (Mat m = new Mat( + data.GetLength(0), + data.GetLength(1), + DepthType.Cv32F, + 1, + dataHandle.AddrOfPinnedObject(), + data.GetLength(1) * Marshal.SizeOf() + )) + using (Mat m3 = new Mat(m, new Rectangle(1, 1, m.Width-1, m.Height-1))) + { + float[,] data2 = m.GetData(true) as float[,]; + for (int i = 0; i < data2.GetLength(0); i++) + for (int j = 0; j < data2.GetLength(1); j++) + EmguAssert.IsTrue(data2[i, j] == data[i, j]); + + float[,] data3 = m3.GetData(true) as float[,]; + for (int i = 0; i < data3.GetLength(0); i++) + for (int j = 0; j < data3.GetLength(1); j++) + EmguAssert.IsTrue(data3[i, j] == data[i + 1, j + 1]); + } dataHandle.Free(); } diff --git a/Emgu.CV/Core/Mat.cs b/Emgu.CV/Core/Mat.cs index 5bfb661eb0..b638a56f46 100644 --- a/Emgu.CV/Core/Mat.cs +++ b/Emgu.CV/Core/Mat.cs @@ -412,7 +412,16 @@ public Array GetData(bool jagged = true) } GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned); - CvInvoke.cveMemcpy(handle.AddrOfPinnedObject(), DataPointer, byteSize); + using (Mat dst = new Mat( + this.Size, + this.Depth, + this.NumberOfChannels, + handle.AddrOfPinnedObject(), + byteSize / Height)) + { + this.CopyTo(dst); + } + handle.Free(); return array; }