6.1 개요

  • chunk data를 이용하면 grabResult에서 frame관련 data들을 얻을 수 있다.
  • 예제에서는 frame counter를 textbox에 나타내 본다.

 

6.2 Winform 프로젝트 만들기

  •  Basler 솔루션 안에 BaslerChunkData라는 이름으로 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

 

6.3 UI 디자인

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

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

 

6.4 코드 입력

 

  • 각 버튼을 더블클릭하여 이벤트를 생성한 후 코드를 입력한다.
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 BaslerChunkData
{
    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 BtnOpen_Click(object sender, EventArgs e)
        {
            OpenCamera();
            camera.Parameters[PLCamera.ChunkModeActive].SetValue(true);
            camera.Parameters[PLCamera.ChunkSelector].SetValue(PLCamera.ChunkSelector.Framecounter);
            camera.Parameters[PLCamera.ChunkEnable].SetValue(true);
        }

        private void BtnGrab_Click(object sender, EventArgs e)
        {
            camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
            camera.StreamGrabber.Start(1, GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
        }

        private void BtnClose_Click(object sender, EventArgs e)
        {
            camera.Parameters[PLCamera.ChunkModeActive].SetValue(false);
            camera.Close();
        }

        private void StreamGrabber_ImageGrabbed(object sender, ImageGrabbedEventArgs e)
        {
            IGrabResult grabResult = e.GrabResult;
            long frameCounter = grabResult.ChunkData[PLChunkData.ChunkFramecounter].GetValue();
            BeginInvoke(new Action(() =>
            {
                textBox1.Text = frameCounter.ToString();
            }));
        }

        private void OpenCamera()
        {
            int timeOutMs = 1000;
            try
            {
                camera.Open();
            }
            catch (Exception)
            {
                System.Threading.Thread.Sleep(1000);
                if (!camera.IsConnected)
                {
                    camera.Close();
                    camera.Open(timeOutMs, TimeoutHandling.Return);
                }
            }
            camera.Parameters[PLTransportLayer.HeartbeatTimeout].TrySetValue(timeOutMs, IntegerValueCorrection.Nearest);
        }
    }
}

 

6.5 구문 설명

 

private void BtnOpen_Click(object sender, EventArgs e)
{
    OpenCamera(camera);
    camera.Parameters[PLCamera.ChunkModeActive].SetValue(true);
    camera.Parameters[PLCamera.ChunkSelector].SetValue(PLCamera.ChunkSelector.Framecounter);
    camera.Parameters[PLCamera.ChunkEnable].SetValue(true);
}
  • 구문이 필요없이 증가하기 때문에 기존 BtnOpen_Click이벤트에 들어가 있던 구문은 OpenCamera라는 이름의 함수로 빼서 설명한다.
  • ChunkModeActive를 true로 set하고 Selector에서 Framecounter를 선택하여 ChunkEnable을 true로 한다.
  • ChunkSelector에서 다른 data를 추가 선택하고 마지막에 ChunkEnable을 set하면 data가 추가된다.

 

private void BtnGrab_Click(object sender, EventArgs e)
{
    camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
    camera.StreamGrabber.Start(1, GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
  • One shot Grab을 다르게 구현해보자
  • AcquisitionMode를 SingleFrame으로 설정하고 Start함수의 첫번째 매개변수에 maxImages 값을 1로 설정한다.
  • 이렇게 하면 Continue shot grab처럼 움직이되 maxImages값이 되면 자동으로 Stop()함수를 실행시킨다.
  • 만약 AcquisitionMode를 Continuous로 설정하게 되면 StreamGrabber_ImageGrabbed함수는 1번만 호출되지만 Framecounter가 1이 아닌 2가 증가할 때도 나온다. Stop()함수가 실행되기 전에 내부적으로 2번 그랩이 되는것으로 추정된다. maxImages를 증가해보면 counter가 더 많이 증가한채로 이벤트가 실행되는 것을 보게 된다.
private void BtnClose_Click(object sender, EventArgs e)
{
    camera.Parameters[PLCamera.ChunkModeActive].SetValue(false);
    camera.Close();
}

 

  • 카메라를 Close하기 전에 ChunkModeActive를 false로 한다.
private void StreamGrabber_ImageGrabbed(object sender, ImageGrabbedEventArgs e)
{
    IGrabResult grabResult = e.GrabResult;
    long frameCounter = grabResult.ChunkData[PLChunkData.ChunkFramecounter].GetValue();
    BeginInvoke(new Action(() =>
    {
        textBox1.Text = frameCounter.ToString();
    }));
}
  • grabResult.ChunkData Collection에 파라미터 name을 PLChunkData.ChunkFramecounter로 넣고 getvalue()를 하면 값이 long인 framecounter가 반환된다.

6.6 결과

+ Recent posts