实例介绍
【实例简介】
【实例截图】
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论