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 결과
