OpenCVSharp 카메라 제어 #2 ( Line Generator)

Software/C#|2023. 3. 6. 13:12
반응형

지난 포스팅에 이어 이번에는 출력되는 영상에 Line을 그려주는 코드를 넣어보도록 하겠습니다. 

 

1. Main 화면에 지난번에 이어  HScrollBar 2개(min:0, max:640), VScrollBar 2개(min:0, max:480) 를 올립니다. 

   * 각 ScrollBar 의 Maximum 크기는 화면의 크기와 동일하게 설정합니다. 

 

2. TextBox 4 개의 올려 줍니다. 각각의 Name 속성을 다음과 같이 설정합니다. 

   * textOffsetX, textOffsetY, textSizeX, textSizeY

 

3. CheckBox 를 1개 올려 줍니다. Name 속성은 checkLineDisplay 로 설정합니다. 

 

4. 지난 포스팅에 기술한 카메라 제어 클래스에 아래의 코드를 추가해 줍니다. 

public class CameraThread
{

    public int displayLineX1 { get; set; }
    public int displayLineX2 { get; set; }
    public int displayLineY1 { get; set; }
    public int displayLineY2 { get; set; }
    public bool displayLine { get; set; } = true;
//-------------------------------------------------------------------------------------
    public void Run()
    {
        capture.Open(cameraNumber);

        using (Mat displayFrame = new())
        {
            while (isCameraRunning)
            {
                capture.Read(sourceFrame);

                if (!sourceFrame.Empty())
                {
                    Cv2.CopyTo(sourceFrame, displayFrame);

                    if (displayLine == true) DrawLine(displayFrame);
                    UpdateFrame(BitmapConverter.ToBitmap(displayFrame));
                }
            }
        }

        capture.Release();
        GC.Collect();
    }
    //-------------------------------------------------------------------------------------
    private void DrawLine(Mat displayFrame)
    {
        Cv2.Line(displayFrame, 0, displayLineY1, displaySize.X, displayLineY1, Scalar.Yellow, 1, LineTypes.AntiAlias);
        Cv2.Line(displayFrame, 0, displayLineY2, displaySize.X, displayLineY2, Scalar.Yellow, 1, LineTypes.AntiAlias);
        Cv2.Line(displayFrame, displayLineX1, 0, displayLineX1, displaySize.Y, Scalar.Yellow, 1, LineTypes.AntiAlias);
        Cv2.Line(displayFrame, displayLineX2, 0, displayLineX2, displaySize.Y, Scalar.Yellow, 1, LineTypes.AntiAlias);
    }
    //-------------------------------------------------------------------------------------
}

 

5. 스크롤바 4개의 scroll 이벤트 함수로 Line_Scroll을 모두 동일하게 설정합니다. 

 

6. Main 화면의 코드를 추가 합니다. 

private void checkLineDisplay_CheckedChanged(object sender, EventArgs e)
{
    cameraThread.displayLine = checkLineDisplay.Checked;
}
//--------------------------------------------------------------------------------
private void Line_Scroll(object sender, ScrollEventArgs e)
{
    if (sender is ScrollBar scroll)
    {
        var Size   = new System.Drawing.Point();
        var Offset = new System.Drawing.Point();

        switch (int.Parse(scroll.Tag.ToString()))
        {
            case 0: cameraThread.displayLineX1 = scroll.Value; break;
            case 1: cameraThread.displayLineX2 = scroll.Value; break;
            case 2: cameraThread.displayLineY1 = scroll.Value; break;
            case 3: cameraThread.displayLineY2 = scroll.Value; break;
        }

        Size.X = Math.Abs(cameraThread.displayLineX2 - cameraThread.displayLineX1);
        Size.Y = Math.Abs(cameraThread.displayLineY2 - cameraThread.displayLineY1);

        Func<int, int, int> Compare = (int x, int y) => { if (x < y) return x; else return y; };

        Offset.X = Compare(cameraThread.displayLineX1, cameraThread.displayLineX2);
        Offset.Y = Compare(cameraThread.displayLineY1, cameraThread.displayLineY2);

        textOffsetX.Text = Offset.X.ToString();
        textOffsetY.Text = Offset.Y.ToString();

        textSizeX.Text = Size.X.ToString();
        textSizeY.Text = Size.Y.ToString(); 
    }
}
반응형

댓글()