public void BinaryDilation3x3Test1() { string basePath = NUnit.Framework.TestContext.CurrentContext.TestDirectory; #region doc_binary_dilation_3x3 // Let's start with one of the default // color test images in the framework: var test = new TestImages(basePath); // Let's get Lena's picture Bitmap bmp = test["lena.bmp"]; // And transform it to a binary mask // using Niblack's threshold class var niblack = new NiblackThreshold(); Bitmap binary = niblack.Apply(bmp); // The result can be seen below: // ImageBox.Show(binary); // Now, let's finally apply the dilation // filter to the binarized image below: var dil3x3 = new BinaryDilation3x3(); Bitmap result = dil3x3.Apply(binary); // The result can be seen below: // ImageBox.Show(result); #endregion //result.Save(@"C:\Projects\morpho-dilation3x3-result.png"); //binary.Save(@"C:\Projects\morpho-dilation3x3-binary.png"); }
public mErosionDilation() { BitmapType = mFilter.BitmapTypes.GrayscaleBT709; Effect = new BinaryDilation3x3(); filter = Effect; }
/// <summary> /// Called when videoPlayer receives a new frame. /// </summary> /// <param name="sender"></param> /// <param name="image"></param> private void videoPlayer_NewFrame(object sender, ref Bitmap frame) { if (previousFrame != null) { // find the thresholded euclidian difference between two subsequent frames ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(40); threshold.OverlayImage = previousFrame; var difference = threshold.Apply(frame); // only keep big blobs var filter = new BlobsFiltering(); filter.CoupledSizeFiltering = true; filter.MinHeight = 50; filter.MinWidth = 50; filter.ApplyInPlace(difference); // dilate remaining blobs var dilate = new BinaryDilation3x3(); dilate.ApplyInPlace(difference); dilate.ApplyInPlace(difference); dilate.ApplyInPlace(difference); dilate.ApplyInPlace(difference); // put this image in the thresholded picturebox thresholdedBox.Image = difference.Clone() as Bitmap; // use this as a mask for the current frame var mask = new ApplyMask(difference); var maskedFrame = mask.Apply(frame); // put this image in the masked picturebox maskedBox.Image = maskedFrame.Clone() as Bitmap; // now find all moving blobs if (frameIndex % 10 == 0) { var counter = new BlobCounter(); counter.ProcessImage(difference); // only keep blobs that: // - do not overlap with known cars // - do not overlap with other blobs // - have crossed the middle of the frame // - are at least 100 pixels tall var blobs = counter.GetObjectsRectangles(); var newBlobs = from r in counter.GetObjectsRectangles() where !trackers.Any(t => t.Tracker.TrackingObject.Rectangle.IntersectsWith(r)) && !blobs.Any(b => b.IntersectsWith(r) && b != r) && r.Top >= 240 && r.Bottom <= 480 && r.Height >= 100 select r; // set up new camshift trackers for each detected blob foreach (var rect in newBlobs) { trackers.Add(new TrackerType(rect, frameIndex, ++carIndex)); } } // now kill all car trackers that have expanded by too much trackers.RemoveAll(t => t.Tracker.TrackingObject.Rectangle.Height > 360); // and kill all trackers that have lived for 30 frames trackers.RemoveAll(t => frameIndex - t.StartIndex > 30); // let all remaining trackers process the current frame var img = UnmanagedImage.FromManagedImage(maskedFrame); trackers .ForEach(t => t.Tracker.ProcessFrame(img)); // remember this frame for next iteration previousFrame.Dispose(); previousFrame = frame.Clone() as Bitmap; // draw labels on all tracked cars var outputFrame = frame.Clone() as Bitmap; trackers .FindAll(t => !t.Tracker.TrackingObject.IsEmpty) .ForEach(t => DrawCarLabel(outputFrame, t.Tracker.TrackingObject.Rectangle, t.CarNumber)); // return the processed frame to the video frame = outputFrame; } // or else just remember this frame for next iteration else { previousFrame = frame.Clone() as Bitmap; } frameIndex++; }
/// <summary> /// Called when videoPlayer receives a new frame. /// </summary> /// <param name="sender"></param> /// <param name="image"></param> private void videoPlayer_NewFrame(object sender, ref Bitmap frame) { // use an rgb filter to remove everything but mario's outfit var filter = new ColorFiltering( new IntRange(220, 240), new IntRange(200, 220), new IntRange(160, 180) ); var filteredFrame = filter.Apply(frame); // convert the image to grayscale var gray = new GrayscaleBT709(); var trackingFrame = gray.Apply(filteredFrame); // use a threshold to make the image black & white var threshold = new Threshold(1); threshold.ApplyInPlace(trackingFrame); // apply agressive dilation var dilation = new BinaryDilation3x3(); dilation.ApplyInPlace(trackingFrame); dilation.ApplyInPlace(trackingFrame); dilation.ApplyInPlace(trackingFrame); // use image to mask the original frame var mask = new ApplyMask(trackingFrame); var maskedFrame = mask.Apply(frame); // is the camshift tracker still tracking mario? // - the tracking object cannot be empty // - the tracking rectangle has to be small bool isTracking = tracker.TrackingObject?.IsEmpty == false && tracker.TrackingObject?.Rectangle.Width <= 50; if (!isTracking) { // no - so do a blob search var blobSearch = new BlobCounter(); blobSearch.FilterBlobs = true; blobSearch.MinHeight = 25; blobSearch.MinWidth = 25; blobSearch.ProcessImage(trackingFrame); if (blobSearch.ObjectsCount > 0) { // assume the first blog we find is mario var rectangles = blobSearch.GetObjectsRectangles(); var rect = rectangles.First(); // use camshift to track mario from now on var img = UnmanagedImage.FromManagedImage(maskedFrame); tracker.SearchWindow = rect; tracker.ProcessFrame(img); } } else { // track mario using camshift var img = UnmanagedImage.FromManagedImage(maskedFrame); tracker.ProcessFrame(img); // draw the reticle where mario is var rect = tracker.TrackingObject.Rectangle; rect.Inflate(30, 30); DrawReticle(frame, rect); } // update pictureboxes thresholdedBox.Image = trackingFrame; maskedBox.Image = maskedFrame; frameIndex++; }
/// <summary> /// Called when videoPlayer receives a new frame. /// </summary> /// <param name="sender"></param> /// <param name="image"></param> private void videoPlayer_NewFrame_1(object sender, ref Bitmap frame) { //if (cmb_fuente.SelectedIndex==1) //{ // RotateBicubic filter = new RotateBicubic(90, true); // frame = filter.Apply(frame); //} if (previousFrame != null) { // find the thresholded euclidian difference between two subsequent frames //ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(40); ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(thr); threshold.OverlayImage = previousFrame; var difference = threshold.Apply(frame); // only keep big blobs var filter = new BlobsFiltering(); filter.CoupledSizeFiltering = true; filter.MinHeight = int.Parse(txt_tamanio2.Text); filter.MinWidth = int.Parse(txt_tamanio2.Text); filter.ApplyInPlace(difference); //var sobl = new SobelEdgeDetector(); //sobl.ApplyInPlace(difference); //erode image var erode = new Erosion3x3(); for (int i = 0; i < int.Parse(txt_ers.Text); i++) { erode.ApplyInPlace(difference); //erode.ApplyInPlace(difference); //erode.ApplyInPlace(difference); } // dilate remaining blobs var dilate = new BinaryDilation3x3(); for (int i = 0; i < int.Parse(txt_dils.Text); i++) { dilate.ApplyInPlace(difference); //dilate.ApplyInPlace(difference); //dilate.ApplyInPlace(difference); //dilate.ApplyInPlace(difference); } // put this image in the thresholded picturebox thresholdedBox.Image = difference.Clone() as Bitmap; // use this as a mask for the current frame var mask = new ApplyMask(difference); var maskedFrame = mask.Apply(frame); // put this image in the masked picturebox maskedBox.Image = maskedFrame.Clone() as Bitmap; // now find all moving blobs if (frameIndex % 10 == 0) { var counter = new BlobCounter(); counter.ProcessImage(difference); // only keep blobs that: // - do not overlap with known cars // - do not overlap with other blobs // - have crossed the middle of the frame // - are at least 100 pixels tall var blobs = counter.GetObjectsRectangles(); var newBlobs = from r in counter.GetObjectsRectangles() where !trackers.Any(t => t.Tracker.TrackingObject.Rectangle.IntersectsWith(r)) && !blobs.Any(b => b.IntersectsWith(r) && b != r) && r.Top >= 240 && r.Bottom <= 480 && r.Height >= int.Parse(txt_tamanio.Text) select r; // set up new camshift trackers for each detected blob foreach (var rect in newBlobs) { trackers.Add(new TrackerType(rect, frameIndex, ++carIndex)); } } // now kill all car trackers that have expanded by too much trackers.RemoveAll(t => t.Tracker.TrackingObject.Rectangle.Height > 360); // and kill all trackers that have lived for 30 frames //trackers.RemoveAll(t => frameIndex - t.StartIndex > 30); trackers.RemoveAll(t => frameIndex - t.StartIndex > frames); // let all remaining trackers process the current frame var img = UnmanagedImage.FromManagedImage(maskedFrame); trackers .ForEach(t => t.Tracker.ProcessFrame(img)); // remember this frame for next iteration previousFrame.Dispose(); previousFrame = frame.Clone() as Bitmap; //escribir etiqueta para cada vehiculo var outputFrame = frame.Clone() as Bitmap; trackers .FindAll(t => !t.Tracker.TrackingObject.IsEmpty) .ForEach(t => DrawCarLabel(outputFrame, t.Tracker.TrackingObject.Rectangle, t.CarNumber)); // regresar frame procesado frame = outputFrame; } else { // recordar para siguiente iteracion previousFrame = frame.Clone() as Bitmap; } frameIndex++; //if (previousFrame != null) //{ // // find the thresholded euclidian difference between two subsequent frames // ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(40); // threshold.OverlayImage = previousFrame; // var difference = threshold.Apply(frame); // // only keep big blobs // var filter = new BlobsFiltering(); // filter.CoupledSizeFiltering = true; // filter.MinHeight = 50; // filter.MinWidth = 50; // filter.ApplyInPlace(difference); // // dilate remaining blobs // var dilate = new BinaryDilation3x3(); // dilate.ApplyInPlace(difference); // //dilate.ApplyInPlace(difference); // //dilate.ApplyInPlace(difference); // //dilate.ApplyInPlace(difference); // // put this image in the thresholded picturebox // thresholdedBox.Image = difference.Clone() as Bitmap; // // use this as a mask for the current frame // var mask = new ApplyMask(difference); // var maskedFrame = mask.Apply(frame); // // put this image in the masked picturebox // maskedBox.Image = maskedFrame.Clone() as Bitmap; // // now find all moving blobs // if (frameIndex % 10 == 0) // { // var counter = new BlobCounter(); // counter.ProcessImage(difference); // // only keep blobs that: // // - do not overlap with known cars // // - do not overlap with other blobs // // - have crossed the middle of the frame // // - are at least 100 pixels tall // var blobs = counter.GetObjectsRectangles(); // var newBlobs = from r in counter.GetObjectsRectangles() // where !trackers.Any(t => t.Tracker.TrackingObject.Rectangle.IntersectsWith(r)) // && !blobs.Any(b => b.IntersectsWith(r) && b != r) // && r.Top >= 240 && r.Bottom <= 480 // && r.Height >= 100 // select r; // // set up new camshift trackers for each detected blob // foreach (var rect in newBlobs) // { // trackers.Add(new TrackerType(rect, frameIndex, ++carIndex)); // } // } // // now kill all car trackers that have expanded by too much // trackers.RemoveAll(t => t.Tracker.TrackingObject.Rectangle.Height > 360); // // and kill all trackers that have lived for 30 frames // trackers.RemoveAll(t => frameIndex - t.StartIndex > 30); // // let all remaining trackers process the current frame // var img = UnmanagedImage.FromManagedImage(maskedFrame); // trackers // .ForEach(t => t.Tracker.ProcessFrame(img)); // // remember this frame for next iteration // previousFrame.Dispose(); // previousFrame = frame.Clone() as Bitmap; // // draw labels on all tracked cars // var outputFrame = frame.Clone() as Bitmap; // trackers // .FindAll(t => !t.Tracker.TrackingObject.IsEmpty) // .ForEach(t => DrawCarLabel(outputFrame, t.Tracker.TrackingObject.Rectangle, t.CarNumber)); // // return the processed frame to the video // frame = outputFrame; //} //// or else just remember this frame for next iteration //else // previousFrame = frame.Clone() as Bitmap; //frameIndex++; }
private void Cap_ImageGrabbed(object sender, EventArgs e) { try { Mat imagen = new Mat(); cap.Retrieve(imagen); //pb_lprptzanalitica.Image = imagen.Bitmap; Bitmap frame = new Bitmap(imagen.Bitmap); //pb_ipcam.Image = frame.Clone() as Bitmap; if (previousFrame != null) { // find the thresholded euclidian difference between two subsequent frames //ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(40); ThresholdedEuclideanDifference threshold = new ThresholdedEuclideanDifference(thr); threshold.OverlayImage = previousFrame; var difference = threshold.Apply(frame.Clone() as Bitmap); // only keep big blobs var filter = new BlobsFiltering(); filter.CoupledSizeFiltering = true; filter.MinHeight = int.Parse(txt_tamanio2.Text); filter.MinWidth = int.Parse(txt_tamanio2.Text); filter.ApplyInPlace(difference); //var sobl = new SobelEdgeDetector(); //sobl.ApplyInPlace(difference); //erode image var erode = new Erosion3x3(); for (int i = 0; i < int.Parse(txt_ers.Text); i++) { erode.ApplyInPlace(difference); //erode.ApplyInPlace(difference); //erode.ApplyInPlace(difference); } // dilate remaining blobs var dilate = new BinaryDilation3x3(); for (int i = 0; i < int.Parse(txt_dils.Text); i++) { dilate.ApplyInPlace(difference); //dilate.ApplyInPlace(difference); //dilate.ApplyInPlace(difference); //dilate.ApplyInPlace(difference); } // put this image in the thresholded picturebox thresholdedBox.Image = difference.Clone() as Bitmap; // use this as a mask for the current frame var mask = new ApplyMask(difference); var maskedFrame = mask.Apply(frame); // put this image in the masked picturebox maskedBox.Image = maskedFrame.Clone() as Bitmap; // now find all moving blobs if (frameIndex % 10 == 0) { var counter = new BlobCounter(); counter.ProcessImage(difference); // only keep blobs that: // - do not overlap with known cars // - do not overlap with other blobs // - have crossed the middle of the frame // - are at least 100 pixels tall var blobs = counter.GetObjectsRectangles(); var newBlobs = from r in counter.GetObjectsRectangles() where !trackers.Any(t => t.Tracker.TrackingObject.Rectangle.IntersectsWith(r)) && !blobs.Any(b => b.IntersectsWith(r) && b != r) && r.Top >= 240 && r.Bottom <= 480 && r.Height >= int.Parse(txt_tamanio.Text) select r; // set up new camshift trackers for each detected blob foreach (var rect in newBlobs) { trackers.Add(new TrackerType(rect, frameIndex, ++carIndex)); } } // now kill all car trackers that have expanded by too much trackers.RemoveAll(t => t.Tracker.TrackingObject.Rectangle.Height > 360); // and kill all trackers that have lived for 30 frames //trackers.RemoveAll(t => frameIndex - t.StartIndex > 30); trackers.RemoveAll(t => frameIndex - t.StartIndex > frames); // let all remaining trackers process the current frame var img = UnmanagedImage.FromManagedImage(maskedFrame); trackers .ForEach(t => t.Tracker.ProcessFrame(img)); // remember this frame for next iteration previousFrame.Dispose(); previousFrame = frame.Clone() as Bitmap; //escribir etiqueta para cada vehiculo var outputFrame = frame.Clone() as Bitmap; trackers .FindAll(t => !t.Tracker.TrackingObject.IsEmpty) .ForEach(t => DrawCarLabel(outputFrame, t.Tracker.TrackingObject.Rectangle, t.CarNumber)); // regresar frame procesado frame = outputFrame; //pb_ipcam.Image = outputFrame; pb_lprptzanalitica.Image = outputFrame; } else { // recordar para siguiente iteracion previousFrame = frame.Clone() as Bitmap; } frameIndex++; } catch (Exception) { MessageBox.Show("Error al decodificar video de PTZ, LPR o ANALITICA"); } }
private void Detection() { var watch = System.Diagnostics.Stopwatch.StartNew(); if (Video.Image != null) { if (ModeList.selectedIndex == 0) { training = 1; int prev = AlphabetList.selectedIndex; if (AlphabetList.selectedIndex == 26 || prev == 26) { label = 67; } else if (AlphabetList.selectedIndex == -1) { label = prev; } else { label = AlphabetList.selectedIndex; } } else { training = 0; } ProgressBar.Visible = true; ProgressBar.Value = 0; ProgressBar.Maximum_Value = 9; ProgressBar.Value += 1; CapturedBox.Image = (Bitmap)Video.Image.Clone(); Bitmap src = new Bitmap(CapturedBox.Image); //skin detection var image = new Rectangle(0, 0, src.Width, src.Height); var value = src.LockBits(image, ImageLockMode.ReadWrite, src.PixelFormat); var size = Bitmap.GetPixelFormatSize(value.PixelFormat) / 8; var buffer = new byte[value.Width * value.Height * size]; Marshal.Copy(value.Scan0, buffer, 0, buffer.Length); System.Threading.Tasks.Parallel.Invoke( () => { Skin_process(buffer, 0, 0, value.Width / 2, value.Height / 2, value.Width, size); }, () => { Skin_process(buffer, 0, value.Height / 2, value.Width / 2, value.Height, value.Width, size); }, () => { Skin_process(buffer, value.Width / 2, 0, value.Width, value.Height / 2, value.Width, size); }, () => { Skin_process(buffer, value.Width / 2, value.Height / 2, value.Width, value.Height, value.Width, size); } ); Marshal.Copy(buffer, 0, value.Scan0, buffer.Length); src.UnlockBits(value); SkinBox.Image = src; if (Skin == 1) { ProgressBar.Value += 1; //Dilation & Erosion src = Grayscale.CommonAlgorithms.BT709.Apply(src); BinaryDilation3x3 dilatation = new BinaryDilation3x3(); BinaryErosion3x3 erosion = new BinaryErosion3x3(); for (int a = 1; a <= 10; a++) { src = dilatation.Apply(src); } for (int a = 1; a <= 10; a++) { src = erosion.Apply(src); } ProgressBar.Value += 1; NoiseBox.Image = src; //Blob try { ExtractBiggestBlob blob = new ExtractBiggestBlob(); src = blob.Apply(src); x = blob.BlobPosition.X; y = blob.BlobPosition.Y; ProgressBar.Value += 1; } catch { this.Show(); //MessageBox.Show("Lightning conditions are not good for detecting the gestures", "Bad Lights", MessageBoxButtons.OK, MessageBoxIcon.Information); } //Merge Bitmap srcImage = new Bitmap(CapturedBox.Image); Bitmap dstImage = new Bitmap(src); var srcrect = new Rectangle(0, 0, srcImage.Width, srcImage.Height); var dstrect = new Rectangle(0, 0, dstImage.Width, dstImage.Height); var srcdata = srcImage.LockBits(srcrect, ImageLockMode.ReadWrite, srcImage.PixelFormat); var dstdata = dstImage.LockBits(dstrect, ImageLockMode.ReadWrite, dstImage.PixelFormat); var srcdepth = Bitmap.GetPixelFormatSize(srcdata.PixelFormat) / 8; var dstdepth = Bitmap.GetPixelFormatSize(dstdata.PixelFormat) / 8; //bytes per pixel var srcbuffer = new byte[srcdata.Width * srcdata.Height * srcdepth]; var dstbuffer = new byte[dstdata.Width * dstdata.Height * dstdepth]; //copy pixels to buffer Marshal.Copy(srcdata.Scan0, srcbuffer, 0, srcbuffer.Length); Marshal.Copy(dstdata.Scan0, dstbuffer, 0, dstbuffer.Length); System.Threading.Tasks.Parallel.Invoke( () => { //upper-left Merge_process(srcbuffer, dstbuffer, x, 0, y, 0, x + (dstdata.Width / 2), dstdata.Width / 2, y + (dstdata.Height / 2), dstdata.Height / 2, srcdata.Width, dstdata.Width, srcdepth, dstdepth); }, () => { //upper-right Merge_process(srcbuffer, dstbuffer, x + (dstdata.Width / 2), dstdata.Width / 2, y, 0, x + (dstdata.Width), dstdata.Width, y + (dstdata.Height / 2), dstdata.Height / 2, srcdata.Width, dstdata.Width, srcdepth, dstdepth); }, () => { //lower-left Merge_process(srcbuffer, dstbuffer, x, 0, y + (dstdata.Height / 2), dstdata.Height / 2, x + (dstdata.Width / 2), dstdata.Width / 2, y + (dstdata.Height), dstdata.Height, srcdata.Width, dstdata.Width, srcdepth, dstdepth); }, () => { //lower-right Merge_process(srcbuffer, dstbuffer, x + (dstdata.Width / 2), dstdata.Width / 2, y + (dstdata.Height / 2), dstdata.Height / 2, x + (dstdata.Width), dstdata.Width, y + (dstdata.Height), dstdata.Height, srcdata.Width, dstdata.Width, srcdepth, dstdepth); } ); //Copy the buffer back to image Marshal.Copy(srcbuffer, 0, srcdata.Scan0, srcbuffer.Length); Marshal.Copy(dstbuffer, 0, dstdata.Scan0, dstbuffer.Length); srcImage.UnlockBits(srcdata); dstImage.UnlockBits(dstdata); src = dstImage; ProgressBar.Value += 1; CropBox.Image = src; //Resize ResizeBilinear resize = new ResizeBilinear(200, 200); src = resize.Apply(src); ProgressBar.Value += 1; //Edges src = Grayscale.CommonAlgorithms.BT709.Apply((Bitmap)src); SobelEdgeDetector edges = new SobelEdgeDetector(); src = edges.Apply(src); ProgressBar.Value += 1; EdgeDetectorBox.Image = src; //HOEF Bitmap block = new Bitmap(src); int[] edgescount = new int[50]; double[] norm = new double[200]; String text = null; int sum = 0; int z = 1; for (int p = 1; p <= 6; p++) { for (int q = 1; q <= 6; q++) { for (int x = (p - 1) * block.Width / 6; x < (p * block.Width / 6); x++) { for (int y = (q - 1) * block.Height / 6; y < (q * block.Height / 6); y++) { Color colorPixel = block.GetPixel(x, y); int r = colorPixel.R; int g = colorPixel.G; int b = colorPixel.B; if (r != 0 & g != 0 & b != 0) { edgescount[z]++; } } } z++; } } for (z = 1; z <= 36; z++) { sum = sum + edgescount[z]; } for (z = 1; z <= 36; z++) { norm[z] = (double)edgescount[z] / sum; text = text + " " + z.ToString() + ":" + norm[z].ToString(); } if (training == 1) { File.AppendAllText(@"D:\train.txt", label.ToString() + text + Environment.NewLine); ProgressBar.Value += 1; } else { File.WriteAllText(@"D:\test.txt", label.ToString() + text + Environment.NewLine); ProgressBar.Value += 1; //SVM Problem train = Problem.Read(@"D:\train.txt"); Problem test = Problem.Read(@"D:\test.txt"); Parameter parameter = new Parameter() { C = 32, Gamma = 8 }; Model model = Training.Train(train, parameter); Prediction.Predict(test, @"D:\result.txt", model, false); int value1 = Convert.ToInt32(File.ReadAllText(@"D:\result.txt")); String alphabet = null; if (value1 == 27) { alphabet += "Welcome "; } else if (value1 == 28) { alphabet += "Good Morning"; } else if (value1 == 29) { alphabet += "Thank You"; } else { alphabet += (char)(65 + value1); } OutputText.Text = alphabet; SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(); speechSynthesizer.SetOutputToDefaultAudioDevice(); speechSynthesizer.Volume = 100; speechSynthesizer.Rate = -2; speechSynthesizer.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Child); speechSynthesizer.SpeakAsync(alphabet); if (alphabet == " ") { speechSynthesizer.SpeakAsync(OutputText.Text); } ProgressBar.Value += 1; } } else { this.Show(); } watch.Stop(); var time = (watch.ElapsedMilliseconds); float secs = (float)time / 1000; ExecutionTimeBox.Text = Convert.ToString(secs) + " " + "Seconds"; } }