3.1 Winform 프로젝트 만들기
- Basler 솔루션 안에 BaslerContinueShotGrab이라는 이름으로 Windows Forms 앱 (.NET Framework) 프로젝트를 만들고 C#작업환경 만들기를 참조하여 Basler.Pylon.dll을 참조 추가한다.
2024.02.08 - [Basler] - 1. c# 작업 환경 만들기
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 |