2021-10-18 Basler相机曝光值SDK的设置

由于我们的一个项目需要用到将Basler相机的曝光值进行设置,所以今天我用C#将Basler的曝光值的SDK引用了一下。
先百度了一个网上的Basler SDK的例子,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HalconDotNet;
using Basler.Pylon;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Basler
{
    class BaslerSDK
    {
        List<ICameraInfo> allCameras = null;//创建ICameraInfo对象的列表,用于保存遍历到的所有相机信息
        Camera myCamera = null;//创建相机对象
        HImage image = null;

        public BaslerSDK(string sn)
        {

        }
        public BaslerSDK()
        { 
        
        }
        public int connectCamera(string id)//连接相机,返回-1为失败,0为成功
        {
            string m_SerialNumber = "23176929";//接收设备返回的序列号
            allCameras = CameraFinder.Enumerate();//获取所有相机设备
            for (int i = 0; i < allCameras.Count; i++)
            {
                try
                {
                    if (allCameras[i][CameraInfoKey.SerialNumber] == id)
                    {
                        //如果当前相机信息中序列号是指定的序列号,则实例化相机类
                        myCamera = new Camera(allCameras[i]);
                        myCamera.Open();//打开相机
                        return 0;
                    }
                    continue;
                }
                catch(Exception e)
                {
                    System.Console.WriteLine(e.ToString());
                    MessageBox.Show(e.ToString());
                    return -1;
                }
            }
            return -1;
        }

        public int startCamera()//相机开始采集,返回-1为失败,0为成功
        {
            try
            {
                myCamera.StreamGrabber.Start();
            }
            catch
            {
                return -1;
            }
            return 0;
        }

        public int stopCamera()//停止相机采集,返回-1为失败,1为成功
        {
            try
            {
                myCamera.StreamGrabber.Stop();
            }
            catch
            {
                return -1;
            }
            return 0;
        }

        public int closeCamera()//关闭相机,返回-1为失败,1为成功
        {
            try
            {
                myCamera.Close();
            }
            catch
            {
                return -1;
            }
            return 0;
        }

        public int softTrigger()//发送软触发命令
        {
            try
            {
                myCamera.ExecuteSoftwareTrigger();
            }
            catch
            {
                return -1;
            }
            return 0;
        }

        public HImage ReadBuffer()//读取相机buffer并生成HImage格式的图像
        {
            IGrabResult grabResult = myCamera.StreamGrabber.RetrieveResult(4000, TimeoutHandling.ThrowException);//读取buffer,超时时间为4000ms
            image = new HImage();
            using (grabResult)
            {
                if (grabResult.GrabSucceeded)
                {
                    if (IsMonoData(grabResult))
                    {
                        //如果是黑白图像,则利用GenImage1算子生成黑白图像
                        byte[] buffer = grabResult.PixelData as byte[];
                        IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0);
                        image.GenImage1("byte", grabResult.Width, grabResult.Height, p);
                    }
                    else
                    {
                        if (grabResult.PixelTypeValue != PixelType.RGB8packed)
                        {
                            //如果图像不是RGB8格式,则将图像转换为RGB8,然后生成彩色图像
                            //因为GenImageInterleaved算子能够生成的图像的数据,常见的格式只有RGB8
                            //如果采集的图像是RGB8则不需转换,具体生成图像方法请自行测试编写。
                            byte[] buffer_rgb = new byte[grabResult.Width * grabResult.Height * 3];
                            Basler.Pylon.PixelDataConverter convert = new PixelDataConverter();
                            convert.OutputPixelFormat = PixelType.RGB8packed;
                            convert.Convert(buffer_rgb, grabResult);
                            IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(buffer_rgb, 0);
                            image.GenImageInterleaved(p, "rgb", grabResult.Width, grabResult.Height, 0, "byte", grabResult.Width, grabResult.Height, 0, 0, -1, 0);
                        }
                    }
                    return image;
                }
                else
                {
                    return null;
                }
            }
        }

        public int setExposureTime(long ExposureTimeNum)//设置曝光时间us
        {
            try
            {
                myCamera.Parameters[PLCamera.ExposureTimeAbs].SetValue(ExposureTimeNum);
                System.Console.WriteLine("setExposureTime 1000");
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.ToString());
                return -1;
            }
            return 0;
        }

        public int pixelFormat(uint pixelType)//设置图像格式
        {
            //1:Mono8 2:彩色YUV422
            try
            {
                if (pixelType == 1)
                {
                    myCamera.Parameters[PLCamera.PixelFormat].TrySetValue(PLCamera.PixelFormat.Mono8);
                }
                else if (pixelType == 2)
                {
                    myCamera.Parameters[PLCamera.PixelFormat].TrySetValue(PLCamera.PixelFormat.YUV422Packed);
                }
            }
            catch
            {
                return -1;
            }
            return 0;
        }

        public int setHeight(long height)//设置图像高度
        {
            try
            {
                if (myCamera.Parameters[PLCamera.Height].TrySetValue(height))
                    return 0;
                else
                    return -1;
            }
            catch
            {
                return -1;
            }
        }

        public int setWidth(long width)//设置图像宽度
        {
            try
            {
                if (myCamera.Parameters[PLCamera.Width].TrySetValue(width))
                    return 0;
                else
                    return -1;
            }
            catch
            {
                return -1;
            }
        }

        public int setOffsetX(long offsetX)//设置图像水平偏移
        {
            try
            {
                if (myCamera.Parameters[PLCamera.OffsetX].TrySetValue(offsetX))
                    return 0;
                else
                    return -1;
            }
            catch
            {
                return -1;
            }
        }

        public int setOffsetY(long offsetY)//设置图像竖直偏移
        {
            try
            {
                if (myCamera.Parameters[PLCamera.OffsetY].TrySetValue(offsetY))
                    return 0;
                else
                    return -1;
            }
            catch
            {
                return -1;
            }
        }

        public int setTriggerMode(uint TriggerModeNum)//设置触发模式
        {
            //1:为On 触发模式
            //0:Off 触发模式
            try
            {
                if (myCamera.Parameters[PLCamera.TriggerMode].TrySetValue(TriggerModeNum == 1 ? "On" : "Off"))
                    return 0;
                else
                    return -1;
            }
            catch
            {
                return -1;
            }
        }

        public int closeBalanceAuto()//关闭自动白平衡
        {
            try
            {
                myCamera.Parameters[PLCamera.BalanceWhiteAuto].TrySetValue("Off");
            }
            catch
            {
                return -1;
            }
            return 0;
        }

        public int setTriggerSource(uint TriggerSourceNum)//设置触发源
        {
            //直接改为软触发,此处已经写死
            try
            {
                if (myCamera.Parameters[PLCamera.TriggerSource].TrySetValue("Software"))
                    return 0;
                else
                    return -1;
            }
            catch
            {
                return -1;
            }
        }

        private Boolean IsMonoData(IGrabResult iGrabResult)//判断图像是否为黑白格式
        {
            switch (iGrabResult.PixelTypeValue)
            {
                case PixelType.Mono1packed:
                case PixelType.Mono2packed:
                case PixelType.Mono4packed:
                case PixelType.Mono8:
                case PixelType.Mono8signed:
                case PixelType.Mono10:
                case PixelType.Mono10p:
                case PixelType.Mono10packed:
                case PixelType.Mono12:
                case PixelType.Mono12p:
                case PixelType.Mono12packed:
                case PixelType.Mono16:
                    return true;
                default:
                    return false;
            }
        }
    }
}

