2015-01-01 2 views
0

간단한 형상 검출 어플리케이션을 쓰려고합니다. Aforge.net 라이브러리의 샘플을 사용하고 있습니다. 그러나 나는 항상 같은 오류가 발생합니다 :AForge net 간단한 형상 검출 에러

에서 변환 할 수 없습니다 'AForge.Point []'에서 'System.Drawing.PointF []'나는 ImageProcess 방법에 몇 가지 변화뿐만 아니라 같이하려고

ToPointsArray,하지만 효과는 항상 동일합니다. 그 밖의 무엇을 시도 할 수 있습니까? 내가 뭘 잘못 했니? InitializeComponent를() {형태 공개를 Form1() { ;

공용 부분 Form1 클래스 : 여기

는 코드 }

private void button1_Click(object sender, EventArgs e) 
    { 
     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      try 
      { 
       ProcessImage((Bitmap)Bitmap.FromFile(openFileDialog1.FileName)); 
      } 
      catch 
      { 
       MessageBox.Show("Załadowanie obrazu niepowiodło się.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 
    } 

    private void ProcessImage(Bitmap bitmap) 
    { 
     //------------------------------------- 

     BitmapData bitmapData = bitmap.LockBits(
      new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
      ImageLockMode.ReadWrite, bitmap.PixelFormat); 

     //------------------------------------- 

     ColorFiltering colorFilter = new ColorFiltering(); 

     colorFilter.Red = new IntRange(0, 64); 
     colorFilter.Green = new IntRange(0, 64); 
     colorFilter.Blue = new IntRange(0, 64); 
     colorFilter.FillOutsideRange = false; 

     colorFilter.ApplyInPlace(bitmapData); 

     //------------------------------------- 

     BlobCounter blobCounter = new BlobCounter(); 

     blobCounter.FilterBlobs = true; 
     blobCounter.MinHeight = 5; 
     blobCounter.MinWidth = 5; 

     blobCounter.ProcessImage(bitmapData); 
     Blob[] blobs = blobCounter.GetObjectsInformation(); 
     bitmap.UnlockBits(bitmapData); 

     //------------------------------------- 

     SimpleShapeChecker shapeChecker = new SimpleShapeChecker(); 

     Graphics g = Graphics.FromImage(bitmap); 
     Pen redPen = new Pen(Color.Red, 2);  // quadrilateral 
     Pen brownPen = new Pen(Color.Brown, 2); // quadrilateral with known sub-type 
     Pen greenPen = new Pen(Color.Green, 2); // known triangle 
     Pen bluePen = new Pen(Color.Blue, 2);  // triangle 

     for (int i = 0, n = blobs.Length; i < n; i++) 
     { 
      List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]); 

      { 
       List<IntPoint> corners; 

       // is triangle or quadrilateral 
       if (shapeChecker.IsConvexPolygon(edgePoints, out corners)) 
       { 
        // get sub-type 
        PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners); 

        Pen pen; 

        if (subType == PolygonSubType.Unknown) 
        { 
         pen = (corners.Count == 4) ? redPen : bluePen; 
        } 
        else 
        { 
         pen = (corners.Count == 4) ? brownPen : greenPen; 
        } 

        g.DrawPolygon(pen, ToPointsArray(corners)); 
       } 
      } 
     } 

     redPen.Dispose(); 
     greenPen.Dispose(); 
     bluePen.Dispose(); 
     brownPen.Dispose(); 
     g.Dispose(); 

     // put new image to clipboard 
     Clipboard.SetDataObject(bitmap); 
     // and to picture box 
     pictureBox1.Image = bitmap; 

     UpdatePictureBoxPosition(); 
    } 

    private Point[] ToPointsArray(List<IntPoint> points) 
    { 
     Point[] array = new Point[points.Count]; 

     for (int i = 0, n = points.Count; i < n; i++) 
     { 
      array[i] = new Point(points[i].X, points[i].Y); 
     } 

     return array; 
    } 

답변

3

귀하의 문제는 AForge이 ToPointArray 방법은 실제로 Aforge 포인트 배열보다는 필요한 .NET 포인트의 배열을 반환 있도록 Point 구조체가 소유해야한다는 것입니다. 가장 간단한 해결책은 완전히 사용하려는 형태를 한정 할 것입니다, 그래서 당신은 당신이 상단에 using 문을 사용하여 네임 스페이스 별칭 수있는 몇 가지 문자를 저장하기를 원한다면 당신의 방법은 다른 방법으로

private System.Drawing.Point[] ToPointsArray(List<IntPoint> points) 
{ 
    System.Drawing.Point[] array = new System.Drawing.Point[points.Count]; 
    ... 
} 

이 될 것입니다 수업.

linq를 사용할 수 있으면이 방법을 짧게 할 수 있습니다. 예 :

private System.Drawing.Point[] ToPointsArray(List<IntPoint> points) 
{ 
    return points.Select(p => new System.Drawing.Point(p.X, p.Y)).ToArray(); 
}