3.1 Winform 프로젝트 만들기

  •  Basler 솔루션 안에 BaslerContinueShotGrab이라는 이름으로 Windows Forms 앱 (.NET Framework) 프로젝트를 만들고 C#작업환경 만들기를 참조하여 Basler.Pylon.dll을 참조 추가한다.

2024.02.08 - [Basler] - 1. c# 작업 환경 만들기

 

1. c# 작업 환경 만들기

Basler 홈페이지에서 제공하는 Pylon Viewer를 설치한다 현재 내가 PC에 설치한 6.2.0 기준으로 (Pylon Viewer 설치 경로)\pylon 6\Development\Assemblies\Basler.Pylon\ 하위에 x64, x86폴더로 나눠져 있고 이중에 자기 os

machinevision-story.tistory.com

 

3.2 UI 디자인

  • 도구 상자에서 Button 4개와 PictureBox 1개를 드래그 하여 Form1에 위치 시킨다

  • button과 Name속성과 button의 Text속성을 아래 표와 같이 변경한다.
컨트롤 이름 속성
button1 Name BtnOpen
Text Connect
button2 Name BtnGrabStart
Text GrabStart
button3 Name BtnGrabStop
Text GrabStop
button4 Name BtnClose
Text Disconnect

 

3-3. 코드 입력

 

  • 각 버튼을 더블클릭하여 이벤트를 생성한 후 코드를 입력한다.
using Basler.Pylon;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BaslerContinueShotGrab
{
    public partial class Form1 : Form
    {
        private Camera camera;
        private PixelDataConverter converter;

        public Form1()
        {
            InitializeComponent();
            camera = new Camera();
            camera.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed;
            converter = new PixelDataConverter();
        }

        private void StreamGrabber_ImageGrabbed(object sender, ImageGrabbedEventArgs e)
        {
            IGrabResult grabResult = e.GrabResult;
            if (grabResult.GrabSucceeded)
            {
                Bitmap bitmap = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
                BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
                IntPtr ptrBmp = bmpData.Scan0;
                converter.OutputPixelFormat = PixelType.BGRA8packed;
                converter.Convert(ptrBmp, bmpData.Stride * bitmap.Height, grabResult);
                bitmap.UnlockBits(bmpData);
                if (InvokeRequired)
                {
                    BeginInvoke(new Action(() =>
                    {
                        Bitmap bitmapOld = pictureBox1.Image as Bitmap;
                        pictureBox1.Image = bitmap;
                        if (bitmapOld != null)
                        {
                            bitmapOld.Dispose();
                        }
                    }));
                }
            }
        }

        private void BtnOpen_Click(object sender, EventArgs e)
        {
            camera.Open();
            camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
        }

        private void BtnGrabStart_Click(object sender, EventArgs e)
        {
            camera.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
        }

        private void BtnGrabStop_Click(object sender, EventArgs e)
        {
            camera.StreamGrabber.Stop();
        }

        private void BtnClose_Click(object sender, EventArgs e)
        {
            camera.Close();
        }
    }
}

 

3.4 구문 설명

 

camera.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed;
  • OneShotGrab과 달리 이벤트를 받아서 구현해보자
  • 대부분의 프로젝트에서는 이벤트로 구현하는 경우가 더 많기때문에 자주 쓰이게 되는 이벤트다.
  • ImageGrabbed 이벤트는 카메라의 이미지 취득이 완료되면 발생한다.

 

if (InvokeRequired)
{
    BeginInvoke(new Action(() =>
    {
        Bitmap bitmapOld = pictureBox1.Image as Bitmap;
        pictureBox1.Image = bitmap;
        if (bitmapOld != null)
        {
            bitmapOld.Dispose();
        }
    }));
}
  • StreamGrabber_ImageGrabbed 함수 내부는 UI쓰레드와 다른 쓰레드로 동작한다
  • 그래서 OneShotGrab과 다르게 비동기 Invoke함수를 이용해서 UI쓰레드에서 bitmap을 pictureBox1에 넣어 처리한다.
private void BtnOpen_Click(object sender, EventArgs e)
{
    camera.Open();
    camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
}
  • camera.Parameters 프로퍼티
    • 바슬러 카메라의 전반적인 프로퍼티들을 설정할 수 있는 IParameterCollection 인터페이스
    • 다양한 struct를 IEnumerable<>로 받아서 GetValue(), SetValue()로 제어할 수 있다.
    • PLCamera.AcquisitionMode를 Continuous로 하면 그랩 함수를 한번 실행했을 때 Stop할 때까지 연속 그랩한다.

나머지 부분은 OneShotGrab과 동일하다

 

3.5 결과

 

  • Connect > Grab Start > Grab Stop > Disconnect

'Basler' 카테고리의 다른 글

5. Reconnect Camera  (1) 2024.02.16
4. Multi Camera Grab  (0) 2024.02.15
2. One shot Grab  (0) 2024.02.11
1. c# 작업 환경 만들기  (0) 2024.02.08

+ Recent posts