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抠出来然后重新整合的一个类

posted @   冰糖小袁子  阅读(679)  评论(1编辑  收藏  举报
编辑推荐:
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示