Basler相机拍照

目录

一、Basler软件安装

二、winform界面设计

三、程序代码


一、Basler软件安装

机器视觉软件及工业相机软件下载 - pylon, ToF 等 | Basler (baslerweb.com)icon-default.png?t=N7T8https://www.baslerweb.com/cn/sales-support/downloads/software-downloads/1)根据操作系统选择对应的pylon软件下载

2)打开安装包,选择Developer,Next

3)选择相机连接方式 ,本次开发过程使用网线连接,所以选用GigE

4)安装完成后,在你的安装路径下找到.\Basler\pylon 6\Development\Assemblies\Basler.Pylon,其中有32位和64位的动态链接库,在创建项目后引用Basler.dll

PS:在安装中遇到了一个错误代码80070643,下载Pylon5,Pylon6都是同样的错误代码,最终解决办法是重装系统。QAQ

如欲安装失败,参考该文章

为什么出现 Baslerpylon安装错误如何解决?(8页)-原创力文档 (book118.com)icon-default.png?t=N7T8https://max.book118.com/html/2020/0703/8044045033002122.shtm二、winform界面设计

需求

1)显示相机基本信息

2)调节曝光和增益

3)设置软触发和硬触发

4)单张采集和连续采集

5)显示采集图像的数量

6)保存采集到的图像

根据需求分别使用了以下控件

Label显示文本信息
Button控制
PictureBox显示图像
TextBox显示获取的信息
GroupBox将控件归为一类
TrackBar滑动调节数值
RadioButton单选按钮
CheckBox复选框
StatusStrip状态栏控件

三、程序代码

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 Matrox.MatroxImagingLibrary;

namespace BaslerAndMil
{
    public partial class Form1 : Form
    {
        BaslerCam mCamera1;

        long count1 = 0;

        private static readonly int CONTOUR_DRAW_COLOR = MIL.M_COLOR_GREEN;
        private static readonly int CONTOUR_LABEL_COLOR = MIL.M_COLOR_RED;

        private MIL_ID MilApplication = MIL.M_NULL;
        private MIL_ID MilSystem = MIL.M_NULL;
        private MIL_ID MilDisp1 = MIL.M_NULL;
        private MIL_ID MilImageBuf1 = MIL.M_NULL;
        private MIL_ID GraphicList = MIL.M_NULL;
        private MIL_ID MilEdgeContext = MIL.M_NULL;
        private MIL_ID MilEdgeResult = MIL.M_NULL;
        double EdgeDrawColor = CONTOUR_DRAW_COLOR;
        double LabelDrawColor = CONTOUR_LABEL_COLOR;

        /// <summary>
        /// 相机1显示图像自定义委托
        /// </summary>
        /// <param name="time">采集图像时间</param>
        public delegate void delegateDisplayImage();

        public Form1()
        {
            InitializeComponent();
            // 分配MIL系统资源
            MIL.MappAllocDefault(MIL.M_DEFAULT, ref MilApplication, ref MilSystem, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL);
            MIL.MdispAlloc(MilSystem, MIL.M_DEFAULT, "M_DEFAULT", MIL.M_DEFAULT, ref MilDisp1);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            mCamera1 = new BaslerCam("c1");                           // 实例化UserID为"c1"的相机
            if (mCamera1.OpenCam() == true)                           // 打开并初始化相机
            {
                mCamera1.SetHeartBeatTime(10000);                     // 设置相机1心跳时间
                mCamera1.eventComputerGrabTime += computeGrabTime1;    // 注册计算采集图像时间回调函数
                mCamera1.eventProcessImage += processImage1;         // 注册MIL显示回调函数

                textCamModel.Text = mCamera1.strModelName;
                textSerialNumber.Text = mCamera1.strSerialNumber;
                textUserID.Text = mCamera1.strUserID;
                //textIP.Text = mCamera1.strModeIP;
                tkbExposure1.Minimum = (int)mCamera1.minExposureTime;
                tkbExposure1.Maximum = (int)mCamera1.maxExposureTime;
                tkbGain1.Minimum = (int)mCamera1.minGain;
                tkbGain1.Maximum = (int)mCamera1.maxGain;

                //rdbFreerun1.PerformClick();                           // 默认按下Freerun按钮
            }
            else
            {
                SetBottonEnable1(false, false, false);
            }
            timer1.Start();
        }

        // 计算相机1采集图像时间
        private void computeGrabTime1(long time)
        {
            ++count1;
            ImageNum.Text = "[  Count1 : " + count1 + "  ]";

            TIme.Text = "[  Time1 : " + time + "  ]";
        }

        //图像显示窗口
        private void dispSelectWindow1()
        {
            MIL.MdispSelectWindow(MilDisp1, MilImageBuf1, this.panel1.Handle);
            MIL.MdispControl(MilDisp1, MIL.M_SCALE_DISPLAY, MIL.M_ENABLE);
        }

