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抠出来然后重新整合的一个类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义