gpt4 book ai didi

c# - EMGU CV 中未处理 AccessViolationException

转载 作者:太空宇宙 更新时间:2023-11-03 22:15:42 26 4
gpt4 key购买 nike

当我运行我的程序时,我总是遇到这个错误...

enter image description here

我不确定我的程序有什么问题,仅供引用,实际上我的程序包含许多图像处理算法,例如

  • viola-jones,用于手部检测的 haarcascade
  • 用于手部跟踪的 camshift + 卡尔曼滤波器
  • 用于计数手指的凸包和凸缺陷
  • 和其他预处理....

我不知道这些过程是否触发了错误......

但是当我移除凸包/凸缺陷时,错误消失了......有什么解决办法吗?

编辑:(添加)

这是代码片段

 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; }

来源看看 DrawandComputeFingersNUm() 你会看到一行

defects = new Seq<MCvConvexityDefect>(storage);

当我取消注释上面的行时会出现问题..

有人知道怎么解决这个问题吗?任何帮助,将不胜感激..谢谢

最佳答案

如您所知,我是您正在使用的代码的创建者。

我的一位读者有时会发现与您类似的问题,评论了我的帖子并建议删除 using Memstorage 并将其全局放置然后清除 DrawAndComputeFingersNum() 函数中的存储

MemStorage storage = new MemStorage() //Global Declaration


private void DrawAndComputeFingersNum()
{

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;
storage.clear(); // clear storage allocation

}

关于c# - EMGU CV 中未处理 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com