        // 相机1 MIL窗体显示图像
        private void processImage1(Boolean isColor, int width, int height, byte[] imgData)
        {
            if (isColor == false)
            {
                // 分配MIL图像buffer
                if (MilImageBuf1 == MIL.M_NULL)
                {
                    MIL.MbufAlloc2d(MilSystem,
                          width,
                          height,
                          8 + MIL.M_UNSIGNED,
                          MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP,
                          ref MilImageBuf1);
                }

                // 转MIL黑白图像格式
                MIL.MbufPut(MilImageBuf1, imgData);
            }
            else
            {
                // 分配MIL图像buffer
                if (MilImageBuf1 == MIL.M_NULL)
                {
                    MIL.MbufAllocColor(MilSystem,
                       3,
                       width,
                       height,
                       8 + MIL.M_UNSIGNED,
                       MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP,
                       ref MilImageBuf1);
                }

                // 转MIL彩色图像格式
                MIL.MbufPutColor(MilImageBuf1, MIL.M_PACKED + MIL.M_RGB24, MIL.M_ALL_BANDS, imgData);
            }

            // 设置MIL图像显示的窗体
            delegateDisplayImage dispCallback1 = new delegateDisplayImage(dispSelectWindow1);
            panel1.Invoke(dispCallback1);

            if (checkBoxSaveImg.Checked)
            {
                MIL.MbufSave("./Camera1/" + count1 + ".bmp", MilImageBuf1);

                //MIL.MbufExport("./Camera1/" + count1 + ".bmp", MIL.M_BMP, MilImageBuf1);
                
                //mCamera1.SaveImage("./Camera1/" + count1 + ".bmp", MilImageBuf1, 3840, 2748, false);
            }
        }
        // 相机1单张采集
        private void button3_Click(object sender, EventArgs e)
        {
            int clickTimes;
            object tag = this.button3.Tag;
            if (tag == null)
            {
                clickTimes = 0;
            }
            else
            {
                clickTimes = Convert.ToInt32(tag);
            }

            this.button3.Tag = ++clickTimes;
            if (clickTimes == 1)
            {
                mCamera1.GrabOne();
                Console.WriteLine(clickTimes);
            }
            else if (clickTimes > 1)
            {
                mCamera1.GrabOne();
                EdgeFind();
                Console.WriteLine(clickTimes);
            }
        }

        //相机1连续采集
        private void button1_Click(object sender, EventArgs e)
        {
            if (mCamera1.StartGrabbing())
            {
                count1 = 0;
                ImageNum.Text = "[  Count1 : " + count1 + "  ]";

                SetBottonEnable1(false, true, false);
            }
        }

        //相机1停止采集
        private void button2_Click(object sender, EventArgs e)
        {
            mCamera1.StopGrabbing();
            SetBottonEnable1(true, false, true);
        }
        
        // 设置相机1为Freerun模式
        private void rdbFreerun1_CheckedChanged(object sender, EventArgs e)
        {
            mCamera1.SetFreerun();
            button4.Enabled = false;
        }
        
        // 设置相机1为软触发模式
        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            mCamera1.SetSoftwareTrigger();
            button4.Enabled = true;
        }
        