然后需要从网上下载一个Basler.Pylon.dll文件放入到dll目录中,C#项目需要引用到它。
C#项目的引用属于基本操作,需要熟悉起来。
比如在这里,我把BaslerSDK.cs放到了VisionGumming下面,
在这里插入图片描述
鼠标右键“引用”,“添加引用”,
在这里插入图片描述
在右下角的“浏览…”按钮可以把实际目录中的dll文件找到,并且“确定”,打上勾。
然后在界面上拉一个button,输入如下的代码:

private void button1_Click(object sender, EventArgs e)
{
            BaslerSDK camera = new BaslerSDK();//创建相机对象并实例化
            camera.connectCamera("23176929");//连接相机,传入相机序列号123456
            camera.startCamera();//开启相机采集
            camera.setExposureTime(10000);//设置曝光时间为10ms
            camera.softTrigger();//发送软触发采集图像
            HImage image = camera.ReadBuffer();//获取采集到且转换后的图像
            camera.stopCamera();//停止相机采集
}

上面的代码就是怎么连接相机,设置了曝光值,并且读取图像。
注意这里:

camera.connectCamera("23176929");//连接相机,传入相机序列号123456

这里我填入的是一个Basler相机的序列号,只有填入这序列号,SDK才能把余下的功能实现。
在执行下面的代码时候,

                try
                {
                    if (allCameras[i][CameraInfoKey.SerialNumber] == id)
                    {
                        //如果当前相机信息中序列号是指定的序列号,则实例化相机类
                        myCamera = new Camera(allCameras[i]);
                        myCamera.Open();//打开相机
                        return 0;
                    }
                    continue;
                }
                catch(Exception e)
                {
                    System.Console.WriteLine(e.ToString());
                    MessageBox.Show(e.ToString());
                    return -1;
                }

执行myCamera.Open()一直报错,经查是因为我们这个软件已经用了halcon的C#代码来从相机捕获图像流,也就是说相机已经是打开了,所以不能再次打开,所以会报错。
当我们把halcon的相关代码去掉,这时能够Open,并且也能设置曝光值了。
好在,我的一个同事对Halcon比较熟悉,索性就用Halcon的代码把曝光值实现了。
在这里插入图片描述

public class ImageGrabber
    {
        private HFramegrabber _grabber;
        private bool _grabberSwitch;
        private List<IReceiveImage> _receivers;

        private readonly Task _tGrab;
        private readonly CancellationTokenSource _tGrabToken;

        public ImageGrabber()
        {
            _receivers = new List<IReceiveImage>();
            // 开启采图线程
            _grabberSwitch = false;
            _tGrabToken = new CancellationTokenSource();
            _tGrab = Task.Run(GrabImage, _tGrabToken.Token);   
        }
        ...
        public void SetExposure(double value)
        {
            _grabber.SetFramegrabberParam("ExposureTimeAbs", value);
        }

这样也能实现调整Basler相机的曝光值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值