Basler_connect/WindowsFormsApp1/Basler.cs

300 lines
10 KiB
C#
Raw Normal View History

2025-01-18 14:03:40 +08:00
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Basler.Pylon;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace WindowsFormsApp1
{
public class Basler
{
private readonly Form1 form;
public Basler(Form1 form)
{
this.form = form;
}
//連接相機各數
public int CameraNumber = CameraFinder.Enumerate().Count;
// 共享的鎖
private readonly object lockObject = new object();
//委託+事件=回調函數,用於傳遞相機抓取的圖像
public delegate void CameraImage(Bitmap bmp, int cameraIndex);
public event CameraImage CameraImageEvent;
//委託+事件=回調函數,用於傳遞相機抓取的圖像
//public delegate void CameraImage1(Bitmap bmp1);
//public event CameraImage1 CameraImageEvent1;
// 創建一個列表來儲存所有的相機
List<Camera> allCameras = new List<Camera>();
//Basler裡將相機採集到的圖像轉換成位圖
PixelDataConverter pxConvert = new PixelDataConverter();
//控制相機採集圖片的過程!
public bool Graber;
public bool freed;
public bool trigger;
//第一步初始化相機 所用的cameras里的事件然后绑定自己寫好的事件
public void CameraInit()
{
// 獲取所有可用相機的列表
List<ICameraInfo> allCameraInfos = CameraFinder.Enumerate();
// 創建一個字典來儲存每個相機的識別碼和相機物件
Dictionary<string, Camera> cameras = new Dictionary<string, Camera>();
foreach (ICameraInfo cameraInfo in allCameraInfos)
{
// 創建一個新的相機物件
Camera camera0 = new Camera(cameraInfo);
// 獲取相機的識別碼
string id = camera0.CameraInfo[CameraInfoKey.SerialNumber];
Console.WriteLine(id);
// 將相機物件儲存到字典中
cameras[id] = camera0;
}
Graber = true;
freed = true;
//相當於初始化了一下相機的動態鏈庫 可以調用Camera裡面的東西
// 清空 allCameras 列表
allCameras.Clear();
// 將字典中的所有相機添加到列表中
foreach (string id in cameras.Keys)
{
allCameras.Add(cameras[id]);
}
// 為每個相機設定事件處理程序
for (int i = 0; i < allCameras.Count; i++)
{
//自由連接模式
//當連接到像機自動適應此配置
//打开後添加到Basler.Pylon.ICamera中。
allCameras[i].CameraOpened += Configuration.AcquireContinuous;
//抓取开始事件
allCameras[i].StreamGrabber.GrabStarted += StreamGrabber_GrabStarted;
//抓取圖片事件
//allCameras[i].StreamGrabber.ImageGrabbed += (sender, e) => StreamGrabber_ImageGrabbed(sender, e, i);
//打开相機
allCameras[i].Open();
}
}
/// <summary>
/// 斷開連接
/// </summary>
public void Close()
{
for (int i = 0; i < allCameras.Count; i++)
{
//停止連接
allCameras[i].StreamGrabber.Stop();
}
//釋放相機資源
DestroyCamera();
}
/// <summary>
/// 擷取圖片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
// 創建一個Bitmap類型的陣列來存儲影像
private readonly Bitmap[] images;
// 定義一個可以存放 IGrabResult 物件的陣列
private readonly IGrabResult[] grabResults;
private void StreamGrabber_ImageGrabbed(object sender, ImageGrabbedEventArgs e, int cameraIndex)
{
lock (lockObject)
{
IGrabResult grabResult = e.GrabResult;
if (grabResult.IsValid && Graber)
{
//委托就用到了!
CameraImageEvent(GrabResult2Bmp(grabResult), cameraIndex);
}
}
}
//private void StreamGrabber_ImageGrabbed1(object sender, ImageGrabbedEventArgs e)
//{
// lock (lockObject)
// {
// IGrabResult grabResult1 = e.GrabResult;
// if (grabResult1.IsValid && Graber)
// {
// // 將 IGrabResult 物件存入陣列
// grabResults[1] = grabResult1;
// // 在需要時轉換為 Bitmap 物件
// images[1] = GrabResult2Bmp(grabResults[1]);
// //委托就用到了!
// CameraImageEvent1(images[1]);
// }
// }
//}
/// <summary>
/// 開始擷取
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void StreamGrabber_GrabStarted(object sender, EventArgs e)
{
Graber = true;
}
/// <summary>
/// 釋放相機
/// </summary>
public void DestroyCamera()
{
if (freed == true)
{
for (int i = 0; i < allCameras.Count; i++)
{
allCameras[i].Close();
allCameras[i].Dispose();
}
freed = false;
Graber = false;
trigger = false;
MessageBox.Show("相機已斷開連接");
}
else
{
return;
}
}
/// <summary>
/// 將相機圖相轉成Bitmap
/// </summary>
/// <param name="grabResult"></param>
/// <returns></returns>
Bitmap GrabResult2Bmp(IGrabResult grabResult)
{
// PixelFormat format:新的像素格式 System.Drawing.Bitmap。 这必须指定一个值,开头 Format。(参1:图宽参2:图高参3:像素格式)
Bitmap b = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppArgb);
//BitmapData:指定位图像的属性
BitmapData bitmapData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);
//PixelType.BGRA8packed:抓取结果返回像素类型,由图像处理支持类使用
pxConvert.OutputPixelFormat = PixelType.BGRA8packed;
IntPtr bmpIntpr = bitmapData.Scan0;
pxConvert.Convert(bmpIntpr, bitmapData.Stride * b.Height, grabResult);
b.UnlockBits(bitmapData);
return b;
}
public void judge(int i)
{
if (trigger == false)
{
trigger = true;
allCameras[i].StreamGrabber.ImageGrabbed += (sender, e) => StreamGrabber_ImageGrabbed(sender, e, i);
}
else
{
return;
}
}
public void OneShot(int i)
{
judge(i);
if (Graber == true)
{
if (i<CameraNumber)
{
//PLCamera:所有可用于basler摄像机设备dByStre的参数名称列表 SingleFrame启用单帧采集模式。
allCameras[i].Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
allCameras[i].StreamGrabber.Start(1, GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
else
{
MessageBox.Show("請確保連接相機數量!!");
}
}
else
{
MessageBox.Show("請連接相機!!");
}
}
public void KeepShot(int i)
{
judge(i);
if (i == 0)
{
form.button3.Enabled = true;
}
else if (i == 1)
{
form.button7.Enabled = true;
}
if (Graber == true)
{
if (i < CameraNumber)
{
//Continuous啟用連續採集模式。
allCameras[i].Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
//camera.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
lock (lockObject)
{
//GrabStrategy.OneByOne:默認抓取策略
//GrabLoop.ProvidedByStreamGrabber:定義額外線呈的使用
allCameras[i].StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
}
else
{
MessageBox.Show("請確保連接相機數量!!");
}
}
else
{
MessageBox.Show("請連接相機!!");
}
}
public void Stop(int i)
{
if (allCameras != null)
{
if (i < CameraNumber)
{
//擷取停止
allCameras[i].StreamGrabber.Stop();
}
else
{
MessageBox.Show("請確保連接相機數量!!");
}
}
else
{
MessageBox.Show("該相機已停止擷取");
}
}
}
}