Difference between revisions of "Convex Hull in CSharp"
Jump to navigation
Jump to search
Breadwinka (talk | contribs) |
|||
(5 intermediate revisions by 3 users not shown) | |||
Line 3: | Line 3: | ||
!Component || Requirement || Detail | !Component || Requirement || Detail | ||
|- | |- | ||
− | |Emgu CV || Version 1.5 || | + | |Emgu CV || Version 1.5+ || |
|- | |- | ||
|Operation System || Cross Platform || | |Operation System || Cross Platform || | ||
Line 9: | Line 9: | ||
== Source Code == | == Source Code == | ||
+ | |||
+ | === Emgu CV 4.x === | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | Click to view source code | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <source lang="csharp"> | ||
+ | #region Create some random points | ||
+ | Random r = new Random(); | ||
+ | PointF[] pts = new PointF[200]; | ||
+ | for (int i = 0; i < pts.Length; i++) | ||
+ | { | ||
+ | pts[i] = new PointF((float)(100 + r.NextDouble() * 400), (float)(100 + r.NextDouble() * 400)); | ||
+ | } | ||
+ | #endregion | ||
+ | |||
+ | Mat img = new Mat(600, 600, DepthType.Cv8U, 3); | ||
+ | img.SetTo(new MCvScalar(255.0, 255.0, 255.0)); | ||
+ | //Draw the points | ||
+ | foreach (PointF p in pts) | ||
+ | CvInvoke.Circle(img, Point.Round(p), 3, new MCvScalar(0.0, 0.0, 0.0)); | ||
+ | |||
+ | //Find and draw the convex hull | ||
+ | |||
+ | Stopwatch watch = Stopwatch.StartNew(); | ||
+ | PointF[] hull = CvInvoke.ConvexHull(pts, true); | ||
+ | watch.Stop(); | ||
+ | CvInvoke.Polylines( | ||
+ | img, | ||
+ | #if NETFX_CORE | ||
+ | Extensions.ConvertAll<PointF, Point>(hull, Point.Round), | ||
+ | #else | ||
+ | Array.ConvertAll<PointF, Point>(hull, Point.Round), | ||
+ | #endif | ||
+ | true, new MCvScalar(255.0, 0.0, 0.0)); | ||
+ | |||
+ | Emgu.CV.UI.ImageViewer.Show(img, String.Format("Convex Hull Computed in {0} milliseconds", watch.ElapsedMilliseconds)); | ||
+ | |||
+ | </source> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | === Emgu CV 3.x === | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | Click to view source code | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <source lang="csharp"> | ||
+ | #region Create some random points | ||
+ | Random r = new Random(); | ||
+ | PointF[] pts = new PointF[200]; | ||
+ | for (int i = 0; i < pts.Length; i++) | ||
+ | { | ||
+ | pts[i] = new PointF((float)(100 + r.NextDouble() * 400), (float)(100 + r.NextDouble() * 400)); | ||
+ | } | ||
+ | #endregion | ||
+ | |||
+ | Mat img = new Mat(600, 600, DepthType.Cv8U, 3); | ||
+ | img.SetTo(new MCvScalar(255.0, 255.0, 255.0)); | ||
+ | //Draw the points | ||
+ | foreach (PointF p in pts) | ||
+ | CvInvoke.Circle(img, Point.Round(p), 3, new MCvScalar(0.0, 0.0, 0.0)); | ||
+ | |||
+ | //Find and draw the convex hull | ||
+ | |||
+ | Stopwatch watch = Stopwatch.StartNew(); | ||
+ | PointF[] hull = CvInvoke.ConvexHull(pts, true); | ||
+ | watch.Stop(); | ||
+ | CvInvoke.Polylines( | ||
+ | img, | ||
+ | #if NETFX_CORE | ||
+ | Extensions.ConvertAll<PointF, Point>(hull, Point.Round), | ||
+ | #else | ||
+ | Array.ConvertAll<PointF, Point>(hull, Point.Round), | ||
+ | #endif | ||
+ | true, new MCvScalar(255.0, 0.0, 0.0)); | ||
+ | |||
+ | Emgu.CV.UI.ImageViewer.Show(img, String.Format("Convex Hull Computed in {0} milliseconds", watch.ElapsedMilliseconds)); | ||
+ | </source> | ||
+ | </div> | ||
+ | </div> | ||
+ | |||
+ | === Emgu CV 1.x === | ||
+ | <div class="toccolours mw-collapsible mw-collapsed"> | ||
+ | Click to view source code | ||
+ | <div class="mw-collapsible-content"> | ||
<source lang="csharp"> | <source lang="csharp"> | ||
#region Create some random points | #region Create some random points | ||
Line 37: | Line 121: | ||
} | } | ||
</source> | </source> | ||
+ | </div> | ||
+ | </div> | ||
== Result == | == Result == | ||
[[image:ConvexHullExample.png]] | [[image:ConvexHullExample.png]] |
Latest revision as of 20:02, 25 June 2019
System Requirement
Component | Requirement | Detail |
---|---|---|
Emgu CV | Version 1.5+ | |
Operation System | Cross Platform |
Source Code
Emgu CV 4.x
Click to view source code
#region Create some random points
Random r = new Random();
PointF[] pts = new PointF[200];
for (int i = 0; i < pts.Length; i++)
{
pts[i] = new PointF((float)(100 + r.NextDouble() * 400), (float)(100 + r.NextDouble() * 400));
}
#endregion
Mat img = new Mat(600, 600, DepthType.Cv8U, 3);
img.SetTo(new MCvScalar(255.0, 255.0, 255.0));
//Draw the points
foreach (PointF p in pts)
CvInvoke.Circle(img, Point.Round(p), 3, new MCvScalar(0.0, 0.0, 0.0));
//Find and draw the convex hull
Stopwatch watch = Stopwatch.StartNew();
PointF[] hull = CvInvoke.ConvexHull(pts, true);
watch.Stop();
CvInvoke.Polylines(
img,
#if NETFX_CORE
Extensions.ConvertAll<PointF, Point>(hull, Point.Round),
#else
Array.ConvertAll<PointF, Point>(hull, Point.Round),
#endif
true, new MCvScalar(255.0, 0.0, 0.0));
Emgu.CV.UI.ImageViewer.Show(img, String.Format("Convex Hull Computed in {0} milliseconds", watch.ElapsedMilliseconds));
Emgu CV 3.x
Click to view source code
#region Create some random points
Random r = new Random();
PointF[] pts = new PointF[200];
for (int i = 0; i < pts.Length; i++)
{
pts[i] = new PointF((float)(100 + r.NextDouble() * 400), (float)(100 + r.NextDouble() * 400));
}
#endregion
Mat img = new Mat(600, 600, DepthType.Cv8U, 3);
img.SetTo(new MCvScalar(255.0, 255.0, 255.0));
//Draw the points
foreach (PointF p in pts)
CvInvoke.Circle(img, Point.Round(p), 3, new MCvScalar(0.0, 0.0, 0.0));
//Find and draw the convex hull
Stopwatch watch = Stopwatch.StartNew();
PointF[] hull = CvInvoke.ConvexHull(pts, true);
watch.Stop();
CvInvoke.Polylines(
img,
#if NETFX_CORE
Extensions.ConvertAll<PointF, Point>(hull, Point.Round),
#else
Array.ConvertAll<PointF, Point>(hull, Point.Round),
#endif
true, new MCvScalar(255.0, 0.0, 0.0));
Emgu.CV.UI.ImageViewer.Show(img, String.Format("Convex Hull Computed in {0} milliseconds", watch.ElapsedMilliseconds));
Emgu CV 1.x
Click to view source code
#region Create some random points
Random r = new Random();
PointF[] pts = new PointF[200];
for (int i = 0; i < pts.Length; i++)
{
pts[i] = new PointF((float)(100 + r.NextDouble() * 400), (float)(100 + r.NextDouble() * 400));
}
#endregion
Image<Bgr, Byte> img = new Image<Bgr, byte>(600, 600, new Bgr(255.0, 255.0, 255.0));
//Draw the points
foreach (PointF p in pts)
img.Draw(new CircleF(p, 3), new Bgr(0.0, 0.0, 0.0), 1);
//Find and draw the convex hull
using (MemStorage storage = new MemStorage())
{
Stopwatch watch = Stopwatch.StartNew();
PointF[] hull = PointCollection.ConvexHull(pts, storage, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE).ToArray();
watch.Stop();
img.DrawPolyline(
Array.ConvertAll<PointF, Point>(hull, Point.Round),
true, new Bgr(255.0, 0.0, 0.0), 1);
ImageViewer.Show(img, String.Format("Convex Hull Computed in {0} milliseconds", watch.ElapsedMilliseconds));
}