From eaca7781cde6332ac721976e207f4abf1811f0a5 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Fri, 19 Feb 2021 17:15:18 +0100 Subject: [PATCH] test reverse trasformata punti --- Thermo.Cam.Setup/MainForm.Designer.cs | 7 -- Thermo.Cam.Setup/MainForm.cs | 30 +++--- Thermo.Cam.Utils/DiscoveryHelper.cs | 87 ++++++++-------- Thermo.Cam.Utils/PerspTrans.cs | 122 +++++++++++++++++++++++ Thermo.Cam.Utils/PerspectiveTransform.cs | 70 ------------- Thermo.Cam.Utils/TCContr.cs | 15 ++- Thermo.Cam.Utils/Thermo.Cam.Utils.csproj | 2 +- 7 files changed, 197 insertions(+), 136 deletions(-) create mode 100644 Thermo.Cam.Utils/PerspTrans.cs delete mode 100644 Thermo.Cam.Utils/PerspectiveTransform.cs diff --git a/Thermo.Cam.Setup/MainForm.Designer.cs b/Thermo.Cam.Setup/MainForm.Designer.cs index c99caf01..e08f7a28 100644 --- a/Thermo.Cam.Setup/MainForm.Designer.cs +++ b/Thermo.Cam.Setup/MainForm.Designer.cs @@ -119,13 +119,6 @@ this.disconnectToolStripMenuItem.Text = "Disconnect"; this.disconnectToolStripMenuItem.Click += new System.EventHandler(this.disconnectToolStripMenuItem_Click); // - // openToolStripMenuItem - // - this.openToolStripMenuItem.Name = "openToolStripMenuItem"; - this.openToolStripMenuItem.Size = new System.Drawing.Size(133, 22); - this.openToolStripMenuItem.Text = "Open..."; - this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); - // // cameraToolStripMenuItem // this.cameraToolStripMenuItem.Enabled = false; diff --git a/Thermo.Cam.Setup/MainForm.cs b/Thermo.Cam.Setup/MainForm.cs index 5feabee0..55f46d10 100644 --- a/Thermo.Cam.Setup/MainForm.cs +++ b/Thermo.Cam.Setup/MainForm.cs @@ -352,18 +352,6 @@ namespace Thermo.Cam.Setup { } - private void openToolStripMenuItem_Click(object sender, EventArgs e) - { - using (var dialog = new OpenFileDialog()) - { - dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + @"\FLIR"; - dialog.Filter = FileFilter; - if (dialog.ShowDialog() != DialogResult.OK) return; - var playback = new PlaybackForm(dialog.FileName); - playback.Show(); - } - } - private void pictureBox1_Click(object sender, EventArgs e) { // calcolo la ratio img originale --> pictureBox @@ -379,7 +367,23 @@ namespace Thermo.Cam.Setup { } // trasformo punto in equivalente originale var mea = (MouseEventArgs)e; - ThermoCamCont.lastPoint = new Point() { X = (int)(mea.X / ratio), Y = (int)(mea.Y / ratio) }; + var clickPoint = new Point() { X = (int)(mea.X / ratio), Y = (int)(mea.Y / ratio) }; + // se sono nell'immagine originale + if (showOrigBig) + { + ThermoCamCont.lastPoint = clickPoint; + } + else + { + // altrimenti antitrasformata... + List point2fix = new List(); + point2fix.Add(clickPoint); + var revPoint = ThermoCamCont.reversePoint(point2fix); + if (revPoint.Count > 0) + { + ThermoCamCont.lastPoint = revPoint[0]; + } + } lblPoint.Text = $"({mea.X},{mea.Y}) --> ({ThermoCamCont.lastPoint.X},{ThermoCamCont.lastPoint.Y})"; if (pointSetup) { diff --git a/Thermo.Cam.Utils/DiscoveryHelper.cs b/Thermo.Cam.Utils/DiscoveryHelper.cs index bcee76c5..3e44ff57 100644 --- a/Thermo.Cam.Utils/DiscoveryHelper.cs +++ b/Thermo.Cam.Utils/DiscoveryHelper.cs @@ -22,7 +22,7 @@ namespace Thermo.Cam.Utils protected List discoveredDevices = new List(); - protected Timer timerAutoconnect = new Timer(); + protected System.Timers.Timer timerAutoconnect = new System.Timers.Timer(); #endregion Protected Fields @@ -91,54 +91,11 @@ namespace Thermo.Cam.Utils } } - private void DiscoveryForm_FormClosing(object sender, FormClosingEventArgs e) - { - Stop(); - } - - private void DiscoveryForm_Load(object sender, EventArgs e) - { - Start(); - timerAutoconnect.Start(); - } - private void RemoveDevice(CameraDeviceInfo cameraDeviceInfo) { discoveredDevices.Remove(cameraDeviceInfo); } - private void Start() - { - Stop(); - _discovery = new Discovery(); - _discovery.DeviceFound += _discovery_DeviceFound; - _discovery.DeviceLost += _discovery_DeviceLost; - _discovery.DeviceError += _discovery_DeviceError; - - // Scan for camera devices on all interfaces. If you are only interested in devices from i.e. USB - // then you can start Discovery with the bit-flag Interface.Usb. - - // _discovery.Start(Interface.Usb); - - // or with a combination - // _discovery.Start(Interface.Network | Interface.Usb); - - // Start discovery, scan on all interfaces. - // This requires that Bonjour and the Pleora drivers are installed, see the Atlas web page for more information. - _discovery.Start(); - } - - private void Stop() - { - if (_discovery == null) return; - _discovery.DeviceFound -= _discovery_DeviceFound; - _discovery.DeviceLost -= _discovery_DeviceLost; - _discovery.DeviceError -= _discovery_DeviceError; - // Stop discovery might take some time. Put dispose of discovery on a background thread. - ThreadPool.QueueUserWorkItem(DisposeDiscovery, _discovery); - _discovery = null; - } - private void timerAutoconnect_Tick(object sender, EventArgs e) { timerAutoconnect.Stop(); @@ -159,5 +116,47 @@ namespace Thermo.Cam.Utils } #endregion Private Methods + + #region Public Methods + + public void Start() + { + Stop(); + _discovery = new Discovery(); + _discovery.DeviceFound += _discovery_DeviceFound; + _discovery.DeviceLost += _discovery_DeviceLost; + _discovery.DeviceError += _discovery_DeviceError; + + // Scan for camera devices on all interfaces. If you are only interested in devices from i.e. USB + // then you can start Discovery with the bit-flag Interface.Usb. + + // _discovery.Start(Interface.Usb); + + // or with a combination + // _discovery.Start(Interface.Network | Interface.Usb); + + // Start discovery, scan on all interfaces. + // This requires that Bonjour and the Pleora drivers are installed, see the Atlas web page for more information. + _discovery.Start(); + + // avvio timer... + timerAutoconnect.Start(); + } + + public void Stop() + { + // chiudo timer... + timerAutoconnect.Stop(); + + if (_discovery == null) return; + _discovery.DeviceFound -= _discovery_DeviceFound; + _discovery.DeviceLost -= _discovery_DeviceLost; + _discovery.DeviceError -= _discovery_DeviceError; + // Stop discovery might take some time. Put dispose of discovery on a background thread. + ThreadPool.QueueUserWorkItem(DisposeDiscovery, _discovery); + _discovery = null; + } + + #endregion Public Methods } } \ No newline at end of file diff --git a/Thermo.Cam.Utils/PerspTrans.cs b/Thermo.Cam.Utils/PerspTrans.cs new file mode 100644 index 00000000..1b0f4c9b --- /dev/null +++ b/Thermo.Cam.Utils/PerspTrans.cs @@ -0,0 +1,122 @@ +using OpenCvSharp; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace Thermo.Cam.Utils +{ + public class PerspTrans + { + #region Private Fields + + private Point2f[] dstPoints = new Point2f[] { + new Point2f(600, 0), + new Point2f(0, 0), + new Point2f(0, 400), + new Point2f(600, 400), + }; + + private Point2f[] srcPoints = new Point2f[] { + new Point2f(300, 0), + new Point2f(0, 0), + new Point2f(0, 200), + new Point2f(300, 200), + }; + + #endregion Private Fields + + #region Protected Fields + + protected Mat OriginalImage; + + #endregion Protected Fields + + #region Public Constructors + + public PerspTrans(List _srcPoints, List _dstPoints) + { + srcPoints = convDraw2CV(_srcPoints); + dstPoints = convDraw2CV(_dstPoints); + } + + #endregion Public Constructors + + #region Protected Methods + + /// + /// Conversione array di punti Point2f --> System.Drawings + /// + /// + /// + protected List convCV2Draw(Point2f[] origList) + { + List answ = origList.Select(item => new System.Drawing.Point() { X = (int)item.X, Y = (int)item.Y }).ToList(); + return answ; + } + + /// + /// Conversione array di punti System.Drawings --> Point2f + /// + /// + /// + protected Point2f[] convDraw2CV(List origList) + { + Point2f[] answ = origList.Select(item => new Point2f(item.X, item.Y)).ToArray(); + return answ; + } + + #endregion Protected Methods + + #region Public Methods + + // This is the function that converts IplImage image + // into Bitmap + public static Bitmap MatToBitmap(Mat image) + { + return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image); + } + + public Bitmap convertImage(Bitmap OrigImage, int dimX, int dimY) + { + Bitmap answ = OrigImage; + OriginalImage = OpenCvSharp.Extensions.BitmapConverter.ToMat(OrigImage); + // verifica siano 4 sorgente e 4 dest... + if (srcPoints.Length == 4 && dstPoints.Length == 4) + { + using var matrix = Cv2.GetPerspectiveTransform(srcPoints, dstPoints); + using var dst = new Mat(new OpenCvSharp.Size(dimX, dimY), MatType.CV_8UC3); + Cv2.WarpPerspective(OriginalImage, dst, matrix, dst.Size()); + + answ = MatToBitmap(dst); + } + + return answ; + } + + /// + /// Calcola antitrasformata x il punto dallo spazio di destinazione a quello di origine (secondo matrice di trasformazione) + /// + /// Punto nelle corrd dello spazio DEST + /// + public List getReversedPoint(List reqPointDest) + { + List answ = new List(); + // trasformo + var puntiDest = convDraw2CV(reqPointDest); + if (srcPoints.Length == 4 && dstPoints.Length == 4) + { + using var matrix = Cv2.GetPerspectiveTransform(srcPoints, dstPoints); + var puntiOrig = Cv2.PerspectiveTransform(puntiDest, matrix); + if (puntiOrig.Count() > 0) + { + } + } + + return answ; + } + + #endregion Public Methods + } +} \ No newline at end of file diff --git a/Thermo.Cam.Utils/PerspectiveTransform.cs b/Thermo.Cam.Utils/PerspectiveTransform.cs deleted file mode 100644 index ff68eb5b..00000000 --- a/Thermo.Cam.Utils/PerspectiveTransform.cs +++ /dev/null @@ -1,70 +0,0 @@ -using OpenCvSharp; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; - -namespace Thermo.Cam.Utils -{ - public class PerspectiveTransform - { - Point2f[] srcPoints = new Point2f[] { - new Point2f(0, 0), - new Point2f(0, 0), - new Point2f(0, 0), - new Point2f(0, 0), - }; - - Point2f[] dstPoints = new Point2f[] { - new Point2f(600, 0), - new Point2f(0, 0), - new Point2f(0, 400), - new Point2f(600, 400), - }; - - protected Mat OriginalImage; - - - - public PerspectiveTransform(List _srcPoints, List _dstPoints) - { - srcPoints = convertPoints(_srcPoints); - dstPoints = convertPoints(_dstPoints); - } - - protected Point2f[] convertPoints(List origList) - { - Point2f[] answ = new Point2f[origList.Count]; - for (int i = 0; i < origList.Count; i++) - { - answ[i] = new Point2f(origList[i].X, origList[i].Y); - } - return answ; - } - - public Bitmap convertImage(Bitmap OrigImage, int dimX, int dimY) - { - Bitmap answ = OrigImage; - OriginalImage = OpenCvSharp.Extensions.BitmapConverter.ToMat(OrigImage); - // verifica siano 4 sorgente e 4 dest... - if (srcPoints.Length == 4 && dstPoints.Length == 4) - { - using var matrix = Cv2.GetPerspectiveTransform(srcPoints, dstPoints); - using var dst = new Mat(new OpenCvSharp.Size(dimX, dimY), MatType.CV_8UC3); - Cv2.WarpPerspective(OriginalImage, dst, matrix, dst.Size()); - - answ = MatToBitmap(dst); - } - - return answ; - } - - // This is the function that converts IplImage image - // into Bitmap - public static Bitmap MatToBitmap(Mat image) - { - return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image); - } - } -} diff --git a/Thermo.Cam.Utils/TCContr.cs b/Thermo.Cam.Utils/TCContr.cs index 9fb0d2c6..ca8cfa61 100644 --- a/Thermo.Cam.Utils/TCContr.cs +++ b/Thermo.Cam.Utils/TCContr.cs @@ -315,7 +315,7 @@ namespace Thermo.Cam.Utils { // genero immagine BN sw.Restart(); - var pTransf = new PerspectiveTransform(currConf.OrigPoints.Coords, currConf.DestPoints.Coords); + var pTransf = new PerspTrans(currConf.OrigPoints.Coords, currConf.DestPoints.Coords); var transfImg = pTransf.convertImage(Origin, currConf.TargetSize.X, currConf.TargetSize.Y); GrayTransf = transfImg; sw.Stop(); @@ -622,6 +622,19 @@ namespace Thermo.Cam.Utils ExTime.recordData("GetAllTemperatures", sw.ElapsedMilliseconds); } + /// + /// Calcola punti con antitrasformata prospettica + /// + /// Elenco punti trasformati da invertire + /// + public List reversePoint(List trasfPoints) + { + List answ = trasfPoints; + var pTransf = new PerspTrans(currConf.OrigPoints.Coords, currConf.DestPoints.Coords); + answ = pTransf.getReversedPoint(trasfPoints); + return answ; + } + /// /// Salva su file il file di conf corrente /// diff --git a/Thermo.Cam.Utils/Thermo.Cam.Utils.csproj b/Thermo.Cam.Utils/Thermo.Cam.Utils.csproj index f16cf0e9..9667a61d 100644 --- a/Thermo.Cam.Utils/Thermo.Cam.Utils.csproj +++ b/Thermo.Cam.Utils/Thermo.Cam.Utils.csproj @@ -95,7 +95,7 @@ - +