Basler相機
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Basler.Pylon; using System.Windows.Forms; using System.Drawing; using System.IO; using System.Diagnostics; using System.Threading; using HalconDotNet; namespace Lead { public class Basler_SDK_Mono { public Camera camera; public Bitmap bitmap; public Bitmap CopyBitmap; private int CameraIndex; public bool GrabFlag = false; // Basler.Pylon.PixelDataConverter _conveter; AutoResetEvent _resetEvent = new AutoResetEvent(true); public Basler_SDK_Mono(string CameraSN, int Camera_Index) { try { camera = new Camera(CameraSN); this.CameraIndex = Camera_Index; } catch { } } //打開相機 public bool OpenCamera() { try { if (!camera.IsOpen) { camera.Open(); camera.StreamGrabber.ImageGrabbed += OnImageGrabbed; camera.Parameters[PLCamera.TriggerSelector].TrySetValue("FrameStart"); camera.Parameters[PLCamera.TriggerMode].TrySetValue("On"); camera.Parameters[PLCamera.TriggerSource].TrySetValue("Software"); camera.Parameters[PLCamera.TriggerActivation].TrySetValue("Falling Edge"); //camera.Parameters[PLCamera.FrameTimeoutAbs].TrySetValue(20000); camera.StreamGrabber.Start(GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber); BitmapFactory.CreateBitmap(out bitmap, (int)camera.Parameters[PLCamera.Width].GetValue(), (int)camera.Parameters[PLCamera.Height].GetValue(), false); //switch (CameraIndex) //{ // case 1: // { // SetCameraParam("ExposureTimeAbs", "600"); // } // break; // case 2: // { // SetCameraParam("ExposureTimeAbs", "600"); // } // break; // case 3: // { // SetCameraParam("ExposureTimeAbs", "600"); // } // break; // default: // break; //} } return true; } catch (Exception ex) { return false; } } //開始采集 public bool StartStream() { try { if (camera.IsOpen) { camera.StreamGrabber.Start(GrabStrategy.LatestImages, GrabLoop.ProvidedByStreamGrabber); } return true; } catch (Exception ex) { return false; } } public bool StopStream() { try { if (camera.StreamGrabber.IsGrabbing) { camera.StreamGrabber.Stop(); } return true; } catch (Exception ex) { return false; } } //抓取圖像 //object LockObj = new object(); private void OnImageGrabbed(Object sender, ImageGrabbedEventArgs e) { try { IGrabResult grabResult = e.GrabResult; long ImageNo = grabResult.ImageNumber; if (grabResult.GrabSucceeded) { Debug.WriteLine(grabResult.ImageNumber); byte[] buffer = grabResult.PixelData as byte[]; BitmapFactory.UpdateBitmap(bitmap, buffer, grabResult.Width, grabResult.Height, false); CopyBitmap = (Bitmap)bitmap.Clone(); 打開圖像處理線程 //Task RunToolBlock_1 = new Task(() => MachineMaster.Camera1_Run()); //Task RunToolBlock_2 = new Task(() => MachineMaster.Camera2_Run()); //Task RunToolBlock_3 = new Task(() => MachineMaster.Camera3_Run()); switch (CameraIndex) { case 1: //離線存圖 MachineMaster.halcon.ho_ShowImage1 = MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap); { switch (MachineMaster.strBGside+MachineMaster.strLightNo) { case "S1": if (MachineMaster.AutoRunEnable_Camera1 && MachineMaster.AutoRunFlag_Camera1) { ImageInfo ImageInfo = new ImageInfo() { Image = MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), Index = ImageNo }; if (MachineMaster.LstImage_1.Find(x => x.Index == ImageNo) == null) { MachineMaster.LstImage_1.Add(ImageInfo); } new Action(() => { MachineMaster.VImageProcess_1_1(MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), ImageNo); }).BeginInvoke(null, null); } break; case "S2": if (MachineMaster.AutoRunEnable_Camera1 && MachineMaster.AutoRunFlag_Camera1) { ImageInfo ImageInfo = new ImageInfo() { Image = MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), Index = ImageNo }; if (MachineMaster.LstImage_1.Find(x => x.Index == ImageNo) == null) { MachineMaster.LstImage_1.Add(ImageInfo); } new Action(() => { MachineMaster.VImageProcess_1_2(MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), ImageNo); }).BeginInvoke(null, null); } break; case "S1;2": if (MachineMaster.AutoRunEnable_Camera1 && MachineMaster.AutoRunFlag_Camera1) { ImageInfo ImageInfo = new ImageInfo() { Image = MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), Index = ImageNo }; if (MachineMaster.LstImage_1.Find(x => x.Index == ImageNo) == null) { MachineMaster.LstImage_1.Add(ImageInfo); } new Action(() => { //MachineMaster.VImageProcess_1_12(MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), ImageNo); }).BeginInvoke(null, null); } break; default: break; } } break; case 2: { MachineMaster.halcon.ho_ShowImage2 = MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap); switch (MachineMaster.strLightNo) { case "1": if (MachineMaster.AutoRunEnable_Camera2 && MachineMaster.AutoRunFlag_Camera2) { ImageInfo ImageInfo = new ImageInfo() { Image = MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), Index = ImageNo }; if (MachineMaster.LstImage_1.Find(x => x.Index == ImageNo) == null) { MachineMaster.LstImage_1.Add(ImageInfo); } new Action(() => { // MachineMaster.ImageProcess_2_1(MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), ImageNo); }).BeginInvoke(null, null); } break; case "2": if (MachineMaster.AutoRunEnable_Camera2 && MachineMaster.AutoRunFlag_Camera2) { ImageInfo ImageInfo = new ImageInfo() { Image = MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), Index = ImageNo }; if (MachineMaster.LstImage_1.Find(x => x.Index == ImageNo) == null) { MachineMaster.LstImage_1.Add(ImageInfo); } new Action(() => { //MachineMaster.ImageProcess_2_2(MachineMaster.halcon.HImageConvertFromBitmap8(CopyBitmap), ImageNo); }).BeginInvoke(null, null); } break; default: break; } } break; } GrabFlag = true; _resetEvent.Set(); } else { //MessageBox.Show("grabResult.NoGrabSucceeded"); _resetEvent.Set(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } public bool StartGrab() { try { if (camera == null) { return false; } if (!camera.IsOpen) { return false; } int index = 1; while (true) { if (index == 10) { throw new Exception("Fail to WaitForFrameTriggerReady!"); } if (false == camera.WaitForFrameTriggerReady(100, TimeoutHandling.Return)) { index++; Thread.Sleep(50); continue; } _resetEvent.Reset(); camera.ExecuteSoftwareTrigger(); _resetEvent.WaitOne(); break; } //if (camera.WaitForFrameTriggerReady(100, TimeoutHandling.ThrowException)) //{ // _resetEvent.Reset(); // camera.ExecuteSoftwareTrigger(); // _resetEvent.WaitOne(); //} if (!GrabFlag) { Thread.Sleep(300); index = 1; while (true) { if (index == 10) { throw new Exception("Fail to WaitForFrameTriggerReady!"); } if (!camera.WaitForFrameTriggerReady(1000, TimeoutHandling.Return)) { index++; Thread.Sleep(50); continue; } _resetEvent.Reset(); camera.ExecuteSoftwareTrigger(); _resetEvent.WaitOne(); break; } } return true; } catch (Exception ex) { MessageBox.Show(ex.Message); return false; } } public bool SetCameraParam(string ParamType, string ParamValue) { try { switch (ParamType) { case "ExposureTimeAbs": { if (!camera.Parameters[PLCamera.ExposureTimeAbs].TrySetValue(double.Parse(ParamValue))) { return false; } } break; case "TriggerSource": { if (!camera.Parameters[PLCamera.TriggerSource].TrySetValue(ParamValue)) { return false; } } break; default: break; } return true; } catch (Exception e) { MessageBox.Show(e.ToString()); return false; } } //關閉相機 public void CloseCamera() { try { if (camera == null) return; //if (camera.StreamGrabber.IsGrabbing) //{ // camera.StreamGrabber.Stop(); //} if (camera.IsOpen) { camera.Close(); } } catch (Exception e) { MessageBox.Show(e.Message); } } } }