Basler_connect/WindowsFormsApp1/Basler.cs
2025-01-18 14:03:40 +08:00

300 lines
10 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("該相機已停止擷取");
}
}
}
}