I always get this error when I run my program…

i’m not sure about what’s wrong with my program, FYI, actually my program consist of many image processing algorithm’s such as
- viola-jones, haarcascade for hand detection
- camshift + kalman filter for hand tracking
- convex hull and convexity defects for counting finger
- and other preprocessing ….
I have no idea whether these process triggering the error or not…
but when I remove convexhull / convexity defects, the errors gone…
any solution?
Edited : (added)
this is the code snippet
private void ExtractContourAndHull()
{
using (MemStorage storage = new MemStorage())
{
Contour<Point> contours = backproject.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, storage);
Contour<Point> biggestContour = null;
Double Result1 = 0;
Double Result2 = 0;
while (contours != null)
{
Result1 = contours.Area;
if (Result1 > Result2)
{
Result2 = Result1;
biggestContour = contours;
}
contours = contours.HNext;
}
if (biggestContour != null)
{
//image.Draw(biggestContour, new Bgr(Color.DarkViolet), 2);
Contour<Point> currentContour = biggestContour.ApproxPoly(biggestContour.Perimeter * 0.005, storage);
image.Draw(currentContour, new Bgr(Color.LimeGreen), 2);
biggestContour = currentContour;
hull = biggestContour.GetConvexHull(ORIENTATION.CV_CLOCKWISE);
box = biggestContour.GetMinAreaRect();
PointF[] points = box.GetVertices();
//handRect = box.MinAreaRect();
//image.Draw(handRect, new Bgr(200, 0, 0), 1);
Point[] ps = new Point[points.Length];
for (int i = 0; i < points.Length; i++)
ps[i] = new Point((int)points[i].X, (int)points[i].Y);
image.DrawPolyline(hull.ToArray(), true, new Bgr(200, 125, 75), 2);
image.Draw(new CircleF(new PointF(box.center.X, box.center.Y), 3), new Bgr(200, 125, 75), 2);
//ellip.MCvBox2D= CvInvoke.cvFitEllipse2(biggestContour.Ptr);
//image.Draw(new Ellipse(ellip.MCvBox2D), new Bgr(Color.LavenderBlush), 3);
//PointF center;
//float radius;
//CvInvoke.cvMinEnclosingCircle(biggestContour.Ptr, out center, out radius);
//image.Draw(new CircleF(center, radius), new Bgr(Color.Gold), 2);
//image.Draw(new CircleF(new PointF(ellip.MCvBox2D.center.X, ellip.MCvBox2D.center.Y), 3), new Bgr(100, 25, 55), 2);
//image.Draw(ellip, new Bgr(Color.DeepPink), 2);
//CvInvoke.cvEllipse(image, new Point((int)ellip.MCvBox2D.center.X, (int)ellip.MCvBox2D.center.Y), new System.Drawing.Size((int)ellip.MCvBox2D.size.Width, (int)ellip.MCvBox2D.size.Height), ellip.MCvBox2D.angle, 0, 360, new MCvScalar(120, 233, 88), 1, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, 0);
//image.Draw(new Ellipse(new PointF(box.center.X, box.center.Y), new SizeF(box.size.Height, box.size.Width), box.angle), new Bgr(0, 0, 0), 2);
filteredHull = new Seq<Point>(storage);
for (int i = 0; i < hull.Total; i++)
{
if (Math.Sqrt(Math.Pow(hull[i].X - hull[i + 1].X, 2) + Math.Pow(hull[i].Y - hull[i + 1].Y, 2)) > box.size.Width / 10)
{
filteredHull.Push(hull[i]);
}
}
defects = biggestContour.GetConvexityDefacts(storage, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);
defectArray = defects.ToArray();
}
}
}
private void DrawAndComputeFingersNum()
{
using (MemStorage storage = new MemStorage())
{
int fingerNum = 0;
#region hull drawing
//for (int i = 0; i < filteredHull.Total; i++)
//{
// PointF hullPoint = new PointF((float)filteredHull[i].X,
// (float)filteredHull[i].Y);
// CircleF hullCircle = new CircleF(hullPoint, 4);
// image.Draw(hullCircle, new Bgr(Color.Aquamarine), 2);
//}
#endregion
#region defects drawing
***defects = new Seq<MCvConvexityDefect>(storage);***
for (int i = 0; i < defects.Total; i++)
{
PointF startPoint = new PointF((float)defectArray[i].StartPoint.X,
(float)defectArray[i].StartPoint.Y);
PointF depthPoint = new PointF((float)defectArray[i].DepthPoint.X,
(float)defectArray[i].DepthPoint.Y);
PointF endPoint = new PointF((float)defectArray[i].EndPoint.X,
(float)defectArray[i].EndPoint.Y);
LineSegment2D startDepthLine = new LineSegment2D(defectArray[i].StartPoint, defectArray[i].DepthPoint);
LineSegment2D depthEndLine = new LineSegment2D(defectArray[i].DepthPoint, defectArray[i].EndPoint);
CircleF startCircle = new CircleF(startPoint, 5f);
CircleF depthCircle = new CircleF(depthPoint, 5f);
CircleF endCircle = new CircleF(endPoint, 5f);
MCvFont angga = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SCRIPT_COMPLEX, 0.5, 0.5);
// image.Draw(defectArray[i].StartPoint.X.ToString() + " , " + defectArray[i].StartPoint.Y.ToString(), ref angga, new Point(defectArray[i].StartPoint.X, defectArray[i].StartPoint.Y), new Bgr(Color.Red));
image.Draw(defectArray[i].StartPoint.X.ToString() + " , " + defectArray[i].StartPoint.Y.ToString() + " , " + i.ToString(), ref angga, new Point(defectArray[i].StartPoint.X, defectArray[i].StartPoint.Y), new Bgr(Color.Red));
//Custom heuristic based on some experiment, double check it before use
if ((startCircle.Center.Y < box.center.Y || depthCircle.Center.Y < box.center.Y) && (startCircle.Center.Y < depthCircle.Center.Y) && (Math.Sqrt(Math.Pow(startCircle.Center.X - depthCircle.Center.X, 2) + Math.Pow(startCircle.Center.Y - depthCircle.Center.Y, 2)) > box.size.Height / 6.5))
{
fingerNum++;
//image.Draw(startDepthLine, new Bgr(Color.Blue), 2);
//image.Draw(depthEndLine, new Bgr(Color.Magenta), 2);
}
image.Draw(startCircle, new Bgr(Color.Red), 2);
image.Draw(depthCircle, new Bgr(Color.Yellow), 5);
//image.Draw(endCircle, new Bgr(Color.DarkBlue), 4);
}
#endregion
MCvFont font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_DUPLEX, 5d, 5d);
image.Draw(fingerNum.ToString(), ref font, new Point(50, 150), new Bgr(Color.White));
hand.fingerChangedCompute = fingerNum;
}
}
public MemStorage storage { get; set; }
orgin
take a look at DrawandComputeFingersNUm() you’ll see a line
defects = new Seq<MCvConvexityDefect>(storage);
the problem will occur when I uncomment the line above..
anyone knows how to solve this problem?
any help would be appreciated..
thanks
as you know I’m the creator of the code you are using.
One of my reader find sometimes an issue similar to yours, commented my post and suggest to remove the using Memstorage and put it globally then clear the storage inside
DrawAndComputeFingersNum()function