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 allCameras = new List(); //Basler裡將相機採集到的圖像轉換成位圖 PixelDataConverter pxConvert = new PixelDataConverter(); //控制相機採集圖片的過程! public bool Graber; public bool freed; public bool trigger; //第一步初始化相機 所用的cameras里的事件然后绑定自己寫好的事件 public void CameraInit() { // 獲取所有可用相機的列表 List allCameraInfos = CameraFinder.Enumerate(); // 創建一個字典來儲存每個相機的識別碼和相機物件 Dictionary cameras = new Dictionary(); 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(); } } /// /// 斷開連接 /// public void Close() { for (int i = 0; i < allCameras.Count; i++) { //停止連接 allCameras[i].StreamGrabber.Stop(); } //釋放相機資源 DestroyCamera(); } /// /// 擷取圖片 /// /// /// // 創建一個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]); // } // } //} /// /// 開始擷取 /// /// /// private void StreamGrabber_GrabStarted(object sender, EventArgs e) { Graber = true; } /// /// 釋放相機 /// 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; } } /// /// 將相機圖相轉成Bitmap /// /// /// 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