实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using PylonLiveView; using PylonC.NETSupportLibrary; using HalconDotNet; namespace Balser { public partial class MainForm : Form { private ImageProvider m_imageProvider = new ImageProvider(); /* Create one image provider. */ private Bitmap m_bitmap = null; /* The bitmap is used for displaying the image. */ public HObject ho_Image, ho_Edges; public MainForm() { InitializeComponent(); /* Register for the events of the image provider needed for proper operation. */ m_imageProvider.GrabErrorEvent = new ImageProvider.GrabErrorEventHandler(OnGrabErrorEventCallback); m_imageProvider.DeviceRemovedEvent = new ImageProvider.DeviceRemovedEventHandler(OnDeviceRemovedEventCallback); m_imageProvider.DeviceOpenedEvent = new ImageProvider.DeviceOpenedEventHandler(OnDeviceOpenedEventCallback); m_imageProvider.DeviceClosedEvent = new ImageProvider.DeviceClosedEventHandler(OnDeviceClosedEventCallback); m_imageProvider.GrabbingStartedEvent = new ImageProvider.GrabbingStartedEventHandler(OnGrabbingStartedEventCallback); m_imageProvider.ImageReadyEvent = new ImageProvider.ImageReadyEventHandler(OnImageReadyEventCallback); m_imageProvider.GrabbingStoppedEvent = new ImageProvider.GrabbingStoppedEventHandler(OnGrabbingStoppedEventCallback); /* Enable the tool strip buttons according to the state of the image provider. */ EnableButtons(m_imageProvider.IsOpen, false); btn_SavePicture.Enabled = false; } /* Handles the event related to the occurrence of an error while grabbing proceeds. */ private void OnGrabErrorEventCallback(Exception grabException, string additionalErrorMessage) { if (InvokeRequired) { /* If called from a different thread, we must use the Invoke method to marshal the call to the proper thread. */ BeginInvoke(new ImageProvider.GrabErrorEventHandler(OnGrabErrorEventCallback), grabException, additionalErrorMessage); return; } ShowException(grabException, additionalErrorMessage); } /* Handles the event related to the removal of a currently open device. */ private void OnDeviceRemovedEventCallback() { if (InvokeRequired) { /* If called from a different thread, we must use the Invoke method to marshal the call to the proper thread. */ BeginInvoke(new ImageProvider.DeviceRemovedEventHandler(OnDeviceRemovedEventCallback)); return; } /* Disable the buttons. */ EnableButtons(false, false); /* Stops the grabbing of images. */ Stop(); /* Close the image provider. */ CloseTheImageProvider(); /* Since one device is gone, the list needs to be updated. */ UpdateDeviceList(); } /* Handles the event related to a device being open. */ private void OnDeviceOpenedEventCallback() { if (InvokeRequired) { /* If called from a different thread, we must use the Invoke method to marshal the call to the proper thread. */ BeginInvoke(new ImageProvider.DeviceOpenedEventHandler(OnDeviceOpenedEventCallback)); return; } /* The image provider is ready to grab. Enable the grab buttons. */ EnableButtons(true, false); } /* Handles the event related to a device being closed. */ private void OnDeviceClosedEventCallback() { if (InvokeRequired) { /* If called from a different thread, we must use the Invoke method to marshal the call to the proper thread. */ BeginInvoke(new ImageProvider.DeviceClosedEventHandler(OnDeviceClosedEventCallback)); return; } /* The image provider is closed. Disable all buttons. */ EnableButtons(false, false); } /* Handles the event related to the image provider executing grabbing. */ private void OnGrabbingStartedEventCallback() { if (InvokeRequired) { /* If called from a different thread, we must use the Invoke method to marshal the call to the proper thread. */ BeginInvoke(new ImageProvider.GrabbingStartedEventHandler(OnGrabbingStartedEventCallback)); return; } /* Do not update device list while grabbing to avoid jitter because the GUI-Thread is blocked for a short time when enumerating. */ updateDeviceListTimer.Stop(); /* The image provider is grabbing. Disable the grab buttons. Enable the stop button. */ EnableButtons(false, true); } /* Handles the event related to an image having been taken and waiting for processing. */ private void OnImageReadyEventCallback() { if (InvokeRequired) { /* If called from a different thread, we must use the Invoke method to marshal the call to the proper thread. */ BeginInvoke(new ImageProvider.ImageReadyEventHandler(OnImageReadyEventCallback)); return; } try { /* Acquire the image from the image provider. Only show the latest image. The camera may acquire images faster than images can be displayed*/ ImageProvider.Image image = m_imageProvider.GetLatestImage(); /* Check if the image has been removed in the meantime. */ if (image != null) { /* Check if the image is compatible with the currently used bitmap. */ if (BitmapFactory.IsCompatible(m_bitmap, image.Width, image.Height, image.Color)) { /* Update the bitmap with the image data. */ BitmapFactory.UpdateBitmap(m_bitmap, image.Buffer, image.Width, image.Height, image.Color); /* To show the new image, request the display control to update itself. */ pictureBox.Refresh(); } else /* A new bitmap is required. */ { BitmapFactory.CreateBitmap(out m_bitmap, image.Width, image.Height, image.Color); BitmapFactory.UpdateBitmap(m_bitmap, image.Buffer, image.Width, image.Height, image.Color); /* We have to dispose the bitmap after assigning the new one to the display control. */ Bitmap bitmap = pictureBox.Image as Bitmap; /* Provide the display control with the new bitmap. This action automatically updates the display. */ pictureBox.Image = m_bitmap; if (bitmap != null) { /* Dispose the bitmap. */ bitmap.Dispose(); } } /* The processing of the image is done. Release the image buffer. */ m_imageProvider.ReleaseImage(); /* The buffer can be used for the next image grabs. */ } } catch (Exception e) { ShowException(e, m_imageProvider.GetLastErrorMessage()); } } /* Handles the event related to the image provider having stopped grabbing. */ private void OnGrabbingStoppedEventCallback() { if (InvokeRequired) { /* If called from a different thread, we must use the Invoke method to marshal the call to the proper thread. */ BeginInvoke(new ImageProvider.GrabbingStoppedEventHandler(OnGrabbingStoppedEventCallback)); return; } /* Enable device list update again */ updateDeviceListTimer.Start(); /* The image provider stopped grabbing. Enable the grab buttons. Disable the stop button. */ EnableButtons(m_imageProvider.IsOpen, false); } /* Helps to set the states of all buttons. */ private void EnableButtons(bool canGrab, bool canStop) { toolStripButtonContinuousShot.Enabled = canGrab; toolStripButtonOneShot.Enabled = canGrab; toolStripButtonStop.Enabled = canStop; } /* Stops the image provider and handles exceptions. */ private void Stop() { /* Stop the grabbing. */ try { m_imageProvider.Stop(); } catch (Exception e) { ShowException(e, m_imageProvider.GetLastErrorMessage()); } } /* Closes the image provider and handles exceptions. */ private void CloseTheImageProvider() { /* Close the image provider. */ try { m_imageProvider.Close(); } catch (Exception e) { ShowException(e, m_imageProvider.GetLastErrorMessage()); } } /* Starts the grabbing of one image and handles exceptions. */ private void OneShot() { try { m_imageProvider.OneShot(); /* Starts the grabbing of one image. */ } catch (Exception e) { ShowException(e, m_imageProvider.GetLastErrorMessage()); } } /* Starts the grabbing of images until the grabbing is stopped and handles exceptions. */ private void ContinuousShot() { try { m_imageProvider.ContinuousShot(); /* Start the grabbing of images until grabbing is stopped. */ } catch (Exception e) { ShowException(e, m_imageProvider.GetLastErrorMessage()); } } private void UpdateDeviceList() { try { /* Ask the device enumerator for a list of devices. */ List<DeviceEnumerator.Device> list = DeviceEnumerator.EnumerateDevices(); ListView.ListViewItemCollection items = deviceListView.Items; /* Add each new device to the list. */ foreach (DeviceEnumerator.Device device in list) { bool newitem = true; /* For each enumerated device check whether it is in the list view. */ foreach (ListViewItem item in items) { /* Retrieve the device data from the list view item. */ DeviceEnumerator.Device tag = item.Tag as DeviceEnumerator.Device; if (tag.FullName == device.FullName) { /* Update the device index. The index is used for opening the camera. It may change when enumerating devices. */ tag.Index = device.Index; /* No new item needs to be added to the list view */ newitem = false; break; } } /* If the device is not in the list view yet the add it to the list view. */ if (newitem) { ListViewItem item = new ListViewItem(device.Name); if (device.Tooltip.Length > 0) { item.ToolTipText = device.Tooltip; } item.Tag = device; /* Attach the device data. */ deviceListView.Items.Add(item); } } /* Delete old devices which are removed. */ foreach (ListViewItem item in items) { bool exists = false; /* For each device in the list view check whether it has not been found by device enumeration. */ foreach (DeviceEnumerator.Device device in list) { if (((DeviceEnumerator.Device)item.Tag).FullName == device.FullName) { exists = true; break; } } /* If the device has not been found by enumeration then remove from the list view. */ if (!exists) { deviceListView.Items.Remove(item); } } } catch (Exception e) { ShowException(e, m_imageProvider.GetLastErrorMessage()); } } /* Shows exceptions in a message box. */ private void ShowException(Exception e, string additionalErrorMessage) { string more = "\n\nLast error message (may not belong to the exception):\n" additionalErrorMessage; MessageBox.Show("Exception caught:\n" e.Message (additionalErrorMessage.Length > 0 ? more : ""), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } private void updateDeviceListTimer_Tick(object sender, EventArgs e) { UpdateDeviceList(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { /* Stops the grabbing of images. */ Stop(); /* Close the image provider. */ CloseTheImageProvider(); } private void Form1_Load(object sender, EventArgs e) { } private void deviceListView_KeyDown(object sender, KeyEventArgs ev) { if (ev.KeyCode == Keys.F5) { ev.Handled = true; /* Update the list of available devices in the upper left area. */ UpdateDeviceList(); } } private void deviceListView_SelectedIndexChanged(object sender, EventArgs ev) { /* Close the currently open image provider. */ /* Stops the grabbing of images. */ Stop(); /* Close the image provider. */ CloseTheImageProvider(); /* Open the selected image provider. */ if (deviceListView.SelectedItems.Count > 0) { /* Get the first selected item. */ ListViewItem item = deviceListView.SelectedItems[0]; /* Get the attached device data. */ DeviceEnumerator.Device device = item.Tag as DeviceEnumerator.Device; try { /* Open the image provider using the index from the device data. */ m_imageProvider.Open(device.Index); } catch (Exception e) { ShowException(e, m_imageProvider.GetLastErrorMessage()); } } } private void toolStripButtonOneShot_Click(object sender, EventArgs e) { OneShot(); /* Starts the grabbing of one image. */ btn_SavePicture.Enabled = true; } private void toolStripButtonContinuousShot_Click(object sender, EventArgs e) { ContinuousShot(); /* Start the grabbing of images until grabbing is stopped. */ btn_SavePicture.Enabled = true; } private void toolStripButtonStop_Click(object sender, EventArgs e) { Stop(); /* Stops the grabbing of images. */ } private void btn_ConnectCamera_Click(object sender, EventArgs e) { UpdateDeviceList(); } private void btn_SavePicture_Click(object sender, EventArgs e) { btn_SavePicture.Enabled = false; string data,ImageName,direct; data = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss"); ImageName = "Image" data ".bmp"; direct="D:\\MyData\\Pictures\\视觉采样\\" ImageName; m_bitmap.Save(direct, System.Drawing.Imaging.ImageFormat.Bmp); btn_SavePicture.Enabled = true; } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论