Basler相机SDK取像(Halcon显示)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HalconDotNet;
using Basler.Pylon;
using System.Runtime.InteropServices;
namespace MyCamSDK
{
public class BaslerCam
{
private Camera camera = null;
public delegate void ImageEventHandler(object sender, ImageEventArgs e);
public event ImageEventHandler ImageEvent;
private PixelDataConverter converter = new PixelDataConverter();
private HObject img;
private HObject himg_black = new HObject();
public Camera Camera
{
get { return camera; }
set { camera = value; }
}
public BaslerCam(string cameraSN)
{
camera = new Camera(cameraSN);
camera.CameraOpened += Configuration.AcquireContinuous;
//ContinuousShot();
camera.StreamGrabber.ImageGrabbed += OnImageGrabbed;
camera.Open();
}
protected void OnImageEvent(HObject image8Grey)
{
ImageEventArgs imageEventargs = new ImageEventArgs(image8Grey);
if (ImageEvent != null)
ImageEvent(this, imageEventargs);
}
public void OneShot()
{
try
{
// Starts the grabbing of one image.
camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
camera.StreamGrabber.Start(1, GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
catch (Exception)
{ }
}
public void ContinuousShot()
{
try
{
// Start the grabbing of images until grabbing is stopped.
camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
camera.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
}
catch (Exception)
{
//
}
}
public void Stop()
{
// Stop the grabbing.
try
{
camera.StreamGrabber.Stop();
}
catch (Exception)
{
//
}
}
public void SetCameraParams(double exposure, double gain)
{
if (camera.Parameters.Contains(PLCamera.Gain))
{
camera.Parameters[PLCamera.Gain].SetValue(gain);
}
else
camera.Parameters[PLCamera.GainAbs].SetValue(gain);
if (camera.Parameters.Contains(PLCamera.ExposureTimeAbs))
camera.Parameters[PLCamera.ExposureTimeAbs].SetValue(exposure);
else
camera.Parameters[PLCamera.ExposureTime].SetValue(exposure);
}
private void OnImageGrabbed(Object sender, ImageGrabbedEventArgs e)
{
//if (InvokeRequired)
//{
// // If called from a different thread, we must use the Invoke method to marshal the call to the proper GUI thread.
// // The grab result will be disposed after the event call. Clone the event arguments for marshaling to the GUI thread.
// BeginInvoke(new EventHandler<ImageGrabbedEventArgs>(OnImageGrabbed), sender, e.Clone());
// return;
//}
if (e.GrabResult.GrabSucceeded)
{
byte[] pixelData = e.GrabResult.PixelData as byte[];
IntPtr pixelPointer = Marshal.UnsafeAddrOfPinnedArrayElement(pixelData, 0);
try
{
Marshal.Copy(pixelData, 0, pixelPointer, pixelData.Length);
if (e.GrabResult.PixelTypeValue == PixelType.Mono8)
{
HOperatorSet.GenImage1(out img, "byte", e.GrabResult.Width, e.GrabResult.Height, pixelPointer);
OnImageEvent(img);//在这里用事件将图片传出去
}
else
{
HOperatorSet.CopyImage(himg_black, out img);
OnImageEvent(img);
}
}
finally
{
//image_event.Set(); //Marshal.FreeHGlobal(pixelPointer);
}
}
}
}
public class BaslerImageEventArgs
{
public HObject cogImage;
public BaslerImageEventArgs(HObject cogImage8)
{
cogImage = cogImage8;
}
}
}
前面是我把自带的SDK抠出来然后重新整合的一个类