Thông báo

Collapse
No announcement yet.

Giải thích giùm mình hàm con này dùng Emgu CV sang OpenCV

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giải thích giùm mình hàm con này dùng Emgu CV sang OpenCV

    Trong hàm này mình chưa hiểu hàm LineSegment2D của Emgu CV , bạn nào biết giải thích giùm mình, và cách sử dụng trong OpenCV.Nếu viết lại code c/c++ dùng openCV thì tuyệt. Cảm ơn nhiều


    private Image<Gray, Byte> Method_HSV(Image<Hsv, byte> image)
    { LineSegment2D[] Lines = // Points depend on each hue

    { new LineSegment2D ( new Point (32,243), new Point (64,255)),
    new LineSegment2D ( new Point (64,16), new Point (32,64)), };
    Vmax = 255;
    Vmin = 16;
    Smax = 64;
    Smin = 32;
    // Normalise each pixel of the image and return a new image
    for (int i = 0; i < width; i++)
    {
    for (int j = 0; j < height; j++)
    {

    Gray = GreyImg_2[j, i].Intensity;
    V = image[j, i].Value; // Checks the Brightness
    S = image[j, i].Satuation; // Decides intensity of the colour
    H = image[j, i].Hue; // Decides the Colour
    int s = (int)S;
    int v = (int)V;
    if (H > 10 && H < 135) // Check for not RED
    {
    GreyImg_2[j, i] = Black;
    }
    else
    {// Check horizontal and vertical lines
    if (Vmax < V || V < Vmin || S < Smin)
    GreyImg_2[j, i] = Black;
    else if (S > Smax)
    GreyImg_2[j, i] = White;
    else
    {// use table XI
    GreyImg_2[j, i] = White;
    for (int n = 0; n < Lines.Length; n++) // number of lines
    {
    int S1 = Lines[n].P1.X;
    int V1 = Lines[n].P1.Y;
    int S2 = Lines[n].P2.X;
    int V2 = Lines[n].P2.Y;
    if ((V2 - V1) > 0)
    {
    if ((((V2 - V1) * s) + ((S1 - S2) * v) + (V1 * S2 - S1 * V2)) < 0)
    GreyImg_2[j, i] = Black;
    }
    else
    {
    if ((((V2 - V1) * s) + ((S1 - S2) * v) + (V1 * S2 - S1 * V2)) > 0)
    GreyImg_2[j, i] = Black;
    }
    }
    }
    }
    }
    }
    return GreyImg_2;
    }

  • #2
    up .
    Last edited by levietquoc; 29-10-2013, 11:22.

    Comment


    • #3
      Bạn nghiên cứu sao. Mình đang thắc mắc là lệnh định nghĩa Lines này
      LineSegment2D[] Lines = // Points depend on each hue
      { new LineSegment2D ( new Point (32,243), new Point (64,255)),
      new LineSegment2D ( new Point (64,16), new Point (32,64)), };

      Với cái vòng for này
      for (int n = 0; n < Lines.Length; n++) // number of lines
      {
      int S1 = Lines[n].P1.X;
      int V1 = Lines[n].P1.Y;
      int S2 = Lines[n].P2.X;
      int V2 = Lines[n].P2.Y;
      }

      Bạn hiểu 2 lệnh này không giúp mình với. Thank nhiều.

      Comment


      • #4
        Mảng hai đoạn thẳng kiểu LineSegment2D, xem định nghĩa của cấu trúc này như dưới đây.
        Vòng lặp for lặp qua hai phần tử của mảng, tại mỗi phần tử của mảng nó lấy các thànhh phần tọa độ điểm thứ nhất P1(X,Y) và điểm thứ hai P2(X,Y). Chỉ đơn giản vậy thôi.

        PS: Nếu bài viết của bạn có chứa mã chương trình, hãy đặt nó vào bên trong thẻ CODE để mã nguồn được hiển thị theo cấu trúc thân thiện hơn.

        Code:
        using System;
        using System.Drawing;
        
        namespace Emgu.CV.Structure
        {
           /// <summary> 
           /// A line segment 
           /// </summary>
           public struct LineSegment2D 
           {
              ///<summary> A point on the line </summary>
              private Point _p1;
              ///<summary> An other point on the line </summary>
              private Point _p2;
        
              ///<summary> A point on the line </summary>
              public Point P1 { get { return _p1; } set { _p1 = value; } }
        
              ///<summary> An other point on the line </summary>
              public Point P2 { get { return _p2; } set { _p2 = value; } }
        
              /// <summary> 
              /// Create a line segment with the specific starting point and end point 
              /// </summary>
              /// <param name="p1">The first point on the line segment</param>
              /// <param name="p2">The second point on the line segment</param>
              public LineSegment2D(Point p1, Point p2) 
              {
                 _p1 = p1;
                 _p2 = p2;
              }
        
              ///<summary> The direction of the line, the norm of which is 1 </summary>
              public PointF Direction
              {
                 get
                 {
                    int dx = P1.X - P2.X;
                    int dy = P1.Y - P2.Y;
                    float dist = (float)Math.Sqrt(dx * dx + dy * dy);
        
                    return new PointF(dx / dist, dy / dist);
                 }
              }
        
              /// <summary>
              /// Determine which side of the line the 2D point is at
              /// </summary>
              /// <param name="point">the point</param>
              /// <returns>
              /// 1 if on the right hand side;
              /// 0 if on the line;
              /// -1 if on the left hand side;
              /// </returns>
              public int Side(Point point)
              {
                 float res = (P2.X - P1.X) * (point.Y - P1.Y) - (point.X - P1.X) * (P2.Y - P1.Y);
                 return res > 0.0f ? 1 :
                    res < 0.0f ? -1 : 0;
              }
        
              /// <summary>
              /// Get the exterior angle between this line and <paramref name="otherLine"/>
              /// </summary>
              /// <param name="otherLine">The other line</param>
              /// <returns>The exterior angle between this line and <paramref name="otherLine"/></returns>
              public double GetExteriorAngleDegree(LineSegment2D otherLine)
              {
                 PointF direction1 = Direction;
                 PointF direction2 = otherLine.Direction;
                 double radianAngle = Math.Atan2(direction2.Y, direction2.X) - Math.Atan2(direction1.Y, direction1.X);
                 double degreeAngle = radianAngle * (180.0 / Math.PI);
                 return
                     degreeAngle <= -180.0 ? degreeAngle + 360 :
                     degreeAngle > 180.0 ? degreeAngle - 360 :
                     degreeAngle;
              }
        
              /// <summary> 
              /// Get the length of the line segment 
              /// </summary>
              public double Length
              {
                 get
                 {
                    int dx = P1.X - P2.X;
                    int dy = P1.Y - P2.Y;
                    return Math.Sqrt(dx * dx + dy * dy);
                 }
              }
           }
        }
        Last edited by GMVT; 31-10-2013, 23:13. Lý do: Định dạng lại kiểu hiển thị mã nguồn
        GIALE MACHINE VISION TECHNOLOGIES
        E-mail:
        Website:

        Comment

        Về tác giả

        Collapse

        levietquoc Tìm hiểu thêm về levietquoc

        Bài viết mới nhất

        Collapse

        Đang tải...
        X