300 lines
10 KiB
C#
300 lines
10 KiB
C#
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("該相機已停止擷取");
|
||
}
|
||
}
|
||
}
|
||
}
|