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