2012-07-05 73 views
1

運行我的節目,我總是得到這個錯誤...AccessViolationException在EMGU是未處理的CV

enter image description here

我不知道什麼是錯了我的計劃,僅供參考,其實我的計劃包括許多圖像處理算法的諸如

  • 中提琴 - 瓊斯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); 

問題會當我取消註釋上面的行時會出現。

任何人都知道 如何解決這個問題呢? 任何幫助將不勝感激。 謝謝

+0

你不會得到結果詢問僅基於其使用的算法來調試程序。你的問題將得到更具體的獲得任何有用的幫助。 – antlersoft 2012-07-05 16:18:43

+0

好@antlersoft我會修改問題.. – sheldon90 2012-07-07 11:47:55

回答

3

如你所知我是你使用的代碼的創建者。有時

我的一個讀者找到你類似的問題,評論我的職務,並建議刪除使用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 

    } 
+0

我做了你說的,是的,它修復了這個問題,但是,012ComputerFingersNum方法不起作用(它不繪製任何圓/線和手指計數不起作用) 這裏的快照 http://i.imgur.com/aQozV.jpg – sheldon90 2012-07-18 15:13:02

+0

他....應用程序現在正在調整存儲變量後運行...我不知道爲什麼代碼運行良好.. – sheldon90 2012-07-18 16:10:50

+0

有存儲變量作用域的潛在問題。我很高興它現在有效。 – 2012-07-18 20:05:56