        // 设置相机1为硬触发模式
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            mCamera1.SetExternTrigger();
            button4.Enabled = false;
        }
        
        // 执行相机1软触发命令
        private void button4_Click(object sender, EventArgs e)
        {
            mCamera1.SendSoftwareExecute();
        }

        //调节曝光值
        private void tkbExposure1_Scroll(object sender, EventArgs e)
        {
            int value = tkbExposure1.Value;
            mCamera1.SetExposureTime(value);
            textBox5.Text = Convert.ToString(value);
        }

        //调节增益值
        private void tkbGain1_Scroll(object sender, EventArgs e)
        {
            int value = tkbGain1.Value;
            mCamera1.SetGain(value);
            textBox6.Text = Convert.ToString(value);
        }

        //改变曝光值
        private void txtBExposure1_TextChanged(object sender, EventArgs e)
        {
            int value = 0;
            int.TryParse(textBox5.Text, out value);
            mCamera1.SetExposureTime(value);
        }

        //改变增益值
        private void txtBGain1_TextChanged(object sender, EventArgs e)
        {
            int value = 0;
            int.TryParse(textBox6.Text, out value);
            mCamera1.SetGain(value);
        }

        private void SetBottonEnable1(bool startEnable, bool stopEnable, bool singleEnable)
        {
            button1.Enabled = startEnable;
            button2.Enabled = stopEnable;
            button3.Enabled = singleEnable;
        }

        //异常弹出窗口
        private void ShowException(Exception exception)
        {
            MessageBox.Show("Exception caught:\n" + exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        //显示当前时间
        private void timer1_Tick(object sender, EventArgs e)
        {
            statusStrip1.LayoutStyle = ToolStripLayoutStyle.HorizontalStackWithOverflow;
            toolStripStatusLabel1.Alignment = ToolStripItemAlignment.Right;
            toolStripStatusLabel1.Text = System.DateTime.Now.ToString();
        }

        //窗口关闭时释放资源
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (GraphicList == MIL.M_NULL)
            {
                mCamera1.StopGrabbing();
                mCamera1.CloseCam();
                ClearBufferNoEdge();
            }
            else
            {
                mCamera1.StopGrabbing();
                mCamera1.CloseCam();
                ClearBufferEdge();
            }
        }

        //窗口关闭强制退出程序
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Environment.Exit(0);
        }

        private void ClearBufferNoEdge()
        {
            //MIL.MgraFree(GraphicList);
            //MIL.MedgeFree(MilEdgeContext);
            //MIL.MedgeFree(MilEdgeResult);
            MIL.MbufFree(MilImageBuf1);
            MIL.MdispFree(MilDisp1);
            MIL.MsysFree(MilSystem);
            MIL.MappFreeDefault(MilApplication, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL);
        }

        private void ClearBufferEdge()
        {
            //MIL.MgraFree(GraphicList);
            //MIL.MedgeFree(MilEdgeContext);
            //MIL.MedgeFree(MilEdgeResult);
            //MIL.MbufFree(MilImageBuf1);
            //MIL.MdispFree(MilDisp1);
            //MIL.MsysFree(MilSystem);
            //MIL.MappFreeDefault(MilApplication, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL);

            //释放内存顺序不影响程序运行
            //MIL.MgraFree(GraphicList);
            //MIL.MbufFree(MilImage);
            //MIL.MmodFree(MilSearchContext);
            //MIL.MmodFree(MilResult);
            MIL.MgraFree(GraphicList);
            MIL.MbufFree(MilImageBuf1);
            MIL.MedgeFree(MilEdgeContext);
            MIL.MedgeFree(MilEdgeResult);
            MIL.MappFreeDefault(MilApplication, MilSystem, MilDisp1, MIL.M_NULL, MIL.M_NULL);
        }

        private void EdgeFind()
        {
            MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, ref GraphicList);

            MIL.MdispControl(MilDisp1, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, GraphicList);

            MIL.MedgeAlloc(MilSystem, MIL.M_CONTOUR, MIL.M_DEFAULT, ref MilEdgeContext);

            MIL.MedgeAllocResult(MilSystem, MIL.M_DEFAULT, ref MilEdgeResult);

            MIL.MedgeControl(MilEdgeContext, MIL.M_CIRCLE_FIT, MIL.M_ENABLE);

            MIL.MedgeCalculate(MilEdgeContext, MilImageBuf1, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MilEdgeResult, MIL.M_DEFAULT);

            MIL.MedgeSelect(MilEdgeResult, MIL.M_EXCLUDE, MIL.M_CIRCLE_FIT_RADIUS, MIL.M_LESS, 6000, MIL.M_NULL);

            MIL.MgraColor(MIL.M_DEFAULT, EdgeDrawColor);

            MIL.MedgeDraw(MIL.M_DEFAULT, MilEdgeResult, GraphicList, MIL.M_DRAW_CIRCLE_FIT, MIL.M_DEFAULT, MIL.M_DEFAULT);
        }

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Basler相机是一种高质量的工业相机,常用于图像采集。它以瑞士Basler公司命名,具有高分辨率、高帧率和高灵敏度的特点。它能够在极短的时间内采集大量的图像数据。 Basler相机的采集过程类似于摄影,通过镜头对目标物体进行成像,并将所获得的图像数据转换为数字信号。相机的传感器负责将光线转化为电信号,并进行采集和处理。 Basler相机的采集质量与其传感器的像素数有着直接关系。像素数越高,图像的细节和清晰度就越好。由于Basler相机采用了先进的CMOS技术,因此在采集过程中产生的噪声较少,图像质量更加清晰。 为了取得准确和稳定的图像,Basler相机还可以进行自动曝光和自动对焦。自动曝光功能能够根据光线的强弱自动调整曝光时间,确保图像亮度适合观察和处理。自动对焦功能则能够根据目标物体的距离自动调整镜头的焦距,确保图像的清晰度和准确度。 在采集过程中,Basler相机还可以提供多种接口选项,如GigE、USB和Camera Link等,以满足不同应用的需求。相机还可以通过相关软件进行图像处理和分析,以提取目标物体的特征信息。 总的来说,Basler相机采集了高质量的图像数据,具有高分辨率、高帧率和高灵敏度的特点,并通过自动曝光和自动对焦等功能,保证了图像的清晰度和准确度。它可以应用于各种领域,如工业检测、医学影像和科学研究等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值